Учет просмотров и оценок постов — важный элемент для повышения вовлеченности пользователей и анализа популярности контента на сайте WordPress. В этой статье мы подробно рассмотрим, как реализовать счетчик просмотров и систему оценок постов без использования громоздких плагинов, а также с помощью полезных инструментов, которые помогут быстро и эффективно внедрить нужный функционал.
Как добавить счетчик просмотров постов в WordPress без плагинов
Для начала создадим простой и легковесный счетчик просмотров с использованием пользовательских полей (мета-полей). Такой способ подойдет, если вы хотите избежать лишних плагинов и контролировать код самостоятельно.
Шаг 1. Создаем функцию wpkey_add_post_views для увеличения счетчика
Добавьте следующий код в файл functions.php вашей темы или в свой собственный плагин:
function wpkey_add_post_views($postID) {
$count_key = 'wpkey_post_views_count';
$count = get_post_meta($postID, $count_key, true);
if($count=='') {
$count = 0;
delete_post_meta($postID, $count_key);
add_post_meta($postID, $count_key, '1');
} else {
$count++;
update_post_meta($postID, $count_key, $count);
}
}
Эта функция проверяет наличие мета-поля, в котором хранится количество просмотров, и увеличивает его на 1 при каждом вызове.
Шаг 2. Вызываем функцию при загрузке поста
Чтобы счетчик срабатывал только при просмотре одиночного поста, добавьте в functions.php:
function wpkey_track_post_views ($post_id) {
if (!is_single()) return;
if (empty ($post_id)) {
global $post;
$post_id = $post->ID;
}
wpkey_add_post_views($post_id);
}
add_action('wp_head', 'wpkey_track_post_views');
Таким образом, при загрузке страницы поста будет увеличиваться счетчик просмотров.
Шаг 3. Отображаем количество просмотров в шаблоне
Чтобы вывести количество просмотров в шаблоне (например, в single.php), используйте:
$views = get_post_meta(get_the_ID(), 'wpkey_post_views_count', true);
echo 'Просмотров: ' . ($views ? $views : '0');
Добавляем систему оценок (лайков и дизлайков) к постам WordPress
Теперь разберемся, как добавить пользователям возможность ставить оценки постам. Оптимально реализовать это через AJAX, чтобы не перезагружать страницу и улучшить UX.
Шаг 1. Добавляем HTML-кнопки для лайков и дизлайков
В шаблоне поста, например, single.php, вставьте следующий блок:
<div id="wpkey-rating" data-postid="<?php the_ID(); ?>">
<button id="wpkey-like">👍 <span id="wpkey-like-count">0</span></button>
<button id="wpkey-dislike">👎 <span id="wpkey-dislike-count">0</span></button>
</div>
Шаг 2. Регистрируем скрипт и локализуем данные
В functions.php добавьте:
function wpkey_enqueue_scripts() {
wp_enqueue_script('wpkey-rating-js', get_template_directory_uri() . '/js/wpkey-rating.js', array('jquery'), null, true);
wp_localize_script('wpkey-rating-js', 'wpkey_ajax_object', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('wpkey_rating_nonce')
));
}
add_action('wp_enqueue_scripts', 'wpkey_enqueue_scripts');
Шаг 3. Создаем обработчик AJAX запросов
Добавьте в functions.php:
function wpkey_handle_rating() {
check_ajax_referer('wpkey_rating_nonce', 'nonce');
$post_id = intval($_POST['post_id']);
$action_type = sanitize_text_field($_POST['type']); // like или dislike
if(!in_array($action_type, array('like', 'dislike')) || !$post_id) {
wp_send_json_error('Неверные данные');
}
$meta_key = 'wpkey_post_' . $action_type . '_count';
$count = get_post_meta($post_id, $meta_key, true);
if(!$count) $count = 0;
$count++;
update_post_meta($post_id, $meta_key, $count);
wp_send_json_success(array('count' => $count));
}
add_action('wp_ajax_wpkey_rating', 'wpkey_handle_rating');
add_action('wp_ajax_nopriv_wpkey_rating', 'wpkey_handle_rating');
Шаг 4. Создаем JavaScript для отправки запросов
Создайте файл js/wpkey-rating.js и вставьте туда:
jQuery(document).ready(function($) {
$('#wpkey-like, #wpkey-dislike').on('click', function() {
var type = $(this).attr('id') === 'wpkey-like' ? 'like' : 'dislike';
var post_id = $('#wpkey-rating').data('postid');
var data = {
action: 'wpkey_rating',
nonce: wpkey_ajax_object.nonce,
post_id: post_id,
type: type
};
$.post(wpkey_ajax_object.ajax_url, data, function(response) {
if(response.success) {
if(type === 'like') {
$('#wpkey-like-count').text(response.data.count);
} else {
$('#wpkey-dislike-count').text(response.data.count);
}
} else {
alert('Ошибка: ' + response.data);
}
});
});
});
Использование плагинов для расширения функционала счетчика и рейтинга
Если вы предпочитаете готовые решения, рассмотрите плагины, которые отлично работают с WordPress и легко настраиваются:
- Post Views Counter — легкий и гибкий плагин для подсчета просмотров постов. Позволяет выводить и сортировать по просмотрам.
- WP-PostRatings — классический плагин для системы оценок с поддержкой AJAX, несколькими стилями и настройками.
- Clearfy Pro — комплексный плагин оптимизации, который также включает расширенные возможности по управлению рейтингами и счетчиками.
Установка и настройка этих плагинов обычно не требует знаний программирования, но в некоторых случаях может понадобиться доработка шаблонов.
Советы по оптимизации и безопасности при реализации счетчиков и рейтингов
При создании кастомных решений важно помнить о нескольких моментах:
- Кэширование: Учитывайте, что кэширование страниц может влиять на точность счетчиков. Для корректной работы счетчиков просмотров обычно используют AJAX-запросы, чтобы обновлять данные динамически.
- Защита от накруток: Чтобы избежать искусственного увеличения просмотров или лайков, можно ограничить учет просмотров по IP или сессиям, а для рейтингов добавить проверку авторизации или куки.
- Производительность: Частое обновление мета-полей может нагружать базу данных. Рассмотрите возможность использования transient API для временного хранения данных и периодического обновления.
- Безопасность: Всегда проверяйте nonce и sanitize входящих данных в AJAX-обработчиках, чтобы предотвратить CSRF и XSS-атаки.
Пример ограничения учета просмотров по IP
Для простейшей защиты добавьте в функцию wpkey_add_post_views проверку по IP с использованием пользовательских сессий или куки. Например:
function wpkey_add_post_views($postID) {
$user_ip = $_SERVER['REMOTE_ADDR'];
$key = 'wpkey_viewed_' . $postID;
$viewed_ips = get_transient($key);
if(!is_array($viewed_ips)) $viewed_ips = array();
if(!in_array($user_ip, $viewed_ips)) {
$count_key = 'wpkey_post_views_count';
$count = get_post_meta($postID, $count_key, true);
if($count=='') {
$count = 0;
delete_post_meta($postID, $count_key);
add_post_meta($postID, $count_key, '1');
} else {
$count++;
update_post_meta($postID, $count_key, $count);
}
$viewed_ips[] = $user_ip;
set_transient($key, $viewed_ips, 12 * HOUR_IN_SECONDS);
}
}
Это позволит считать просмотры от одного IP не чаще одного раза в 12 часов.