query_posts() по значению ключа или его наличию

7 янв. 2011 г., 05:35:57
Просмотры: 752
Голосов: 1

Недавно я начал использовать Simple Fields в проекте для разделения типов записей. Все новые записи теперь будут иметь одно из четырёх возможных мета-значений (Story, Article, Video или Cartoon). У этих типов записей нет уникальных атрибутов или значений, поэтому я решил не использовать пользовательские типы записей в этот раз.

Я знаю, как делать выборку записей с определённым мета-значением, но это работает только для записей, у которых уже есть этот мета-ключ - а не для записей, созданных до установки плагина Simple Fields. Мне интересно, как можно выбрать все записи, у которых либо отсутствует мета-ключ "fizzbuzz", либо у которых этот ключ есть, но со значением "foobar".

Есть ли способ выбрать все записи, у которых вообще нет указанного ключа?

0
Все ответы на вопрос 1
5

Это позволит получить все записи, которые не имеют мета-ключа fizzbizz. Часть с пользовательским циклом я взял прямо из кодекса.

$pageposts = $wpdb->get_results("
    SELECT * FROM wp_posts p 
    LEFT JOIN wp_postmeta m 
    ON p.ID = m.post_id 
    WHERE m.meta_key <> 'fizzbizz'
    OR m.metakey IS NULL
    ORDER BY p.post_date DESC;
");

if ($pageposts):
    global $post;
    foreach ($pageposts as $post): 
    setup_postdata($post);
// теперь вы находитесь в цикле, используйте the_title() или что-то подобное

Этот запрос получит все записи, где есть ключ, но значение равно 'foobar'

$pageposts = $wpdb->get_results("
    SELECT * FROM wp_posts p 
    JOIN wp_postmeta m 
    ON p.ID = m.post_id 
    WHERE m.meta_key = 'fizzbizz' 
    AND m.meta_value = 'foobar' 
    ORDER BY p.post_date DESC;
");

а этот последний запрос сложный, я не совсем уверен насчет него...

Редактирование

Первый запрос исправлен благодаря этому вопросу.

7 янв. 2011 г. 05:51:49
Комментарии

Второй запрос должен работать, но вы можете сделать то же самое лучше, используя функции WP API. Первый запрос, на мой взгляд, не выглядит рабочим. Похоже, он будет получать только записи, у которых установлены мета-ключи (поскольку в противном случае они не будут включены в JOIN).

goldenapples goldenapples
7 янв. 2011 г. 09:50:46

@golden Хорошее замечание насчёт первого. Полагаю, чтобы написать его правильно, сначала нужно найти способ запросить записи, у которых отсутствуют какие-либо ключи. Есть у тебя идеи на этот счёт?

JakeParis JakeParis
7 янв. 2011 г. 17:41:18

@golden исправил первый запрос.

JakeParis JakeParis
7 янв. 2011 г. 19:11:28

Круто! Я так и не разобрался с LEFT JOIN, поэтому не знал, как это сделать (а поверьте, мне это было нужно!) Теперь осталось только разобраться, как использовать этот синтаксис в методах WP API. Например, второй запрос можно просто написать как get_posts('meta_key=fizzbizz&meta_value=foobar'); Думаю, для запроса отсутствия мета-ключа нужны специальные фильтры для 'posts_join' и 'posts_where'... у кого-нибудь есть простое решение?

goldenapples goldenapples
7 янв. 2011 г. 20:09:46

Думаю, также нужно добавить DISTINCT в SELECT, если делать таким образом, иначе один и тот же пост будет выводиться несколько раз, если у него несколько мета-значений.

goldenapples goldenapples
7 янв. 2011 г. 20:34:01