WP_Query в functions.php
У меня есть код, который я хочу превратить в функцию. Он отлично работает, пока я не помещаю его в функцию:
$args = array(
'posts_per_page' => -1,
'post_type' => 'asset',
'category_name' => $cat
);
$cat_query = new WP_Query( $args );
$matching_category_ids = array();
while ( $cat_query->have_posts() ) : $cat_query->the_post();
array_push($matching_category_ids, $post->ID);
endwhile;
Функция выглядит примерно так:
function grab_ids_in_category($cat) {
// код сверху здесь
return $matching_category_ids;
}
Что я делаю не так?
Просто, вы обращаетесь к $post
вне контекста.
Когда вы запускаете стандартный цикл WordPress, WP загружает глобальную переменную $post
с результатами текущего запроса. Это включает ID, заголовок, содержимое, метаданные записи и т. д. Функции цикла ссылаются на эту глобальную переменную, чтобы предоставить вам данные.
Возьмем, к примеру, стандартную функцию get_the_ID()
:
function get_the_ID() {
global $post;
return $post->ID;
}
Ваш код будет работать корректно вне функции, потому что где-то выше в коде вы, вероятно, делаете переменную $post
глобальной. Поэтому ваша прямая ссылка на $post->ID
работает.
Но когда вы оборачиваете этот код внутри функции, вы не ссылаетесь на $post
как на глобальную переменную, поэтому $post->ID
ничего не вернет, так как локальная переменная $post
не определена.
Вместо прямой ссылки на $post->ID
используйте стандартную функцию цикла get_the_ID()
:
while ( $cat_query->have_posts() ) : $cat_query->the_post();
array_post( $matching_category_ids, get_the_ID() );
endwhile;

Вам необходимо добавить глобальную переменную $post в функцию следующим образом:
function grab_ids_in_category($cat) {
global $post;
$args = array(
'posts_per_page' => -1,
'post_type' => 'asset',
'category_name' => $cat
);
$cat_query = new WP_Query( $args );
$matching_category_ids = array();
while ( $cat_query->have_posts() ) : $cat_query->the_post();
array_push($matching_category_ids, $post->ID);
endwhile;
return $matching_category_ids;
}
// Выводим результат запроса, передавая имя категории
echo grab_ids_in_category('category_name');
