Запросить все сообщения, где мета-ключ не существует

Я пытаюсь получить запрос для извлечения всех сообщений, где не существует определенный meta_key, а затем создать его.

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

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

$args = array(
   'posts_per_page' => 18,
   'cat'=>1955,
   'post_status'=>'publish',
   'meta_query' => array(
                  array(
                     'key' => 'colors',
                     'compare' => 'NOT EXISTS'
                  ),
   ));      

query_posts($args);

Это не возвращает ничего, если нет сообщений с ключевым цветом colors, но возвращает их ids сообщений с ключевым цветом colors, когда это (присутствует противоположное тому, что мне нужно). Я попробовал вместо EXIST, но не повезло.

Если кто-то может опрокинуть меня на правильном пути создания запроса, как тот, который мне нужен, я по достоинству оценю его.

Спасибо!

42 голоса | спросил JordanBel 12 Jpm1000000pmSat, 12 Jan 2013 20:48:33 +040013 2013, 20:48:33

2 ответа


62

Я сделал еще несколько тестов с этим и, честно говоря, не могу найти причину, по которой он не будет работать (если только код выше не является просто фрагментом, а реальный код соответствует моим примерам ниже). Однако я обнаружил пару вещей, которые могут привести вас в правильном направлении.

1) Сам по себе этот мета-запрос является эквивалентом «colors IS NULL», т. е. он будет возвращать сообщения, которые не имеют этого ключа, установленного в таблице postmeta. Это пример, показанный выше, и он должен был работать.

'meta_query' => array(
    array(
     'key' => 'colors',
     'compare' => 'NOT EXISTS' // this should work...
    ),
)

2) Установление индекса 'отношения' к 'OR', однако, изменяет это условие. Он возвращает обратное. Не спрашивай меня, почему. Это особенно важно при выполнении нескольких мета-запросов. Это означает, что изначально невозможно выполнить запрос для сообщений, для которых «цвет» установлен на «синий» (или что-то еще) или вообще не установлен. В запросе ниже проигнорируется первое условие и возвращаются только те, которые соответствуют второму условию.

'meta_query' => array(
   'relation' => 'OR',
    array(
     'key' => 'colors',
     'compare' => 'NOT EXISTS' // doesn't work
    ),
    array(
     'key' => 'colors',
     'value' => 'blue'
    )
)

3) Однако мы можем обмануть WordPress в использовании первого условия, если мы установим «значение». Он не нуждается в соответствующем значении (он, насколько мне известно, игнорируется), но он должен быть установлен , чтобы условие NOT EXISTS имело какой-либо эффект .

'meta_query' => array(
   'relation' => 'OR',
    array(
     'key' => 'colors',
     'compare' => 'NOT EXISTS', // works!
     'value' => '' // This is ignored, but is necessary...
    ),
    array(
     'key' => 'colors',
     'value' => 'blue'
    )
)

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

ответил Tomas Buteler 16 Jpm1000000pmWed, 16 Jan 2013 19:05:16 +040013 2013, 19:05:16
9

Используя пользовательский запрос, это сработало для меня:

SELECT * FROM wp_posts as posts
            WHERE   posts.post_type     = 'post'
            AND NOT EXISTS (
              SELECT * FROM `wp_postmeta`
               WHERE `wp_postmeta`.`meta_key` = "your_meta_key"
                AND `wp_postmeta`.`post_id`=posts.ID
            ) 
ответил i_a 10 Jam1000000amSat, 10 Jan 2015 00:50:35 +030015 2015, 00:50:35

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132