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?
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 );
}
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
} );
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
});