让我试着解释一下发生在我身上的事情:
我有一个快捷代码插件,可以显示当前页面的子页面(mod ofhttp://wpist.me/wp/child-pages-shortcode/, 非常有用)。
在display函数中,它使用get\\u posts(),带有非常基本的代码,符合codex示例(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();
}
在PHP 5.2中,它按预期工作。我更新到PHP 5.4,get\\u the\\u content()返回父内容,而不是当前子内容。前几行仍在返回正确的数据,但对get\\u the\\u*函数的第一次调用似乎会更改全局$post的内容。
如果我使用$post->*而不是get\\u the\\u*(),效果很好,但是get\\u the\\u*()具有有用的自动处理功能。
我找到了一个让它工作的方法,所以我把它贴在这里,也许有人可以解释为什么它会这样。
我更改了循环变量的名称,以避免弄乱全局$post(顺便提一下,我不明白为什么codex示例在循环中使用$post…)
在每次get\\u*()调用之后,我都添加了一个setup\\u postdata调用,以将全局重新绑定到正确的post:
工作代码:
global $post;
foreach ($pages as $mypost) {
setup_postdata($mypost);
$html = $mypost->post_title;
$html .= get_the_excerpt();
setup_postdata($mypost);
$html .= get_the_content();
}
谢谢
编辑:我的函数的完整代码(工作正常),以防简化版本使您困惑:
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 .= \'<hr style="border:0px; clear:both;"></div>\';
}
return apply_filters("child-pages-shortcode-output", $html);
}