web-dev-qa-db-fra.com

WP_Query dans functions.php

J'ai du code que je veux transformer en une fonction. Cela fonctionne très bien jusqu'à ce que je l'enveloppe dans ladite fonction:

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

La fonction ressemble à ceci:

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

Qu'est-ce que je fais mal?

3
perpetualstudent

Simple, vous adressez $post hors contexte.

Lorsque vous exécutez une boucle WordPress standard, WP charge une variable globale $post avec les résultats de la requête en cours. Cela inclut l’ID, le titre, le contenu, les méta-publications, etc. Les fonctions de boucle référenceront cette variable globale pour vous fournir des données.

Prenons la fonction régulière get_the_ID() par exemple:

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

Votre code fonctionnera bien en dehors d'une fonction car, quelque part dans le code qui le précède, vous êtes probablement globalisant la variable $post. Donc, votre référence directe à $post->ID fonctionne.

Mais lorsque vous intégrez ce code dans une fonction, vous n'êtes pas référençant $post sous forme globale, donc $post->ID ne renverra rien car le local $post n'est pas défini.

Au lieu de référencer directement $post->ID, utilisez la fonction de boucle régulière get_the_ID():

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

Vous devez ajouter la variable globale $ post dans la fonction comme ceci:

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
Pontus Abrahamsson