Счётчик просмотров за период времени

Чтобы выводить данные о просмотрах за период (день, неделю, месяц, год), необходимо хранить количество просмотров в привязке к периоду. Тогда можно делать соответствующие выборки из базы данных. Поэтому плагины, которые хранят данные о просмотрах станицы в виде их суммы в одном мета-поле, не подходят.

Если наименьший период времени, за который требуется сделать выборку равен одному дню, для хранения результатов подойдёт такая таблица:

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',
]); 

Или как то ещё.

Оставьте комментарий