Условно запрашивать Пользовательские типы записей по Метам записей для Домашней страницы блога?
( Примечание модератора: Первоначальное название вопроса было: "Пользовательский запрос: Показать пользовательские типы сообщений плюс пользовательский тип сообщения с метой сообщения на главной странице блога")
Мне нужна помощь с пользовательским запросом. У меня есть три пользовательских типа сообщений: "Новости", " События", " Истории". На главной странице блога будут отображаться только Новости и события. Клиент может пометить историю как Новости, используя функции плагина Verve Meta Коробки. Если у поста в историях есть мета-ключ поста 'mark-as-news'
, то этот пост также должен отображаться на главной странице блога.
Итак, мне нужна помощь в написании вот чего:
Если в историях есть мета-пост
'mark-as-news'
затем на главной странице блога будут отображаться пользовательские типы записей Новости и события, а также Истории в порядке убывания.
Может ли кто-нибудь, пожалуйста, помочь?
Спасибо!
Редактировать:
Возможно, лучший способ сформулировать это был бы быть?:
Показывать пользовательские типы сообщений, новости и события, и если есть ключ
'mark-as-news'
дляpost_meta
, показать Рассказы.
2 answers
Привет@webcodeslinger:
Вот как будет выглядеть базовый запрос MySQL для загрузки новостей и событий (это значительно упрощено по сравнению с тем, что на самом деле делает WordPress):
SELECT * FROM wp_posts WHERE post_type IN ('news','events')
Вместо этого вы хотите что-то вроде этого (в MySQL есть более эффективные способы сделать это, но в WordPress они сложнее, и для большинства сайтов вы никогда не заметите разницы):
SELECT * FROM wp_posts WHERE post_type IN ('news','events')
OR (post_type='stories' AND ID IN
(SELECT post_id FROM wp_postmeta WHERE meta_key='mark-as-news')
)
So...to добавьте этот дополнительный SQL в запрос вашего основного цикла используйте крючок 'posts_where'
. Вы можете поместить следующий код подключения в файл functions.php
вашей темы (в нижней части файла будет достаточно) или в один из файлов .php
плагина, если вы создаете плагин:
add_action('posts_where','yoursite_posts_where',10,2);
function yoursite_posts_where($where,$query) {
global $wp_the_query;
if (is_home() && $query===$wp_the_query) { // This means home page and the main loop
global $wpdb;
$where .= " OR ({$wpdb->posts}.post_type='actor' AND " .
"{$wpdb->posts}.ID IN (" .
"SELECT post_id FROM {$wpdb->postmeta} " .
"WHERE meta_key='mark-as-news')) ";
}
return $where;
}
То, что вы хотите, легко описать, но трудно заставить работать с WP API. До сих пор я не видел хорошего и аккуратного решения.
В основном WP-запрос - это необычная оболочка для SQL-запроса, которая получает строки post из базы данных. То, что вам нужно, - это практически два разных запроса для двух разных наборов сообщений. WP в настоящее время не обрабатывает такую логику ИЛИ в запросах.
Вы можете сделать два запроса и объединить результаты, но в этом случае будет сложно получить разбивку на страницы верно.
Вероятно, это одна из причин, по которой темы в стиле журналов стали популярными, потому что они специализируются на показе нескольких наборов сообщений в нескольких областях, а не на борьбе со сложным сочетанием контента.