Intereting Posts
выдержка отображает один и тот же текст Могу ли я подключиться к кнопке «Вставить / Редактировать» в TinyMCE, чтобы использовать Shortlink For Post? Устранить параметры из перенаправления Одно меню пейджера не работает на странице сведений Почему 404 не запускают мой шаблон 404.php? Плохая производительность при многопользовательской установке Заказать результаты WP_Query по значению мета-ключа в пользовательском запросе Где я могу найти список крючков WordPress? Значение по умолчанию wp_customize_image_control Обслуживание файлов cookie из другого домена или поддомена Категории list loop – добавить разделитель каждые 3 категории Проверить возвращаемое значение get_posts Хотите добавить свой пользовательский запрос подготовки, но add_filter не запускается Действительно простой запрос, дающий ошибку в синтаксисе SQL Ссылка, которая ссылается на элемент меню с динамически созданным URL-адресом

Проблема с meta_query

У меня есть meta_query, который работает, когда это выглядит так:

$args = array( 'number' => $users_per_page, 'offset' => $offset , 'orderby' => 'registered', 'order' => 'DESC', 'meta_query' => array( 'relation' => 'OR', array( 'relation' => 'AND', array( 'key' => 'referrer', 'value' => $user_ID, 'compare' => '=' ), array( 'key' => 'view_type', 'value' => 'invoice', 'compare' => '=' ), ), array( 'relation' => 'AND', array( 'key' => 'pass_up', 'value' => $user_ID, 'compare' => '=' ), array( 'key' => 'view_type', 'value' => 'invoice', 'compare' => '=' ), ), ), ); 

Как только я добавляю дополнительный запрос, тайм-аут запроса и разбивает страницу, а вверху – всего 5 пользователей в базе данных.

Этот код ниже не работает почему?

 $args = array( 'number' => $users_per_page, 'offset' => $offset , 'orderby' => 'registered', 'order' => 'DESC', 'meta_query' => array( 'relation' => 'OR', array( 'relation' => 'AND', array( 'key' => 'referrer', 'value' => $user_ID, 'compare' => '=' ), array( 'key' => 'view_type', 'value' => 'invoice', 'compare' => '=' ), array( 'key' => 'pass_up', 'value' => '$user_ID', 'compare' => '!=' ), ), array( 'relation' => 'AND', array( 'key' => 'pass_up', 'value' => $user_ID, 'compare' => '=' ), array( 'key' => 'view_type', 'value' => 'invoice', 'compare' => '=' ), ), ), ); 

Solutions Collecting From Web of "Проблема с meta_query"

Мета-запросы не предназначены для фильтрации сообщений. Вы можете использовать их таким образом, но база данных не оптимизирована для него. Для масштабирования и производительности немного хуже, чем мета-запросов:

  • Удаленные запросы на другие серверы
  • Изменение и масштабирование изображений
  • Queruing за то, что вы не хотите (например, покажите мне все сообщения, но не сообщения с этим мета-ключом)

Разве я не могу просто это сделать?

Да и нет…

Кэширование улучшит наилучший результат, но вам все равно придется запускать запрос хотя бы один раз. В сочетании с проблемами времени ваша проблема будет не такой большой, но у вас все еще будет проблема.

Если вы делаете кеширование результатов, кешируете их в переходный период с большим сроком службы и кешируете идентификаторы сообщений запроса, а затем используете их в новом запросе, если вы кешируете сам объект запроса, у вас все еще будут запросы (WP_Query primes внутренние запросы сохранения кэша, это не произойдет, если вы кешируете объект)

Все это не имеет значения, хотя если ваши запросы слишком медленны, чтобы завершить, они никогда не закончатся вовремя, чтобы кэшироваться

Могу ли я настроить базу данных?

Да и нет..

Вы можете добавить индекс в метатеку сообщений, но это не является истинным исправлением, потому что:

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

Итак, как мне фильтровать сообщения?

Таксономии !!

Если мета-запросы были быстрыми, мы использовали бы их для категорий и тегов, но вместо этого они выполнялись в качестве таксономий. Вы можете добавить свои собственные таксономии, чтобы сделать это, и увидеть значительное ускорение скорости.

К счастью, таксономические запросы имеют почти идентичный синтаксис мета-запросов через tax_query . Вы также получаете бесплатный пользовательский интерфейс администратора, шаблоны тем ( taxonomy.php т. Д.) И переписывание URL. Вы также получаете бесплатный экран администратора, в котором перечислены все ваши условия, количество сообщений, которые у них есть, и возможность удалять / добавлять / редактировать их с описаниями и термином meta.

Если вы хотите, вы можете отключить пользовательский интерфейс публикации и вставить свой собственный, а также множество других опций. Вы также можете зарегистрировать таксономию, которая не имеет никакого пользовательского интерфейса. Я нахожу, что они могут быть полезны для сопоставления вещей друг другу, например, используя идентификатор сообщения, как slug / name для термина.

Для регистрации таксономии используйте register_taxonomy .

Вот несколько полезных подстановок:

  • get_post_meta -> wp_get_post_terms
  • add_post_meta update_post_meta => wp_set_post_terms

Есть также:

  • get_terms

Бонусная оптимизация

Даже с таксономиями это не лучший запрос для запуска. У вас слишком много требований!

Поэтому вместо этого добавьте крючок, чтобы сохранить сообщение, и выполните проверку на сохранение. Если сообщение соответствует любому условию, установите дополнительный термин, например $user_id.'appear-on-invoice-page' . Теперь ваш запрос может найти одно значение.

Дополнительная бонусная оптимизация

Я заметил ваш счет view-type счета-фактуры, это говорит о том, что один тип сообщения выполняет работу нескольких. Подумайте, используя register_post_type чтобы создать новый почтовый тип с именем invoice . Затем вы можете использовать 'post_type' => 'invoice' в своем запросе, уменьшив вдвое сложность вашего запроса. Это также дает вам почтовые архивы, дополнительный параметр меню в вашей области администрирования для счетов-фактур и множество других преимуществ (все из которых можно включить или выключить при вызове register_post_type .

Как только все это будет сделано, ваш запрос может выглядеть так:

 $args = array( 'number' => $users_per_page, 'offset' => $offset , 'orderby' => 'registered', 'order' => 'DESC', 'post_type' => 'invoice', 'tax_query' => array( 'relation' => 'OR', array( 'taxonomy' => 'invoice_referrer', // suggested name for your taxonomy 'terms' => $user_id ), array( 'taxonomy' => 'invoice_pass_up', 'terms' => $user_id ) ) ); 

Окончательная заметка о разбиении на страницы

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

Это похоже на то, чтобы заказать дорогой стейк, ожидая 30 минут, затем выбросив его и заказывая простой прием пищи. Это простое питание будет очень дорогостоящим и займет много времени. Не было бы проще просто спросить, чего вы хотели?

Подумайте об использовании фильтра pre_get_posts для изменения основного запроса вместо дополнительной скорости. Это может даже позволить вам использовать архив типов сообщений счета-фактуры, указав URL-адрес, выделенный шаблон ( archive-invoice.php ), и все, что вам нужно будет сделать, это установить параметры tax_query , чтобы пользователи могли видеть только те счета-фактуры, которые имеют отношение к себе , Параметры разбивки на страницы можно удалить, и ваш цикл post будет стандартным циклом сообщений без специального объекта WP_Query .

Я бы рекомендовал посмотреть один из многих замечательных вопросов и ответов на этом сайте, в которых подробно описывается, как это сделать