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; }
Вывод вставляете в шаблон в то место, где надо вывести количество просмотров.