@Kypidon4ik
Фрилансер, Wordpress developer

Сильно не досчитывает кол-во просмотров у новостей функция, в чем может быть проблема и как ее решить?

Есть код который считает кол-во просмотров статей
function gt_get_post_view()
{
    $count = get_post_meta(get_the_ID(), 'post_views_count', true);
    return $count;
}

function gt_set_post_view()
{
    $key = 'post_views_count';
    $post_id = get_the_ID();
    $count = (int)get_post_meta($post_id, $key, true);
    $count++;
    update_post_meta($post_id, $key, $count);
}

function gt_posts_column_views($columns)
{
    $columns['post_views'] = 'Views';
    return $columns;
}

function gt_posts_custom_column_views($column)
{
    if ($column === 'post_views') {
        echo gt_get_post_view();
    }
}

add_filter('manage_posts_columns', 'gt_posts_column_views');
add_action('manage_posts_custom_column', 'gt_posts_custom_column_views');


Также есть вызов его в каждой новости (часть кода прикрипляю)
<div class="container main-container">
		<div class="content-wrapper">
			<div class="main-content" id="<?php echo $post->ID; ?>">
				<?php gt_set_post_view(); ?>
				<?php render_news_whole_post($post); ?>

Путем тестов выявил что он не все просмотры высчитывает и я не знаю почему (и очень таки даже много не досчитывает)
WP 6.1.1
Версия PHP 7.4.33 (Поддерживает 64-битные значения)
mysqli 5.7.35-38-log
На сайте стоит плагин кеширования
WP Fastest Cache Версия 1.1.0 автора Emre Vona
Также сайт проходит через Cloudflare (отключить его не могу, сразу же упадем)
Мне кажется что проблема в кеше, но не знаю как ее решить (возможно я ошибаюсь)
PS Если смотреть статистику через CF то там все в порядке , статистика +- адекватная
  • Вопрос задан
  • 73 просмотра
Решения вопроса 1
Stalker_RED
@Stalker_RED
Да, возможно get_post_meta() кешируется, лень смотреть код кеширующего плагина.

Еще один косяк:
$count++;
update_post_meta()


Представим, что был 1 просмотр, и потом еще 10 просмотров произошло одновременно. Десять раз был получен счетчик из базы (единица), увеличен (до двойки), и записан обратно, но в итоге получим двойку в БД, потому что на момент записи в переменной $count была двойка.

Фиксится и то и другое элементарно, вместо "прочитать-увеличить-записать" делайте просто update с инкрементом даже не запрашивая текущее значение счетчика из базы
UPDATE `myTable` SET `post_views`=`post_views`+1 WHERE `post_id`=42;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы