Intereting Posts
Как предотвратить автоматическое перенаправление? Лучше использовать архив типа post, шаблон страницы или короткий код для создания высококонфигурируемого CPT-архива? Пример Add_Filter для wp_get_attachment_link CSS для пункта меню, добавленного через functions.php Можно ли запросить несколько писем из фида? как экслибрировать термины таксономий и количества, by post_types? каждый (термин custom_post_type) имеет ваше собственное количество Как удалить конкретную мета-запись из поля «Пользовательские поля»? Paginated Комментарии «ответ» не работает! Как я могу создать двойной сбрасываемый метаболизм? Как правильно запросить admin-ajax.php, когда URL-адрес WordPress и URL-адрес сайта различны? Как изменить сетку галереи с 4 столбцов на 3 столбца? Загрузка веб-сайта в Host Использование Ajax в prev_posts_link и next_posts_link В цикле foreach, как настроить таргетинг на последний элемент цикла? Виджет Логический код для разных уровней членства PMP

Расширенный мета-запрос для большого веб-сайта календаря (12 k + сообщений) (175k + wp_postmeta rows)

Проблема

На сайте, который я построил, я решил использовать пользовательские поля вместо плагина календаря для организации своих сообщений в «календаре». Вначале это казалось самым логичным способом выполнить то, что мне было нужно. Однако с момента импорта всего контента все не получилось, как я ожидал. Мой «Дневной» вид занимает 2-4 секунды, чтобы загрузить ~ 60-100 предметов, а мой месяц занимает 15-22 секунды, чтобы загрузить ~ 900 предметов.

Каждое сообщение имеет поле event_date , которое хранится как YYYYmmdd . Некоторые должности имеют возможность повторять на фиксированной или бесконечной основе, как и обычные события календаря. Для этого я создал два поля, один из которых repeat с вариантами forever и until . Наряду с этим это поле для того, на каком промежутке оно повторяется как how_often . Значения для этого – Daily , Monthly , Weekly и Yearly . И последнее, но не менее важное: некоторые сообщения имеют end_date чтобы указать конец события.

Некоторые должности, основанные на другой таксономии, являются «автоматически повторяющимися», так сказать, повторяющимися на ежегодной основе.

Самый простой способ получить эти данные и отфильтровать их – использовать эту мета-игру:

 <?php $mq = ['meta_query' => [ 'relation' => 'OR', [ 'key' => 'event_date', 'value' => $date->format('md'), 'compare' => 'LIKE', 'type' => 'numeric' ], [ 'key' => 'how_often', 'value' => array('Daily', 'Monthly', 'Weekly'), 'compare' => 'IN' ] ] ] 

Он делает LIKE для месяца и дня, указанного в запрошенной дате, и другого OR для всех повторяющихся сообщений.

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

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

Вопросов

  1. Что еще я могу сделать с запросом, чтобы сделать как можно меньше работы, чтобы исключить «лишние» сообщения в PHP, которые запрашиваются, потому что мой запрос слишком широк.
  2. В течение месяца я показываю только категории сообщений, event_date, заголовок и общее количество сообщений в день. Возможно ли запрашивать только эти данные для ускорения запроса?
  3. Если все остальное не удается, то какой способ справиться с данным типом данных в WordPress? Я бы предпочел держаться подальше от плагинов календаря и каким-то образом использовать «Посты».

Спасибо за прочтение

Solutions Collecting From Web of "Расширенный мета-запрос для большого веб-сайта календаря (12 k + сообщений) (175k + wp_postmeta rows)"

Что еще я могу сделать с запросом, чтобы сделать как можно меньше работы, чтобы исключить «лишние» сообщения в PHP, которые запрашиваются, потому что мой запрос слишком широк.

Проблема в том, что мета-запросы медленны . Метаданные – это простая база данных типа value => value. Ключи индексируются, а значения – longtext . Вот и все. Нет типов данных. Никаких дополнительных индексов. Ничего. И не говоря уже о том, что каждое «правило» обойдется вам в JOIN .

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

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

Если вы можете изменить формат сохраненной даты на значение по умолчанию MySQL ( YYYY-MM-DD ), вы можете использовать функцию каста мета-запросов для сравнения дат:

 array( 'key' => 'event_date', 'type' => 'DATE', 'compare' => 'BETWEEN', 'value' => array( date( 'Ym-01', $time = current_time( 'timestamp' ) ), date( 'Ym-t', $time ), // Last day of current month ), ), 

Это может дать толчок, но никаких гарантий.

Если все остальное не удается, то какой способ справиться с данным типом данных в WordPress? Я бы предпочел держаться подальше от плагинов календаря и каким-то образом использовать «Посты».

Без сомнения, другой стол. Первичным индексом будет идентификатор сообщения, а затем последующие столбцы для хранения ваших данных произвольного события. Я не wiz на схеме db, вам лучше попросить совета, специфического для вашей проблемы, на другом StackExchange.

save_post к save_post для обновления таблицы и используйте потрясающую силу posts_clauses найденную в WP_Query::get_posts() для реализации ваших объединений и пользовательских запросов:

 function wpse_175152_posts_clauses( $clauses, $wp_query ) { $clauses[ 'where' ]; $clauses[ 'groupby' ]; $clauses[ 'join' ]; $clauses[ 'orderby' ]; $clauses[ 'distinct' ]; $clauses[ 'fields' ]; $clauses[ 'limits' ]; return $clauses; } add_filter( 'posts_clauses', 'wpse_175152_posts_clauses', 10, 2 );