single.php выполняется дважды WordPress

Ильдар Сарибжанов | 04.10.2013

Как была обнаружена проблема (Кому некуда спешить)

Эта часть не обязательна, для решения проблемы переходите к разделу «Как лечить»

Поскольку WordPress является изначально блоговым движком, то, собственно, блог все-таки является приоритетным направлением, по крайней мере с точки зрения конечного пользователя. А во многих блогах есть такая замечательная штука как подсчет просмотра статьи. Но как-то так сложилось, что в стандартном функционале wordpress этой штуки нет, что странно. Нашел на просторах великого Интернета нужные куски кода, ничего экстраординарного, в конце дам код, но есть одно НО.

И вот как оно звучит: мой счетчик при каждом заходе на страницу записи увеличивался на 2… И тут началась работа мысли. Вариантов-то не много, либо код не правильный, но там нечему быть неправильным, либо функция исполняется дважды. Как логично предположить, это значит что функция увеличения счетчика отрабатывает дважды за один заход. Мозг говорит: «я знаю где она точно исполняется, по крайней мере один раз, надо эту строку удалить». Результат — счетчик не увеличивается. Вернул строку — снова 2 раза.

И тут в моей голове всплывают некоторые воспоминания, что где-то я уже видел проблему про двойное исполнение single.php, быстрый просмотр по закладкам и в поисковике и вот она. Я честно пытался применить предложенное там решение, но либо лыжи не едут, либо я что-то не так что-то делаю. Как я уже говорил в одной из своих публикаций: «Взять готовое — не наш метод», ну и что, что я вспомнил только после того как готовое не заработало. В итоге родилось свое решение, не зря же я ИНЖЕНЕР, так в дипломе написано.

Как лечить

Если вкратце, то вставить вот этот код в файл function.php вашей темы:

add_action('wp_head','auto_set_count_view');
function auto_set_count_view(){
	if( is_single() || is_page() ){
		f( !isset($_COOKIE['postviev']) ){
			set_post_views( get_the_ID() );
		};
	};
};

// Для одиночной страницы, чтобы счетчик не увеличивался дважды
function set_count_cookies(){	
	setcookie ("postviev", 'stop',time()+2);
};

add_action('init','set_count_cookies');

Все просто. При первом исполнении файла single.php устанавливаем куки, с временем жизни 2 секунды. Так как я еще не встречал людей, которые быстрее двух секунд переключают страницы сайта, то проблем потери не должно быть. В это же первое исполнение увеличиваем счетчик просмотра на единицу. Когда single.php будет выполнятся второй раз, то наш куки будет уже установлен и счетчик не увеличится. 

А как посчитать количество посещений?

Как и обещал код увеличения счетчика и вывода

/* Обновить количество просмотров статьи */
function set_post_views($postID) {	
	setcookie ("TestCookie", 'asdasda',time()+3600);	
	$count_key = 'post_views_count';	
	$count = get_post_meta($postID, $count_key, true);	
	if($count == ''){
		$count = 0;	
	}else{
		$count++;
	}	

	update_post_meta($postID, $count_key, $count);
};

/* Получить количество просмотров статьи */
function get_post_add_views($postID){
	$count_key = 'post_views_count';
	$count = get_post_meta($postID, $count_key, true);	
	if($count == ''){
		update_post_meta($postID, $count_key, $count);
		return "0";	
	}
	return $count;
}

Вывод вставляете в шаблон в то место, где надо вывести количество просмотров.