Считаем количество посещений страниц на WordPress без плагинов
Помню в детстве луноходы разбирал, теперь разбираю плагины для WordPress На этот раз разбирался с WP-PostViews — плагином плагин для подсчета посещений постов/страниц в WordPress. Разбор удался на славу: выкинул около 90% кода, так как все это оказалось лишним для моей задачи.
Смотрите также: Функция вывода записей по количеству просмотров
Этот код больше не поддерживается!
Рекомендую свой плагин. В нём:
- Более стабильный принцип подсчета.
- Подсчет визитов для таксономий, главной, архивов.
- График посещений (в том числе уникальных).
- Минимум данных в БД (БД не будет расти как на дрожжах, как в других плагинах).
- Подсчет работает на аяксе и очень быстро - WP среда не подгружается.
- Рассчитан на работу с плагинами объектного кэширования.
Единственное, что мне всегда надо было от этого плагина — только число посещений страниц и записей. Имею ввиду, выводить записи по наибольшему посещению не приходилось. К тому же, счетчик, который реализован в плагине слабоват для объективного подсчета визитов и предлагаемые плагином функции вывода: самые посещаемые статьи и т.п. превращаются в какой-то бред. Число визитов, которые считает этот плагин — это лишь общее представление о посещении страницы.
Что касается упомянутого выше вывода постов по наибольшему посещению, то это можно сделать используя функцию WordPress get_posts().
Почему, как эталон я взял wp-postviews? Потому что, он один из самых простых в своем роде - для сравнения, альтернатива wp-postviews - плагин для WordPress WP-PostViews Plus - он более наворочен - создает свою таблицу в БД, более мощное вычисление о посетителе (IP, Браузер и т.п.). По-моему такой функционал это уже лишнее... Мы же не статистику собираем все-таки, для этого есть аналитика от Google или Яндекс.
Если выбирать плагины для подсчета посещений, по наибольшей простоте, то wp-postviews пожалуй самое оно... Однако он не без недостатков — минус он рассчитан на мировой трафик и не учитывает ботов Яндекса.
В плагине есть настройки, где можно указать чьи визиты считать, логика мне всегда подсказывала, что надо считать визиты только гостей (не залогиненных пользователей) и исключить поисковых роботов/ботов. Принцип отсева поисковых ботов и роботов в плагине реализован немного не правильно, потому что он исключает визиты указанных ботов, а если бот не указан в списке, то он будет считаться посетителем, что создает необъективность подсчета. Я решил подойти с другой стороны - не исключать, кого не надо считать, а включить, кого надо считать, для этого просто указал идентификаторы браузеров. По-моему лучше пусть счетчик будет считать строго, но точно будет известно, что цифры "оставлены" реальными людьми, а не всякой нечистью вроде поисковых ботов.
А вот и функция, которая у меня получилась - функция для подсчета посещений страниц на WordPress.
// Подсчет количества посещений страниц add_action( 'wp_head', 'kama_postviews' ); /** * @param array $args * * @return null */ function kama_postviews( $args = [] ){ global $user_ID, $post, $wpdb; if( ! $post || ! is_singular() ) return; $rg = (object) wp_parse_args( $args, [ // Ключ мета поля поста, куда будет записываться количество просмотров. 'meta_key' => 'views', // Чьи посещения считать? 0 - Всех. 1 - Только гостей. 2 - Только зарегистрированных пользователей. 'who_count' => 1, // Исключить ботов, роботов? 0 - нет, пусть тоже считаются. 1 - да, исключить из подсчета. 'exclude_bots' => true, ] ); $do_count = false; switch( $rg->who_count ){ case 0: $do_count = true; break; case 1: if( ! $user_ID ) $do_count = true; break; case 2: if( $user_ID ) $do_count = true; break; } if( $do_count && $rg->exclude_bots ){ $notbot = 'Mozilla|Opera'; // Chrome|Safari|Firefox|Netscape - все равны Mozilla $bot = 'Bot/|robot|Slurp/|yahoo'; if( ! preg_match( "/$notbot/i", $_SERVER['HTTP_USER_AGENT'] ) || preg_match( "~$bot~i", $_SERVER['HTTP_USER_AGENT'] ) ){ $do_count = false; } } if( $do_count ){ $up = $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->postmeta SET meta_value = (meta_value+1) WHERE post_id = %d AND meta_key = %s", $post->ID, $rg->meta_key ) ); if( ! $up ){ add_post_meta( $post->ID, $rg->meta_key, 1, true ); } wp_cache_delete( $post->ID, 'post_meta' ); } }
Как обычно, функцию вставляем в файл functions.php вашей темы (шаблона), а где нужно вывести число просмотров пишем так:
Просмотров: <?php echo get_post_meta( $post->ID, 'views', true ); ?>
Внутри функции есть её настройки: название ключа у произвольного поля, кого считать и исключить ботов или нет.
Название ключа нужно для того, чтобы можно было заменить, какой-нибудь другой плагин, который тоже использует произвольные поля для записи посещений. Например, если стоял плагин, который изменял произвольное поле с названием 'post_meta_name
', то чтобы его заменить нужно изменить на 'post_meta_name
' переменную $meta_key
в функции и заменить 'views
', при выводе числа посещений:
Просмотров: <?php echo get_post_meta( $post->ID, 'post_meta_name', true ); ?>