Php 5.4中奇怪的Get_the_*行为

时间:2014-01-14 作者:Matthieu

让我试着解释一下发生在我身上的事情:

我有一个快捷代码插件,可以显示当前页面的子页面(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);
}

2 个回复
SO网友:GhostToast

所有的get_the_* 函数的风格,您可以选择传递ID。为什么不这样做:

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

否则这意味着发帖ID。

SO网友:Rarst

实际上,您需要命名var$post 让一切顺利进行。setup_postdata() 未实际设置$post\'s数据,只是用于全球数据的其余部分。

要么您没有显示足够的代码来查看可能出现的错误,要么get_ 函数内部连接了一些东西,这会导致全局混乱。

结束

相关推荐

How can I find plugins' slug?

我想知道如何才能找到插件的slug(slug=WordPress用来更新插件和确定哪些插件当前处于活动状态的内部名称)?它通常是插件的文件夹名,但如果插件没有文件夹,则是其文件名(如hello.php)。是否有其他例外情况?大小写字符重要吗</插件的slug是否可以与其文件夹名不同?如果有一个叫做hello的插件呢。php和另一个/您好。php/您好。php