Условно запрашивать Пользовательские типы записей по Метам записей для Домашней страницы блога?


( Примечание модератора: Первоначальное название вопроса было: "Пользовательский запрос: Показать пользовательские типы сообщений плюс пользовательский тип сообщения с метой сообщения на главной странице блога")

Мне нужна помощь с пользовательским запросом. У меня есть три пользовательских типа сообщений: "Новости", " События", " Истории". На главной странице блога будут отображаться только Новости и события. Клиент может пометить историю как Новости, используя функции плагина Verve Meta Коробки. Если у поста в историях есть мета-ключ поста 'mark-as-news', то этот пост также должен отображаться на главной странице блога.

Итак, мне нужна помощь в написании вот чего:

Если в историях есть мета-пост 'mark-as-news' затем на главной странице блога будут отображаться пользовательские типы записей Новости и события, а также Истории в порядке убывания.

Может ли кто-нибудь, пожалуйста, помочь?

Спасибо!

Редактировать:

Возможно, лучший способ сформулировать это был бы быть?:

Показывать пользовательские типы сообщений, новости и события, и если есть ключ 'mark-as-news' для post_meta, показать Рассказы.

Author: MikeSchinkel, 2010-10-23

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;
}
 2
Author: MikeSchinkel, 2010-10-24 08:57:05

То, что вы хотите, легко описать, но трудно заставить работать с WP API. До сих пор я не видел хорошего и аккуратного решения.

В основном WP-запрос - это необычная оболочка для SQL-запроса, которая получает строки post из базы данных. То, что вам нужно, - это практически два разных запроса для двух разных наборов сообщений. WP в настоящее время не обрабатывает такую логику ИЛИ в запросах.

Вы можете сделать два запроса и объединить результаты, но в этом случае будет сложно получить разбивку на страницы верно.

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

 0
Author: Rarst, 2010-10-23 19:48:08