WP_Query::reset_postdata()Setzt die globale Post-Variable ( $GLOBALS['post'] === $post) auf den aktuellen Post in der Schleife der aktuellen WP_QueryInstanz.
public function reset_postdata() {
if ( ! empty( $this->post ) ) {
$GLOBALS['post'] = $this->post;
$this->setup_postdata( $this->post );
}
}
Wenn Sie eine benutzerdefinierte Abfrage auf einer Seite ausführen, $postwird der letzte Beitrag in der Schleife dieser benutzerdefinierten Abfrage gespeichert. Das können Sie selbst testen, indem Sie hinzufügen
?><pre><?php var_dump($post); ?></pre><?php
direkt nach der Schleife Ihrer benutzerdefinierten Abfrage.
Gleiches gilt für die Hauptabfrage nach der Schleife, $postdie den letzten Beitrag der Hauptabfrage und den ersten Beitrag in der Schleife vor der Schleife enthält.
Hier ist ein einfacher Test zum Testen des $postglobalen. Sie können dies zu Ihrer Funktionsdatei hinzufügen und jede Seite auf Ihrer Site laden
add_action( 'wp_head', function()
{
global $post;
?><pre><?php var_dump($post->ID); ?></pre><?php
}):
add_action( 'wp_footer', function()
{
global $post;
?><pre><?php var_dump($post->ID); ?></pre><?php
$q = new WP_Query( 'posts_per_page=3' );
while ( $q->have_posts() ) {
$q->the_post();
?><pre><?php var_dump($post->ID); ?></pre><?php
the_title();
}
?><pre><?php var_dump($post->ID); ?></pre><?php
wp_reset_postdata();
?><pre><?php var_dump($post->ID); ?></pre><?php
});
Wie wird der Beitrag der Hauptabfrageschleife wiederhergestellt?
Dies geschieht durch einen Aufruf, wp_reset_postdata()der den globalen $postBeitrag in der Schleife der Hauptabfrage auf den aktuellen Beitrag zurücksetzt . Dies ist normalerweise der erste oder letzte Beitrag, je nachdem, ob Sie Ihre benutzerdefinierte Abfrage vor oder nach der Hauptabfrageschleife hinzufügen.
Schauen wir uns an, wie wp_reset_postdata()es geht
function wp_reset_postdata() {
global $wp_query;
if ( isset( $wp_query ) ) {
$wp_query->reset_postdata();
}
}
Wie Sie sehen können, wp_reset_postdata()ist nur ein Wrapper für WP_Query::reset_postdata(). Der wichtige Teil hierbei ist, dass es sich um einen Wrapper für die Objektmethode der Hauptabfrage handelt $wp_query->reset_postdata();.
Denken Sie daran, dass die Hauptabfrage auch verwendet WP_Query. So wird das Hauptabfrageobjekt festgelegt
/**
* WordPress Query object
* @global WP_Query $wp_the_query
* @since 2.0.0
*/
$GLOBALS['wp_the_query'] = new WP_Query();
/**
* Holds the reference to @see $wp_the_query
* Use this global for WordPress queries
* @global WP_Query $wp_query
* @since 1.5.0
*/
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
Also , was wp_reset_postdata()tun ist, dauert es den aktuellen Eintrag in dem Hauptabfrage - Objekt und stellt die als $postglobal, und das ist , wie WP_Query::reset_postdata()Sätze $postzum aktuellen Beitrag der Hauptabfrage
global $wp_querynicht ändern, aber dasglobal $postObjekt wird überschrieben undwp_reset_postdata()verwendet dasglobal $wp_query, um das ursprüngliche$postObjekt zurückzusetzen. Hoffentlich kann jemand mit mehr Kernkenntnissen hereinkommen und eine legitime Antwort einreichen.