Intereting Posts
jQuery и AJAX Не работает с элементом Select Form Использовать метаданные для переноса элементов самостоятельно Как запустить запрос mysql, когда администратор обновляет роль пользователя? Как добавить список в редактор TinyMCE? Избегайте или корректируйте комментарии / ограничения скорости и 429 ошибок Импорт (XML / WXR) не работает на некоторых сообщениях $ post-> ID отображает неправильный идентификатор Отображение 3 сообщений категории по-разному Разбиение страниц на бэкэнд плагина Добавить comment_meta в wp_comment_reply Как добавить элемент с меню walker сразу после начала тегов навигации? В панели управления администратора я могу выбрать, какие разделы будут отображаться? Как заставить php-скрипт работать только с wp-cron запрашивать только возвратные сообщения с уже установленным настраиваемым полем Иметь домашнюю страницу выглядят иначе, чем index.php без статической страницы

Каков наиболее эффективный способ запроса сообщений на основе посещений и даты текущего дня?

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

Это то, что я планирую сделать, пожалуйста, скажите мне, есть ли более эффективный способ сделать это.

  1. Сохраните каждое сообщение в метате, которое будет существовать только для текущего дня. У меня включен пакет Jetpack, поэтому я могу использовать его для получения просмотров для каждого сообщения.

  2. Запросить сообщения (с WP_query) по почте, содержащей посещения в течение дня.

  3. Применить фильтр по дате (для получения сообщений, которые имеют X дней). Поэтому я могу выбрать, насколько старые должности должны быть. Например, я могу показать самые популярные сообщения, которые не старше месяца. Сообщения для запроса более одного месяца не будут учитываться для запроса.

  4. Сохраните запрос в переходном режиме, который будет обновляться каждый час (так что запрос не будет вызываться каждый раз, когда я должен показывать популярные сообщения). Я хочу, чтобы это было каждый час, потому что я хочу показывать посетителям новый контент каждый час.

  5. На следующий день, когда сообщение будет посещено пользователем, метаданные будут удалены, а новый будет создан для текущего дня.

Примечание. У меня есть сотни тысяч сообщений.

Если мне что-то не хватает, сообщите мне.

Solutions Collecting From Web of "Каков наиболее эффективный способ запроса сообщений на основе посещений и даты текущего дня?"

Я думаю, что вы можете улучшить производительность

  • сохраняя информацию о просмотре в одном единственном варианте вместо
  • применение даты фильтра при сохранении, а не при извлечении
  • создайте разметку и сохраните в переходном режиме вместо сохранения запроса (кэширование фрагментов)

Грубая реализация в классе

class PopularPosts { const OPT = 'myplugin_popular_posts'; /** * After checking post date to see if save or not, increment a counter in a option * as an array where keys are post ids and values number of views */ public function save(WP_Post $post) { if ( ! $this->shouldSave($post)) return; $opt = get_option(self::OPT, array()); if ( ! isset($opt[$post->ID]) ) { $opt[$post->ID] = 0; } $opt[$post->ID]++; update_option(self::OPT, $opt); } /** * Get markup from cache or rebuild it. * In latter case setup an action on shutdown to defer cache of the markup. * @return string */ public static function getMarkup() { $key = self::OPT . date('Yz'); // change everyday $cached = get_transient($key); if ( ! empty($cached)) return $cached; // if cache is available just output it $instance = new static; $markup = $instance->buildMarkup(); if (empty($markup)) return ''; // return without cache empty results add_action('shutdown', function() use($markup,$key) { set_transient($key, $markup, HOUR_IN_SECONDS); }); return $markup; } /** * Get popular posts and return proper markup * @return string */ public function buildMarkup() { $opt = get_option(self::OPT); if(empty($opt)) return; // nothing to get and show $posts = $this->getPosts($opt); // obtain posts $out = ''; $format = '<li><a href="%s">%s</a><span>(%d %s)</span></li>'; foreach($posts as $post) { $title = apply_filters('the_title', $post->post_title); $plink = get_permalink($post); $out .= sprintf($format, $plink, $title, $opt[$post->ID], __('views', 'txdmn')); } return '<ul class="popular_posts">' . $out . '</ul>'; } /** * Return true if the posts is not older than X days, where X is filterable * @return boolean */ private function shouldSave( WP_Post $post ) { $max_old = apply_filters( 'myplugin_popular_posts_max_days', 31 ); $ptime = DateTime::createFromFormat('Ymd H:i:s', $post->post_date); $now = new DateTime('now'); return (int) $now->diff($ptime)->days <= (int) $max_old; } /** * Return X popular posts, where X number is filterable * @return array */ private function getPosts($opt) { arsort($opt); // reverse order: more to less popular $num = apply_filters('myplugin_popular_posts_num', 5); $ids = array_keys(array_slice($opt, 0, $num)); return (array) get_posts(array('post__in' => $ids)); } } 

Применение

Чтобы обновить счетчик просмотров сообщений :

 add_action('shutdown', function() { if (is_single()) { // maybe check for post type using is_singular() $popularposts = new PopularPosts; $popularposts->save(get_queried_object()); } }); 

И чтобы показать разметку в ваших шаблонах:

 <?= PopularPosts::getMarkup() ?> 

Gotchas и возможные улучшения

Опция счетчика должна быть сброшена в evey day , код для этого здесь не указан , но должен быть довольно прост в реализации.

Используя lib, как WP-TLC-Transient, вы можете улучшить метод getMarkup с помощью мягкого истечения срока действия и обновления фона. Что-то вроде этого:

  public static function getMarkup() { $key = self::OPT . date('Yz'); // change everyday return tlc_transient( $key ) ->updates_with(array(new static, 'buildMarkup')) ->expires_in(HOUR_IN_SECONDS) ->get(); } 

Обратите внимание, что я не знаком с Jetpack, поэтому я не знаю, как получить статистику после него. Для простоты я использовал крючок на 'shutdown' чтобы просто увеличить счетчик в опции. Это не идеально, потому что таким образом счетчик увеличивается, даже если пользователь просто обновляет страницу … конечно, вы можете ее улучшить.

пожалуйста, обратите внимание

Код полностью не проверен .