web-dev-qa-db-ja.com

Functions.phpのWP_Query

関数に変換したいコードがいくつかあります。私はそれを上記の関数でラップするまでそれは素晴らしい作品。

    $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) {
    //stuff from above here
    return $matching_category_ids;
}

何がおかしいのですか?

3

簡単です、$postをコンテキスト外でアドレス指定しています。

標準のWordPressループを実行しているとき、WPは現在のクエリの結果を含むグローバル$post変数をロードします。これにはID、タイトル、コンテンツ、投稿メタなどが含まれます。ループ関数はこのグローバル変数を参照して実際にデータを提供します。

例えば、通常の関数get_the_ID()を取ります。

function get_the_ID() {
    global $post;
    return $post->ID;
}

上のコードのどこかで、おそらく$post変数をglobalizingしているので、あなたのコードは関数の外でうまく動くでしょう。だからあなたの$post->IDへの直接参照はうまくいきます。

しかし、このコードを関数内でラップすると、は$postをグローバルとして参照していません。そのため、local$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;
5
EAMann

このようにグローバル変数$ 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 the Query and pass a category name 
echo grab_ids_in_category('category_name');
3