it-swarm.com.ru

WP_Query и использование переменной для 'cat' => в массиве args = WP Ошибка?

Ради этого обсуждения, вот версия моего запроса в category.php:

wp_reset_query();
$category_id = get_cat_ID(single_cat_title('', false));
$my_query = new WP_Query(array(
'posts_per_page' => SOME_DEFINED_VALUE,
'cat'  => $category_id,
'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
'post_type' => array('post','post_custom_1','post_custom_2','post_custom_3')
));
// print_r($my_query);

Короче говоря, это не работает. Вот что я заметил.

Когда я делаю print_r ($ my_query); Я могу видеть query_vars в первой строке. Они не соответствуют моим аргументам массива. Например, для posts_per_page по умолчанию используется какое-то другое значение (не CONSTANT), а список post_type больше не включает в себя post (которая должна/должна).

Если я уберу строку с 'cat' => или жестко закодирую значение ('cat' => 3), то все будет работать так, как ожидается. Остальные параметры query_vars отображаются в print_r. Жизнь хороша :)

Я пробовал следующее, но безуспешно:

  • Превращение переменной в CONSTANT, как в posts_per_page (что не вызывает проблем).
  • Заключительная кавычка вокруг числа $ category_id - результат такой же, как и отсутствие кавычек вообще. Не работает.
  • 'cat' => array ($ category_id) - я вытащил ошибку - не понравилось
    что это был массив.

У кого-нибудь есть предложения?

Теперь вот что "сработало" (читай: я мог использовать свой $ category_id, и это не испортило остальные аргументы в списке массивов WP_Query ()).

'cat'  => '"-'$category_id'"',

То есть я не смог бы эту кошку идентифицировать. Сумасшедший, верно?

Если я не смогу решить ее должным образом, я буду иметь разделенное запятыми жало всех моих котов, не обработанных, проанализировать текущий кот и затем использовать эту строку для выполнения запроса. Другими словами, если бы мои кошки были A, B и C, вместо того, чтобы делать запрос для A (как и следовало ожидать)

'cat' => A

Я собираюсь запросить не B, а не C.

'cat' => -B,-C

Надеюсь, есть менее хакерское решение. Я был на этом слишком много часов сейчас, и я достаточно отчаянно, чтобы использовать этот хак и покончить с этим. Тем не менее, это, безусловно, чувствуется как ошибка в ядре для меня. Да, я использую 3.5.1 (или мы до .2 или .3 сейчас?). Суть в том, что я использую последнюю версию (и то же самое было сделано в 3.2.x).

кстати, я видел эту проблему в другом месте (например, на форумах WP). Одно решение предполагало, что массив args - это не массив, а строка. Даже если это возможно с WP_Query, как бы я сделал список/массив для post_types в виде строки? Наконец, если я делаю что-то не так, страница справки Кодекса нуждается в обновлении, а?

Помогите. :)

2
Chief Alchemist

Где/как вы определяете $category_id?

Ссылка запись Кодекса для параметров категории WP_Query() . WP_Query() ожидает, что идентификаторы категорий будут переданы как целые числа , а не как строки :

  • Если $category_id - это целое число, передайте его 'cat'.
  • Если $category_id является массивом (категории идентификаторы, снова как целые числа), передайте его 'category__in'
2
Chip Bennett

Я думаю, это связано с тем, как вы получаете категорию. Я настроил функцию в блоге, над которым я работаю; $category_id всегда 0.

Чтобы проверить, я использую эту строку для $category_id:

global $post;
$category_id = get_the_category($post->ID)[0]->term_id;

Просто быстрый способ получить первую категорию, назначенную посту.

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

0
Simon

Я проверил вашу функцию, и она работает нормально, поэтому у вас, вероятно, есть ошибка с другим кодом в вашей теме или конфликт плагинов. Или, может быть, вы не правильно.

Для справки я протестировал следующий код на category.php в twentyeleven, вывод был правильным, без ошибок.

wp_reset_query();
define("SOME_DEFINED_VALUE", 5);

$category_id = get_cat_ID(single_cat_title('', false));

$my_query = new WP_Query(array(
'posts_per_page' => SOME_DEFINED_VALUE,
'cat'  => $category_id,
'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
'post_type' => array('post','post_custom_1','post_custom_2','post_custom_3')
));

var_dump($my_query);
0
Wyck

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

wp_reset_query();
$category_id = get_cat_ID(single_cat_title('', false));

$paged = ( get_query_var('paged') )? get_query_var('paged') : 1 ;

$query = array(
'posts_per_page' => 5,
'cat'  => $category_id,
'paged' => $paged ,
'post_type' => array('post','custom_1','custom_2','custom_3')
);

$loop = new WP_Query( $query);

print_r($loop);

Как видите, я добавил дополнительную скобку вокруг первого get_query_var, чтобы он стал правильным троичным оператором. Я попробовал это на моем испытательном стенде, и он работал просто отлично.

привет Энди

0
Andy Killen