single.php выполняется дважды WordPress
Как была обнаружена проблема (Кому некуда спешить)
Эта часть не обязательна, для решения проблемы переходите к разделу «Как лечить»
Поскольку 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;
}
Вывод вставляете в шаблон в то место, где надо вывести количество просмотров.