Ob_get_lean返回空字符串,ob_get_flush输出字符串

时间:2013-10-31 作者:Josh Levinson

我正在使用模板类型系统来过滤the_content. 我的筛选器包含以下部分代码:

ob_start();
include_once ( self::$dir . \'views/templates/\' . $post_type . \'/\' . $display . \'.php\' );
$contents = ob_get_clean();
return $contents;
出于某种原因,这可以在本地工作,但不是测试服务器(WP Engine-nginx)。我已核实该文件确实被包括在内。

在测试服务器上,$contents 实际上是一个空字符串(I var\\u dump\'ed it to be sure,it isstring(0)"").

奇怪的是,我将上述代码替换为:

ob_start();
include_once ( self::$dir . \'views/templates/\' . $post_type . \'/\' . $display . \'.php\' );
ob_flush_clean();
只是为了好玩。此代码将对象缓冲模板页面输出到屏幕。我无法使用ob\\u flush,因为我需要返回对象缓冲区。输出缓冲区会导致它显示在错误的位置,显然是因为我需要从过滤器返回字符串。

为什么ob_get_clean() 返回空字符串,同时ob_end_flush() 是否将正确的缓冲区内容输出到页面?

经过一番思考,我把include_once 至普通“ol”include.这会导致服务器生成502错误。

所以我现在在想,出于某种原因,我的过滤器导致某种类型的循环或某些东西被多次调用?我真的不确定。我研究了其他人在我的情况下所做的工作,我的代码看起来与使用自定义模板系统的其他方法几乎相同。

一个重要的注意事项是:当通过短代码调用回调时,它的行为符合预期。

其要点是使用自定义元数据/页面内容布局;以独立于主题的方式存档CPT的显示。短代码用于归档类型显示(我之所以说归档类型,是因为它是手动生成的归档,而不是典型的归档{cpt}.php)。我为“归档”页面添加了一个短代码,这样网站所有者就可以控制归档页面的永久链接、标题和总体内容。我带着过滤器去了the_content 因此,它可以尽可能独立于主题。

完整筛选器代码:

add_filter( \'the_content\', array( $this, \'filter_content\' ) );
function filter_content($content) {

    global $post;

    if( !$this->we_belong_here() ) {
    //does post type check

        return $content;

    }

    $display = \'archive\';

    if( is_single( $post ) ) {

        $display = \'single\';

    }

    return $this->shortcode( array( \'post_type\' => $post->post_type, \'display\' => $display, \'content\' => $content, \'method\' => \'class\' ) );

}

function shortcode($atts) {

    extract( shortcode_atts( array(

        \'post_type\' => \'\',

        \'display\' => \'archive\',

        \'method\' => \'shortcode\',

        \'content\' => \'\'

    ), $atts ) );

    ob_start();

    include ( self::$dir . \'views/templates/\' . $post_type . \'/\' . $display .\'.php\' );

    $contents = ob_get_clean();

    if($contents) return $contents; else return $content;

}

1 个回复
最合适的回答,由SO网友:Josh Levinson 整理而成

我的代码失败的原因是它达到了内存限制。

我在给内容添加一个过滤器,并调用另一个插件的API(自定义字段套件),以获取一些所见即所得类型的元数据。这种类型的字段通过\\u内容过滤器运行,因此我遇到了一个无限循环。

我无法在WP引擎上找到这一点,因为他们的错误日志记录非常有限。

最后,我在MediaTemple服务器上测试了该站点,结果显示了正确的错误消息。

为了解决这个问题,在调用元数据获取程序之前,我从\\u内容中删除了过滤器,然后在调用后将其重新添加。

结束

相关推荐

建议:模板结构-php代码块在侧边栏还是其他地方?

我正在尝试创建某些modulair块,可以将其添加到Wordpress的多个页面中。但我使用侧边栏-[名称]。php文件,这方面的最佳实践是什么?您应该将它们添加到函数中还是添加到提要栏中。。。使用许多侧边栏感觉有点不舒服。如果我可以将它们添加到模板中的子文件夹中,那就太好了。签出图像。你是怎么做到的?