WP_Query в functions.php

25 июн. 2012 г., 20:53:35
Просмотры: 19.9K
Голосов: 4

У меня есть код, который я хочу превратить в функцию. Он отлично работает, пока я не помещаю его в функцию:

    $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;
}

Что я делаю не так?

0
Все ответы на вопрос 2
0

Просто, вы обращаетесь к $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;
25 июн. 2012 г. 21:11:19
0

Вам необходимо добавить глобальную переменную $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');
25 июн. 2012 г. 21:15:22