Лучший способ хранить ежедневные просмотры сообщений?

Я хочу отслеживать, сколько просмотров было опубликовано на каждый день. Так что я могу получить из этого все интересные тенденции. Например, большинство из них посещают последние три дня.

Но каков наилучший способ хранения этих данных? Большинство руководств по поиску google – это просто сохранение общих просмотров. Не в день. Если бы я сохранил дневные представления таким же образом, я бы, скорее всего, сделал мета-сохранение следующим образом:

update_post_meta($post_id, "views_$year-$month-$day", $views + 1); 

Но я не уверен, что это лучший способ, когда я легко хочу получить разные результаты статистики из базы данных? Похоже, это будет много ненужных больших запросов к базе данных. И эти метаданные WP post сделаны для хранения других видов данных.

Проще говоря, вы этого не сделаете , и вы не должны

Проблемы

Условия гонки Сделать данные супер ненадежными

Обновление метаданных, параметров, терминов и т. Д. Не является атомной операцией. Вам нужно получить счетчик просмотров, добавить 1 к нему, а затем отправить его обратно в базу данных.

Во время этого процесса происходит другая загрузка страницы, что делает то же самое, что приводит к следующей ситуации:

  • пользователь 1: get_post_meta 5!
  • пользователь 2: get_post_meta 5!
  • пользователь 1: добавляет 1, 6!
  • пользователь 2: добавляет 1, 6!
  • пользователь 1: сохраняет update_post_meta, 6 просмотров!
  • пользователь 2: сохраняет update_post_meta, 6 просмотров!

Теперь ваш счетчик говорит 6, когда он должен сказать 7.

Огромные эксплуатационные расходы

Запись базы данных намного дороже, чем чтение, и эта система включает в себя запись базы данных при каждой загрузке страницы. Это не будет масштабироваться и будет иметь значительные проблемы с производительностью и скоростью.

Итак, как мне отслеживать просмотры страниц?

Внешние службы и программное обеспечение. Такие системы должны быть построены определенным образом, чтобы они предоставляли надежную информацию, не будучи слишком медленной. Это непростая задача.

Поэтому вместо этого используйте стороннюю услугу и регулярно извлекайте эту информацию. Вы можете сделать новый запрос каждый раз, когда вы просматриваете страницу, чтобы получить 100% точные данные, но это будет еще медленнее, вы не сможете кэшировать страницы, а время загрузки может быть выше 10 секунд, что ужасно для SEO и UX.

На моем собственном сайте я извлекаю данные Google Analytics за каждый час для 10 самых популярных сообщений, 10 последних и 10 сообщений, которые не были проверены в последнее время (я сохраняю отметку времени, когда они были в последний раз проверены, и используйте 10 самые старые временные метки)

Если вы хотите сохранить данные за определенный период времени, вы можете использовать API Transients . Но этот API хорош для небольшого объема данных, таких как параметры темы или аналогичные данные.

То, что вы можете сделать, – это нормально хранить сообщения, а затем запускать задание cron каждый день и очищать представления. Давайте рассмотрим простой пример.

 // You update the view counts by using post meta update_post_meta( $post_id, "view_count", $views + 1 ); // Now, let's run a task each day at 00:00 and clear these counts. // If the cron is not scheduled, schedule it for 00:00 if ( ! wp_next_scheduled( 'clear-post-counts' ) ) { wp_schedule_event( strtotime( '00:00:00' ), 'daily', 'clear-post-counts' ); } // Every time this action hook is triggered, the // callback function is run to clear the meta data add_action('clear-post-counts', 'clear_post_counts'); function clear_post_counts(){ // Get a list of all posts $posts = get_posts(); // For each post, set the post views to 0 foreach( $posts as $post ) { update_post_meta( $post->ID, "view_count", 0); } } 

Код является лишь примером того, с чего начать. Вы можете настроить его в соответствии с вашими конкретными потребностями.