我正在使用模板类型系统来过滤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;
}