Способ включать сообщения оба с и без определенного meta_key в args для wp_query?

РЕДАКТИРОВАНИЕ 2: вместо того, чтобы выяснять действительное решение, я решил использовать обходное решение, и просто устанавливаю значение по умолчанию для book_in_series к '0'. Благодаря @eddiemoya для всех его время он потратил рассмотрение этого со мной!

Править: У меня был другой вопрос с необходимой регистрацией полного кода для этой страницы архива / запрос, если требуется видеть, что это здесь.

Этот запрос работает отлично, но не включает сообщений, которые не имеют meta_key 'book_in_series' (который определяет значение вида). То, что я хотел бы иметь, происходят, - чтобы книги были отсортированы по этому значению, если оно существует, иначе возвратитесь неприказанные. Это возможно?

$args = array( 
       'post_type' => 'books', 
       'posts_per_page' => -1,
       'nopaging' => true,
       'surpress_filters' => true,
       'orderby' => 'meta_value',
       'meta_key' => 'book_in_series',
       'order' => 'ASC',
       'post_parent' => $current_series_id,
 );

 $books = new WP_Query( $args);

Кажется, что этот ответ от Rarst приближается, но я не уверен, как адаптировать его к моим обстоятельствам. Пользовательский запрос с query_posts не показывает сообщение без определенного meta_key

Заранее спасибо за Вашу справку!

4
13.04.2017, 15:37
3 ответа

Вместо того, чтобы выяснять действительное решение, я решил использовать обходное решение и просто устанавливаю значение по умолчанию для book_in_series к '0'.

0
19.02.2020, 22:13

Чтобы быть ясными, Вы означаете говорить, что любые объекты, которые не имеют book_in_series ключа, просто будут внизу и не заказаны, но те, которые действительно имеют его, будет в главном и заказанном ASC тем ключом.Правильно?

meta_query используется для определения, какие объекты Вы хотите быть возвращенными, orderby используется для определения, что отсортировать те объекты по. Однако meta_key (который удерживается от использования как средство указать, который сообщения добраться) необходим, если Вы хотите использовать orderby.

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

http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters

http://scribu.net/wordpress/advanced-metadata-queries.html

могу я orderby одно пользовательское поле и meta_query другой в том же запросе

Править: Грубая попытка того, на что должен быть похожим Ваш запрос, прочитай комментарии объяснения.

 $meta_query = array(
    'relation' => 'OR',
    array(
        'key' => 'book_in_series',
        'compare' => 'IN'
    ),
    array(
        'key' => 'book_in_series',
        'compare' => 'NOT IN'
    )
);

$args = array(
    'post_type'        => 'books',
    'posts_per_page'   => -1,
    'nopaging'         => true,
    'subpress_filters' => true,
    'meta_query'       => $meta_query,
    //'orderby'        => 'meta_value',
    //'meta_key'       => 'book_in_series',
    //'order'          => 'ASC',
    'post_parent'      => $current_series_id
);
 $query = new WP_Query( $args );

Я прокомментировал объекты, связанные с сортировкой - если с этим запросом, Вы получаете сообщения, Вы хотите, затем пытаетесь удалить комментарии и видеть, сортирует ли это, не переопределяя meta_query

2
19.02.2020, 22:13
  • 1
    Спасибо @eddiemoya! Я уже посмотрел на большинство из тех, но я все еще неясен о том, как на самом деле кодировать это. Запрос в настоящее время задерживает все сообщения, которые я хочу кроме тех, которые не имеют никакой книги последовательно meta значение. Вопрос состоит в том, как я получил бы и тех с (отсортированным) значением и тех без? Если Вы хотите видеть полный контекст моего архива, я должен был отправить его в отдельном вопросе здесь: wordpress.stackexchange.com/questions/28424 / … Огромное спасибо в течение Вашего времени! –  Michelle 13.09.2011, 22:43
  • 2
    ответа, Чтобы протестировать это, удалить meta_key из запроса все вместе. Тем путем Вы фильтр привычки этим meta_key. Это должно возвратить Вас всему, что Вы хотите. Теперь, необходимо использовать meta_query для получения, тот же самый результат (кажется глупым, я знаю).So, я думаю, что необходимо использовать несколько meta_queries, и то же за исключением того, что 'выдерживают сравнение', будет 'В' на одном, и 'НЕ В' на другом. Я не уверен, как это работает пред3.2, но в 3,2 можно использовать 'отношение' тем же путем, Вы можете в tax_query. Таким образом, если Ваш на 3,2, Ваше отношение должно быть ИЛИ. Таким образом, Вы получите любые сообщения, которые находятся В Вашем meta_key ИЛИ НЕ находятся В Вашем meta_key –  eddiemoya 14.09.2011, 01:07
  • 3
    я попробовал его, но кажется, что orderby только работает при явном включении meta_key (wordpress.stackexchange.com/questions/10941 / …). И мое понимание - после того как meta_key явно называют, это автоматически фильтрует любые сообщения без этого meta_key. Я пропускаю что-то? –  Michelle 14.09.2011, 01:40
  • 4
    Таким образом, в первую очередь, я предположу, что meta_query работал правильно и получил сообщения, которые Вы хотели. Мое понимание было meta_query, должен переопределить meta_key с точки зрения фильтрации сообщений. Ссылка, которую Вы отправили, кажется, на самом деле подтверждает то, что я говорю. "но можно все еще использовать старый метод [meta_key] в дополнение к meta_query, поскольку эти строки указывают, как отсортировать получающийся запрос. Таким образом да, Вы могли бы указать на тот же meta_key дважды". –  eddiemoya 14.09.2011, 02:04
  • 5
    От моего понимания (и тесты) на самом деле необходимо использовать старый meta_key=value, или orderby не будет работать вообще (codex.wordpress.org/Class_Reference / …). К счастью я думаю, что нашел путь вокруг этого в целом - путем установки того поля местного обычая, чтобы иметь значение по умолчанию 0. Тем путем ключ всегда присутствует, и результаты возвращаются эффективно неотсортированные. Еще раз спасибо за Вашу справку!! :) –  Michelle 14.09.2011, 03:01

После поиска некоторое время я нашел по-видимому лучшее решение, чем необходимость в значении по умолчанию, к которому я собирался обратиться. Я хотел бы знать Ваши мысли. Я выполнил два запроса. Один для создания массива идентификаторов сообщений для исключения и другой для показывания сообщений. Базирующийся это на информации я нашел здесь: http://wordpress.org/support/topic/remove-single-post-from-query

$posts_to_exclude_args = array(
            'cat' => '3772', 
            'post_status' => 'publish',
            'orderby' => 'date',
            'meta_value' => 'yes_exclude_this_post',
        );
$posts_to_exclude = new WP_Query( $posts_to_exclude_args );
$to_exclude = array();
while ( $posts_to_exclude->have_posts() ) : $posts_to_exclude->the_post(); 
$to_exclude[] = $post->ID;
endwhile;

$posts_args = array(
         'post__not_in' => $to_exclude,
        'cat' => '-3772', //Exclude slideshow, video
        'post_status' => 'publish',
        'paged'=>$page,
        'posts_per_page' => 10,
        'orderby' => 'date',
    );

$posts = new WP_Query( $posts_args );
1
19.02.2020, 22:13
  • 1
    Только для справки: запятые в последней паре значения ключа в $post_args и $posts_to_exclude_args являются синтаксическими ошибками. Я просто говорю. (не протестировал) –  Langusten Gustel 07.03.2013, 01:00
  • 2
    Это не масштабируемое решение. Если у Вас будет большое количество сообщений, то эти два запроса будут очень медленны. –  forsvunnet 13.02.2015, 12:09

Теги

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