web-dev-qa-db-fra.com

Utiliser un objet WP_Query dans une fonction

Je développe un thème WordPress responsive et au lieu d’utiliser des frameworks, j’en ai créé un.

J'essaie de NE PAS me répéter (cela veut dire, je ne veux pas écrire de balisage supplémentaire tout le temps), alors je génère le code HTML précédant l'élément .grid-unit div avec une fonction fluid_grid PHP prend une fonction en tant que premier paramètre.

Je tire certains types de publication personnalisés en utilisant WP_Query:

function slider_template() {
    // Query Arguments
    $args = array(
        'post_type'      => 'slides',
        'posts_per_page' => 10
    );     
    // The Query
    $the_query = new WP_Query( $args );    
    // Check if the Query returns any posts
    if ( $the_query->have_posts() ) {    
        // I'm passing an anonymous function here, that needs to be called later on
        fluid_grid( function() {
            ?>    
            // Here goes the markup that should be printed out later   
            <?php
        } ); // Close the anonymous function, and end the fluid_grid function.
    } // End of the if statement
} // End of slider_template function

Après avoir visité la page, j'obtiens l'erreur suivante:

Fatal error: Call to a member function have_posts() on null in ...

J'ai essayé de rendre le $the_query global, mais j'ai obtenu le même résultat ($the_query est toujours nul).

Est-il possible que la variable $the_query fonctionne dans la fonction anonyme? Si c'est le cas, comment?

3
WildChild

C'est PHP de base. Juste une note avant de continuer, ne jamais globaliser les variables. Wordpress a déjà fait un travail assez merdique à ce sujet. La mondialisation est mauvaise, car toute personne et n'importe quoi, en connaissance de cause ou non, peuvent changer une variable globale. Cela rend globals un cauchemar à déboguer. Donc, en bref, JAMAIS JAMAIS globaliser.

Chaque fois que vous devez transmettre quelque chose en dehors d'une fonction anonyme à la fonction, vous devez utiliser le mot clé use(). Par exemple, vous pouvez essayer

function () use( $the_query )
{
    var_dump( $the_query );
}

MODIFIER:

Dans votre code, vous pouvez faire ce qui suit

fluid_grid( function() use ( $the_query )
{
    ?>    
    // Here goes the markup that should be printed out later   
    <?php
} ); 
3
Pieter Goosen

Je ne connais pas fluid_grid, mais cela ressemble à un problème de portée. Vous créez une fonction anonyme dans votre appel:

fluid_grid(function() {

});

Cette fonction n'a pas accès à $the_query. Vous devez voir si vous pouvez transmettre la requête var à la fonction ou essayer de la globaliser.

fluid_grid(function() {
   global $the_query;
   //do stuff 
});
0
Chris