Verwenden Sie das WP_Query-Objekt in einer function

Ich entwickle ein responsives WordPress Theme und anstelle von Frameworks habe ich ein eigenes erstellt.

Ich versuche, mich nicht zu wiederholen (das heißt, ich möchte nicht immer extra Markup schreiben), also .grid-unit div ich den HTML- .grid-unit div , der vor dem .grid-unit div Element steht, mit einer fluid_grid PHP-function, die ein function als ein erster Parameter.

Ich verwende einige benutzerdefinierte Post-Typen mit 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 

Nach dem Besuch der Seite erhalte ich den folgenden Fehler:

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

Ich habe versucht, die $the_query global zu machen, aber endete mit dem gleichen Ergebnis ( $the_query ist immer noch null).

Ist es möglich, $the_query Variable innerhalb der anonymen function arbeiten zu lassen? Wenn das so ist, wie?

Solutions Collecting From Web of "Verwenden Sie das WP_Query-Objekt in einer function"

Dies ist einfaches PHP. Nur eine Anmerkung, bevor ich fortfahre, niemals globalisieren Variablen. WordPress hat diesbezüglich schon ziemlich schlechte Arbeit geleistet. Globalisierung ist böse, weil jeder und alles wissentlich oder unwissentlich eine globale Variable verändern kann. Dies macht Globals zu einem Albtraum zum Debuggen. Kurz gesagt, NIEMALS globalisieren.

Wenn Sie etwas außerhalb einer anonymen function an die function übergeben möchten, sollten Sie das Schlüsselwort use() . Als Beispiel können Sie es versuchen

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

BEARBEITEN:

In Ihrem Code können Sie Folgendes tun

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

Ich bin mit fluid_grid nicht vertraut, aber das sieht nach einem Problem mit dem fluid_grid aus. Sie erstellen eine anonyme function in Ihrem Anruf:

 fluid_grid(function() { }); 

Diese function hat keinen Zugriff auf $the_query . Sie müssen sehen, ob Sie die Abfrage var an die function übergeben können oder versuchen, sie zu globalisieren.

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