Seltsames get_the_ * Verhalten mit PHP 5.4

Lass mich versuchen zu erklären, was mit mir passiert ist:

Ich habe ein Shortcode-Plugin, das untergeordnete Seiten der aktuellen Seite anzeigt (ein Mod von http://wpist.me/wp/child-pages-shortcode/ , sehr nützlich).

In der Anzeigefunktion verwendet es get_posts (), mit sehr einfachem Code, konform mit den Codex-Beispielen ( http://codex.wordpress.org/Function_Reference/get_posts ):

global $post; foreach ($pages as $post) { setup_postdata($post); $html = $post->post_title; $html .= get_the_excerpt(); $html .= get_the_content(); } 

Mit PHP 5.2 funktioniert es wie erwartet. Ich habe PHP 5.4 aktualisiert, und get_the_content () gibt den übergeordneten Inhalt anstelle des aktuellen untergeordneten Elements zurück. Vorherige Zeilen geben immer noch die korrekten Daten zurück, aber es scheint, dass der erste Aufruf einer get_the_ * -function den Inhalt des globalen $ -Posts ändert.

Es funktioniert gut, wenn ich $ post -> * anstelle von get_the _ * () verwende, aber get_the _ * () hat nützliche automatische Behandlung.

Ich habe einen Weg gefunden, es zum Laufen zu bringen, also poste ich es hier, also kann mir vielleicht jemand erklären, warum es sich so verhält.

  1. Ich habe den Namen der loop var geändert, um zu vermeiden, dass der globale $ post verpfuscht wird (ich verstehe nicht, warum das codex-Beispiel $ post in seiner Schleife verwendet, übrigens …)

  2. Ich habe nach jedem Aufruf von get_the _ * () einen Aufruf von setup_postdata hinzugefügt, um den globalen Eintrag in den richtigen Post einzufügen:

Arbeitscode:

 global $post; foreach ($pages as $mypost) { setup_postdata($mypost); $html = $mypost->post_title; $html .= get_the_excerpt(); setup_postdata($mypost); $html .= get_the_content(); } 

Vielen Dank

Edit: der vollständige Code meiner function (dies funktioniert korrekt) für den Fall, dass die vereinfachte Version Sie verwirrt:

 private function display($param, $block_template) { global $post; $html = ''; // defining the content of $template // cut // end defining $template $args = array( 'post_status' => 'publish', 'post_type' => 'page', 'post_parent' => $param['id'], 'orderby' => 'menu_order', 'order' => 'ASC', 'nopaging' => true, ); $args = apply_filters('child-pages-shortcode-query', $args, $param); $pages = get_posts($args); foreach ($pages as $post2) { setup_postdata($post2); $post = apply_filters('child_pages_shortcode_post', $post2); $url = get_permalink($post2->ID); $img = get_the_post_thumbnail($post2->ID, $param['size']); $img = preg_replace( '/(width|height)="\d*"\s/', "", $img); $tpl = $template; $tpl = str_replace('%width%', esc_attr($param['width']), $tpl); $tpl = str_replace('%post_id%', intval($post2->ID), $tpl); $tpl = str_replace('%post_title%', $post2->post_title, $tpl); $tpl = str_replace('%post_subtitle%', get_post_meta($post2->ID, "Sous titre", true), $tpl); $tpl = str_replace('%post_url%', esc_url($url), $tpl); $tpl = str_replace('%post_thumb%', $img, $tpl); if (isset($param['disabled_excerpt_filters']) && $param['disabled_excerpt_filters']) { $tpl = str_replace('%post_excerpt%', $post2->post_excerpt, $tpl); } else { $tpl = str_replace('%post_excerpt%', get_the_excerpt(), $tpl); setup_postdata($post2); } if (isset($param['disabled_excerpt_filters']) && $param['disabled_excerpt_filters']) { $tpl = str_replace('%post_content%', $post2->post_content, $tpl); } else { $tpl = str_replace('%post_content%', get_the_content(), $tpl); } $html .= $tpl; } wp_reset_postdata(); if (!$block_template) { $html .= '
'; } return apply_filters("child-pages-shortcode-output", $html); }

Solutions Collecting From Web of "Seltsames get_the_ * Verhalten mit PHP 5.4"

Bei allen functionen von get_the_* haben Sie die Möglichkeit, eine ID zu übergeben. Warum nicht?

$html .= get_the_excerpt($post->ID);

Andernfalls wird die ursprüngliche Post-ID angezeigt.

Sie müssen tatsächlich var $post benennen, damit alles reibungslos funktioniert. setup_postdata() setzt nicht wirklich die Daten von $post , sondern verwendet sie nur für den Rest des globalen Krams.

Entweder Sie zeigen nicht genug Code, um zu sehen, was schief gehen könnte oder get_ hat etwas süchtig darin, das globale get_ .