Auch wenn diese Frage alt ist, werde ich sie hier stellen, falls jemand aus einer Google-Suche eine flexiblere Antwort benötigt.
Im Laufe der Zeit habe ich eine Lösung entwickelt, die unabhängig von WP_Query
globalen Abfragen ist. Wenn Sie ein benutzerdefiniertes Element verwenden WP_Query
, dürfen Sie nur die Variablen Ihres Elements verwenden include
oder require
in der Lage sein, diese zu verwenden. $custom_query
In einigen Fällen (in den meisten Fällen für mich!) Werden die von mir erstellten Vorlagenteile jedoch manchmal in einer globalen Abfrage verwendet (z. B. Archivvorlagen) oder in einer benutzerdefinierten WP_Query
(z. B. Abfragen eines benutzerdefinierten Beitragstyps auf der Startseite). Das bedeutet, dass ich einen Zähler benötige, um unabhängig von der Art der Abfrage global erreichbar zu sein. WordPress stellt dies nicht zur Verfügung, aber hier ist, wie dies dank einiger Hooks geschehen kann.
Platziere dies in deiner functions.php
/**
* Create a globally accessible counter for all queries
* Even custom new WP_Query!
*/
// Initialize your variables
add_action('init', function(){
global $cqc;
$cqc = -1;
});
// At loop start, always make sure the counter is -1
// This is because WP_Query calls "next_post" for each post,
// even for the first one, which increments by 1
// (meaning the first post is going to be 0 as expected)
add_action('loop_start', function($q){
global $cqc;
$cqc = -1;
}, 100, 1);
// At each iteration of a loop, this hook is called
// We store the current instance's counter in our global variable
add_action('the_post', function($p, $q){
global $cqc;
$cqc = $q->current_post;
}, 100, 2);
// At each end of the query, we clean up by setting the counter to
// the global query's counter. This allows the custom $cqc variable
// to be set correctly in the main page, post or query, even after
// having executed a custom WP_Query.
add_action( 'loop_end', function($q){
global $wp_query, $cqc;
$cqc = $wp_query->current_post;
}, 100, 1);
Das Schöne an dieser Lösung ist, dass, wenn Sie eine benutzerdefinierte Abfrage eingeben und in die allgemeine Schleife zurückkehren, diese in beiden Fällen auf den richtigen Zähler zurückgesetzt wird. Solange Sie sich in einer Abfrage befinden (was in WordPress immer der Fall ist, wussten Sie nicht, dass dies der Fall ist), wird Ihr Zähler korrekt sein. Das liegt daran, dass die Hauptabfrage mit derselben Klasse ausgeführt wird!
Beispiel
global $cqc;
while(have_posts()): the_post();
echo $cqc; // Will output 0
the_title();
$custom_query = new WP_Query(array('post_type' => 'portfolio'));
while($custom_query->have_posts()): $custom_query->the_post();
echo $cqc; // Will output 0, 1, 2, 34
the_title();
endwhile;
echo $cqc; // Will output 0 again
endwhile;