web-dev-qa-db-de.com

WP_Query in functions.php

Ich habe einen Code, den ich in eine Funktion verwandeln möchte. Es funktioniert großartig, bis ich es in die folgende Funktion einpacke:

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

Die Funktion sieht ungefähr so ​​aus:

function grab_ids_in_category($cat) {
    //stuff from above here
    return $matching_category_ids;
}

Was mache ich falsch?

3

Ganz einfach, Sie adressieren $post außerhalb des Kontexts.

Wenn Sie eine Standard-WordPress-Schleife ausführen, lädt WP eine globale $post-Variable mit den Ergebnissen der aktuellen Abfrage. Dies schließt die ID, den Titel, den Inhalt, das Post-Meta usw. ein. Die Schleifenfunktionen referenzieren diese globale Variable, um Ihnen tatsächlich Daten zu liefern.

Nehmen Sie die reguläre Funktion get_the_ID() zum Beispiel:

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

Ihr Code funktioniert auch außerhalb einer Funktion einwandfrei, da Sie im Code darüber wahrscheinlich die Variable $postglobal anpassen. Ihr direkter Verweis auf $post->ID funktioniert also.

Wenn Sie diesen Code jedoch in eine Funktion einschließen, wird nicht $post als global bezeichnet, sodass $post->ID nichts zurückgibt, da local $post undefiniert ist.

Verwenden Sie die reguläre Schleifenfunktion get_the_ID(), anstatt $post->ID direkt zu referenzieren:

while ( $cat_query->have_posts() ) : $cat_query->the_post();
    array_post( $matching_category_ids, get_the_ID() );
endwhile;
5
EAMann

Sie müssen die globale Variable $ post wie folgt in die Funktion einfügen:

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