meta_query для ключей, которые еще не установлены

8

Я пытаюсь запросить пользовательский тип сообщения для системы галереи. У меня есть флажок, чтобы установить галерею как «избранную» галерею (настраивается через плагин «Больше полей») - если этот флажок установлен, то значение мета становится равным 1, а затем, если не отмечено, становится равным 0. Все хорошо. Однако, если флажок никогда не был установлен, то мета-ключ никогда не создается, что означает, что я не могу запросить NOT LIKE 1, потому что он не существует.

Я хочу запросить 4 галереи, которые не помечены как «1» в этом мета-значении, но также и те, которые вообще не имеют этого значения. Есть ли способ всегда давать вновь добавленным сообщениям значение по умолчанию для этого метаключа (т. Е. Всегда делать их 0 по умолчанию, если поле не отмечено) или есть способ запросить ключ, который еще не установлен?

Мой текущий запрос:

$args = array(
                        'post_type' => 'gallery',
                        'showposts' => 4,
                        'meta_key' => 'gal-ID',
                        'order_by' => 'meta_value',
                        'order' => 'ASC',
                        'meta_query' => array( array(
                                            'key' => 'main-gal',
                                            'value' => false,
                                        ) ),
                        ) );

И я пробовал различные попытки с «сравнить» => «НЕ НРАВИТСЯ», «! =» И т. Д. И т. Д.

Любые идеи? Этот билет, кажется, подразумевает, что это то, с чем нужно разобраться:

http://core.trac.wordpress.org/ticket/18158

Спасибо!

artparks
источник

Ответы:

7

Эта массивная функция была немного пугающей, я получил эту работу примерно так - с двумя аргументами (исключая функции)

$args = array(

    'meta_query' => array(
        'relation' => 'OR',
            array( // new and edited posts
                'key' => 'Set as Featured Post',
                'compare' => '!=',
                'value' => 1
            ),

            array( // get old posts w/out custom field
                'key' => 'Set as Featured Post',
                'value' => '1',
                'compare' => 'NOT EXISTS'
            ) 
        ),
    'posts_per_page' => 30

);
ArleyM
источник
Мой первый массив переопределяет мой второй с этим решением. Кажется, может быть, вы не можете дважды запросить одно и то же поле?
Аллен Гингрич
3

В соответствии с параметрами пользовательских полей в Кодексе, специальныеNOT EXISTS сравнение доступно начиная с версии 3.5 WP

Технически это выдает что-то вроде следующего SQL-запроса в постах:

$posts = get_posts( array(
    'meta_query' => array(
        array(
            'key'     => 'wrong',
            'compare' => 'NOT EXISTS',
        ),
    ),
) );
SELECT *,wp_posts.ID
FROM wp_posts
LEFT JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'wrong')
WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish') AND (wp_postmeta.post_id IS NULL)
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date DESC
LIMIT 0, 5

Он работает, присоединяясь к мета-таблице по предоставленному ключу и выбирая только те записи, которые не привели к значимым данным ( IS NULL). Таким образом, это работает только для случая, когда ключ вообще не существует и не будет работать для ключей, которые существуют с ложными значениями.

Rarst
источник
Я заинтригован этим NOT EXISTSсравнением. В качестве обходного пути для неустановленных мета-ключей я просто сохраняю 0 на save_postкрючке, если мета-ключ не установлен. Как NOT EXISTSработает? Будет ли он сортировать запрос ОП main-galи затем заполнять 4 постами, у которых нет этой мета?
helgatheviking
@helgatheviking Я подробно остановился на механике в ответ
Rarst
2

Как указывалось в заявке, она не поддерживается ... до тех пор вам придется полагаться на индивидуальное решение.

Несколько пользователей спрашивали об этом раньше или, по крайней мере, спрашивали, как это сделать на форумах WordPress.org, поэтому я написал функцию для выполнения работы, которую я никогда не держал (pastebinned), к счастью, я нашел оригинальную тему где я предоставил ссылку на pastebin (срок действия которой не должен истекать).

http://pastebin.com/kgLt1RrG

Я написал это 8 месяцев назад, и я не проверял это (с тех пор), поэтому дайте мне знать о любых проблемах.

Надеюсь, это поможет..

t31os
источник
Круто, спасибо за это - опробую это позже этим вечером и сообщу, что происходит.
artparks
1

Самый простой способ, хотя и не самый чистый:

$args = array(
    'post_type' => 'gallery',
    'posts_per_page' => -1,
    'meta_key' => 'gal-ID',
    'order_by' => 'meta_value',
    'order' => 'ASC',
    'meta_key' => 'main-gal',
    ) );

Это даст вам все ваши галереи, отсортированные по мета-ключу. Следующий шаг - выяснить, идут ли галереи со значением 1 после или перед другими публикациями. Таким образом, вы можете:

  • Обрабатывайте элементы до тех пор, пока вы не обработаете 4 элемента галереи или не достигните сообщения с мета-значением 1
  • Пропустите сообщения с мета-значением 1, затем начните обработку, когда вы достигнете первого значения, отличного от 1

Другие методы, не требующие специального оператора SQL:

  • Выполнение запроса для поиска ненужных галерей, использование его для заполнения массива идентификаторов записей, затем выполнение второго запроса, передача этого массива в виде записей для исключения
  • Использование таксономии вместо пользовательских полей (решает эту проблему довольно просто и вносит множество других приятных улучшений бесплатно, так что это также экономит ваше время)
Том Дж Новелл
источник