Чтобы выводить данные о просмотрах за период (день, неделю, месяц, год), необходимо хранить количество просмотров в привязке к периоду. Тогда можно делать соответствующие выборки из базы данных. Поэтому плагины, которые хранят данные о просмотрах станицы в виде их суммы в одном мета-поле, не подходят.
Если наименьший период времени, за который требуется сделать выборку равен одному дню, для хранения результатов подойдёт такая таблица:
CREATE TABLE IF NOT EXISTS `visits` ( `id` int(11) NOT NULL AUTO_INCREMENT, `page_id` int(11) UNSIGNED NOT NULL DEFAULT '0', `counter` int(11) UNSIGNED NOT NULL, `date` date NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
Для сбора данных, на мой взгляд, лучше всего вызывать функцию добавления данных через AJAX. В привязке к событию «document.ready». Можно также таймаут добавить и т.д.
<?php if ( is_singular() ) { ?>
<script>
jQuery(document).ready(function($) {
var data = {
action: 'add_view',
post_id: <?php echo $post->ID ?>,
};
jQuery.post( 'https://stebenkov.ru/wp-admin/admin-ajax.php', data, function(response) {
});
});
</script>
<?php } ?>
! В этом фрагменте нужно поменять имя домена.
В функции добавим просмотр в таблицу и посчитаем сумму за требуемые периоды. В этом примере посчитаем за последние 30 дней и за всё время. Результаты запишем в мета-поля страниц, чтобы легче делать сортировку функцией get_posts().
add_action('wp_ajax_add_view', 'add_view_callback');
add_action('wp_ajax_nopriv_add_view', 'add_view_callback');
function add_view_callback() {
$post_id = $_POST['post_id'];
global $wpdb;
/* Daily */
$views_today = $wpdb->get_row( "SELECT * FROM visits WHERE page_id = $post_id AND date = CURDATE()" );
if ( is_numeric($views_today->id) && $views_today->id > 0 ) {
$wpdb->update( 'visits',
[ 'counter' => $views_today->counter + 1 ],
[ 'id' => $views_today->id ]
);
} else {
$wpdb->insert( 'visits', [ 'page_id' => $post_id, 'counter' => 1, 'date' => date('Y-m-d') ] );
}
/* Last 30 days */
$date = date('Y-m-d', strtotime('-1 month')); // -7 days, -1 month, -1 year
$sum = $wpdb->get_results("SELECT SUM(counter) AS result FROM visits WHERE page_id = $post_id AND date > '$date'");
$result = $sum[0]->result;
update_post_meta( $post_id, 'views_30', $result );
/* Total */
$sum = $wpdb->get_results("SELECT SUM(counter) AS result FROM visits WHERE page_id = $post_id");
$result = $sum[0]->result;
update_post_meta( $post_id, 'views_total', $result );
wp_die();
}
Теперь, можно получить самое популярное из категории за период вот так:
$popular_posts = get_posts([ 'numberposts' => 10, 'post_status' => 'publish', 'post_type' => 'post', 'category' => 5, 'meta_key' => 'views_30', 'orderby' => 'meta_value_num', 'order' => 'DESC', ]);
Или как то ещё.
