Подсчет посещений страниц WordPress без плагинов

# Подсчет посещений страниц на WordPress без плагинов

В детстве я разбирал луноходы, а теперь разбираю плагины для WordPress. На этот раз я работал с плагином WP-PostViews, который подсчитывает посещения постов и страниц в WordPress. Анализ был успешным: я удалил около 90% кода, так как он оказался ненужным для моей задачи.

> **Важно:** Этот код больше не поддерживается!

Я рекомендую использовать свой собственный плагин, который включает в себя:

- Более стабильные принципы подсчета посещений.
- Подсчет посещений для таксономий, главной страницы и архивов.
- График посещений (включая уникальные посещения).
- Минимальные объемы данных в базе данных (база данных не будет быстро расти, как в других плагинах).
- Процесс подсчета работает с помощью AJAX и очень быстрый — не нагружает среду WordPress.
- Разработан для работы с плагинами кэширования объектов.

Я всегда нуждался только в числе посещений страниц и постов. Это значит, что мне не нужно отображать посты по количеству просмотров. Более того, счетчик, реализованный в плагине, слаб для объективного подсчета посещений, а функции, предлагаемые плагином для отображения самых посещаемых статей и так далее, становятся бессмысленными. Число посещений, рассчитанное этим плагином, является лишь общей картиной посещений страницы.

Что касается отображения постов по количеству просмотров, это можно сделать с помощью функции WordPress get_posts().

### Почему я выбрал WP-PostViews?

Я выбрал WP-PostViews как эталон, потому что это один из самых простых плагинов своего рода. На его основе можно сравнить с более продвинутым плагином WP-PostViews Plus — он создает свою таблицу в базе данных и предлагает более мощный подсчет посещений (IP, браузер и т.д.). На мой взгляд, такая функциональность излишня. Мы не собираем статистику — для этого есть Google или Яндекс.

Если вы выбираете плагины для подсчета посещений по принципу простоты, то WP-PostViews, вероятно, лучший вариант. Однако у него есть недостатки: он предназначен для глобального трафика и не учитывает ботов Яндекса.

Плагин имеет настройки, где можно указать, какие посещения учитывать. Логика подсказывает, что посещения должны учитываться только для гостей (неавторизованных пользователей) и исключать поисковых роботов. Однако принцип исключения поисковых ботов в плагине реализован несколько неверно: он исключает посещения от указанных ботов, а если бот не указан, его будут учитывать как посетителя, что создает не объективный подсчет. Я решил подойти к этому иначе: не исключать тех, кто не должен учитываться, а включать тех, кто должен. Для этого я просто указал идентификаторы браузеров. На мой взгляд, лучше, чтобы счетчик считал строго, но было точно известно, что цифры оставлены реальными людьми, а не всяким "мусором" вроде поисковых ботов.

### Функция для подсчета посещений страниц на WordPress

Вот функция, которую я в итоге создал для подсчета посещений страниц:

```php
// Подсчет числа посещений страницы
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', // Ключ мета-поля поста, куда будет записано число просмотров
        'who_count' => 1, // Чьи посещения учитывать? 0 - Все. 1 - Только гости. 2 - Только зарегистрированные пользователи.
        'exclude_bots' => true, // Исключить ботов? 0 - нет, давайте их тоже будем считать. 1 - да, исключить из подсчета.
    ] );

    $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 вашей темы. А чтобы отобразить количество посещений, используйте следующий код:

Количество посещений: ID, 'views', true ); ?>

В этой функции есть настройки: название пользовательского поля, кого учитывать и нужно ли исключать ботов или нет.

Название ключа необходимо, чтобы его можно было заменить на другой плагин, который также использует пользовательские поля для записи посещений. Например, если был установлен плагин, который изменил пользовательское поле с именем 'post_meta_name', то, чтобы заменить его, нужно изменить переменную $meta_key в функции на 'post_meta_name', а при отображении количества просмотров заменить 'views' на:

Количество посещений: ID, 'post_meta_name', true ); ?>

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *