Я вижу, что многие люди предпочитают использовать хук pre_get_posts вместо query_posts
Ура!
Так что pre_get_posts
фильтрует WP_Query
объект, что означает, что все, что вы можете сделать через query_posts()
вас, можно сделать через $query->set()
и $query->get()
. В частности, мы можем использовать meta_query
атрибут (см. Кодекс ):
$meta_query = array(
array(
'key'=>'featured',
'value'=>'yes',
'compare'=>'!=',
),
);
$query->set('meta_query',$meta_query);
Но .. это заменяет оригинальный «мета-запрос» (если он был). Поэтому, если вы не хотите полностью заменить исходный мета-запрос, я предлагаю:
//Get original meta query
$meta_query = $query->get('meta_query');
//Add our meta query to the original meta queries
$meta_query[] = array(
'key'=>'featured',
'value'=>'yes',
'compare'=>'!=',
);
$query->set('meta_query',$meta_query);
Таким образом, мы добавляем наш мета-запрос вместе с существующими мета-запросами.
Вы можете / не можете устанавливать relation
свойство $meta_query
для AND
или OR
(для возврата сообщений, которые удовлетворяют всем или хотя бы одному мета-запросам).
* Примечание: этот тип запроса возвращает сообщения с мета-ключом «Featured», но его значение не равно yes
. Он не будет включать посты, в которых метаданный ключ «Featured» не существует. Вы сможете сделать это в 3.5 .
Yes
иNo
варианты и «Нет» будет выбран по умолчанию. Когда я хочу добавить пост, я выберуYes
. Тем не менее, я хочу, чтобы последние 5 постов оставались в списке, а другие отображались в основном запросе. Я не хочу возвращаться и каждый раз менять выбор, поэтому мне нужно найти способ исключить только самые последние 5 сообщений. Я вижу много похожих вопросов на stackexchange, и должен быть простой способ управлять этими публикациями. (способ, который не влияет на общую производительность, не создает много запросов и не требует смешанных SQL-запросов)Yes
илиNo
значение для всех сообщений. Было бы здорово исключить те посты, в которых просто нетfeatured
ключа.Uncaught Error: [] operator not supported for strings
что вышла из строя на моем сайте после обновления до PHP 7, выдавая ошибку, поскольку оригиналmeta_query
возвращался как ноль. Вы можете обойти это, возвращаясь к пустому массиву, если ни один не существует, переключаясь$meta_query = $query->get('meta_query');
на$meta_query = ( is_array( $query->get('meta_query') ) ) ? $query->get('meta_query') : [];
.Я хочу опубликовать свое временное решение для избранных сообщений на случай, если некоторые люди могут использовать его. Я здесь не пользуюсь
pre_get_posts
крючком, но неquery_posts
тоже. Проблема в том, что мне нужно поиграть с основным запросом и выполнить часть SQL-запроса. Я был бы рад, если бы кто-нибудь из экспертов смог проверить код и сообщить, все ли в порядке и не вызовет ли это проблем с производительностью. Также будет хорошо, если у кого-то будет лучший подход и поделится им с нами.Создать запрос на популярные сообщения
Создайте основной запрос, исключите посты, в которых есть метаданный ключ, ограничьте исключение 5 последними постами и покажите все остальные.
источник
В ответ @Carlisle, если вы хотите исключить последние 5 постов, отмеченных как избранные, вы можете сделать следующее. Измените posts_per_page на то, сколько вы хотите исключить, а meta_query на то, как вы определяете избранную категорию.
источник