Чтобы выводить данные о просмотрах за период (день, неделю, месяц, год), необходимо хранить количество просмотров в привязке к периоду. Тогда можно делать соответствующие выборки из базы данных. Поэтому плагины, которые хранят данные о просмотрах станицы в виде их суммы в одном мета-поле, не подходят.
Если наименьший период времени, за который требуется сделать выборку равен одному дню, для хранения результатов подойдёт такая таблица:
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', ]);
Или как то ещё.