WP_Query::reset_postdata()
Setzt die globale Post-Variable ( $GLOBALS['post'] === $post
) auf den aktuellen Post in der Schleife der aktuellen WP_Query
Instanz.
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, $post
wird 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, $post
die 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 $post
globalen. 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 $post
Beitrag 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 $post
global, und das ist , wie WP_Query::reset_postdata()
Sätze $post
zum aktuellen Beitrag der Hauptabfrage
global $wp_query
nicht ändern, aber dasglobal $post
Objekt wird überschrieben undwp_reset_postdata()
verwendet dasglobal $wp_query
, um das ursprüngliche$post
Objekt zurückzusetzen. Hoffentlich kann jemand mit mehr Kernkenntnissen hereinkommen und eine legitime Antwort einreichen.