Запрос WP с несколькими категориями - передача массива работает?


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

$query = new WP_Query( array( 'cat' => '2,6,17,38' ) );

Https://codex.wordpress.org/Class_Reference/WP_Query#Category_Parameters

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

  $args = array(
    'cat' => $related_cat_ids,
    'posts_per_page' => -1,
  );
  $query = new WP_Query($args);

Причина, по которой я в замешательстве, заключается в том, что $related_cat_ids на самом деле является массивом, но в примере четко показана строка чисел, разделенная запятые, для значения "кошка".

Это то, о чем я должен беспокоиться? Перестанет ли мой код внезапно работать в будущем выпуске WordPress? В моем случае удобнее продолжать использовать массив, а не форматировать его в эту строку. Причина в том, что я использую get_the_category() для динамического получения категорий, а затем помещаю идентификаторы из этого массива в свой новый массив.

Author: Jordan Carter, 2017-11-16

2 answers

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

Например, возьмите следующий код из class-wp-query.php

// If querystring 'cat' is an array, implode it.
if ( is_array( $q['cat'] ) ) {
    $q['cat'] = implode( ',', $q['cat'] );
}

Проверяет, является ли массив массивом, и быстро преобразует результат в строку, разделенную запятыми.

Другим способом будет использование других опций, таких как:

 category__and           An array of category IDs (AND in).
 category__in            An array of category IDs (OR in, no children).
 category__not_in        An array of category IDs (NOT in).

Подробнее об этом в Category_Parameters

Но опять же я будет держаться, чтобы использовать так, как вам удобнее.

Совершенно нормально использовать формат array(), если вы считаете его более полезным, кроме того, это то, что делает Wordpress веселым и полезным инструментом для работы.

 3
Author: Drupalizeme, 2017-11-16 18:22:50

Да, это сработает. Информация может быть не указана в кодексе. Но если вы посмотрите на код здесь относительно параметра, вы обнаружите, что даже если массив передается, он изменяется на строку.

    // If querystring 'cat' is an array, implode it.
    if ( is_array( $q['cat'] ) ) {
        $q['cat'] = implode( ',', $q['cat'] );
    }

Так что вы должны быть в безопасности. Насколько я понимаю, хорошо, что и строка, и массив принимаются в качестве аргументов, и сообщество WordPress, вероятно, оставит все как есть.

Даже если у вас все еще есть сомнения, вы всегда можете использовать категорию__ в параметре, который всегда принимает массив, как показано ниже:

$args = array(
'category__in' => $related_cat_ids,
'posts_per_page' => -1,
);
$query = new WP_Query($args);
 0
Author: ghoul, 2017-11-16 18:18:02