echo statement repeats

时间:2016-09-06 作者:MediaFormat

创建第一个wp插件。

对\\u内容使用带筛选器的add action init

我注意到,每当我回显任何内容时,它都会在标题中出现两次,最后在正文中出现一次。

为什么?

或者我该如何避免这种情况?

kthxbai

EDIT

function my_module_init() {
  //Filter this content
  add_filter(\'the_content\', \'my_content_ctrlr\');
}
add_action(\'init\', \'my_module_init\');

// function controller plug-in
function my_content_ctrlr($content) {
  global $post;

//Get value of metabox from current id
  $codeUnit = get_post_meta($post->ID, \'list_unit_meta_key\', true); 

//If none selected from metabox, skip it as its a regular page
  if( $codeUnit == \'NULL\' || !isset($codeUnit) || $codeUnit == \'\') {
    return $content;
  }

//if I add echo anything, it shows up twice in head and once in body
//  WHY?
//echo $codeUnit;

    ob_start(); 

    //If photo included display grid view, else table view
    if  ($includePhoto == \'on\') {
        include(plugin_dir_path(__FILE__) . \'views/my-grid.php\');
    } else {
        include(plugin_dir_path(__FILE__) . \'views/my-table.php\');
    }

    $output = ob_get_contents();
    ob_end_clean();
    return $output;

}

2 个回复
最合适的回答,由SO网友:Dave Romsey 整理而成

我不认为所提供的代码中存在根本问题。我测试了一个进一步简化的测试用例,我已将其粘贴到下面,并且没有得到重复的内容:

function my_module_init() {
  add_filter(\'the_content\', \'my_content_ctrlr\');
}
add_action(\'init\', \'my_module_init\');

function my_content_ctrlr( $content ) {
    ob_start(); 

    // This file contains only the following simple text for testing purposes: #########    
    include( plugin_dir_path( __FILE__ ) . \'views/my-grid.php\' ); 

    $output = ob_get_contents();

    ob_end_clean();

    // Add our custom code before the existing content.
    return $output . $content;
}
因此,我认为我们可以排除我最初的想法,即内容被回应而不是返回。

另一种可能性是apply_filters() 电话接通the_content 通过插件或主题在站点中的某个位置。E、 g.:

echo ( apply_filters( \'the_content\', \'<div>Hello there!</div>\' ) );
主题做这种事情并不罕见,它会导致my_content_ctrlr() 对于每一个额外的事件调用一次。

您可以使用此代码段所示的一些附加检查来解决该问题(source).

function pippin_filter_content_sample($content) {
    if( is_singular() && is_main_query() ) {
        $new_content = \'<p>This is added to the bottom of all post and page content, as well as custom post types.</p>\';
        $content .= $new_content;   
    }   
    return $content;
}
add_filter(\'the_content\', \'pippin_filter_content_sample\');

SO网友:MediaFormat

感谢@goto10,theis_main_query 对我来说不起作用,但为我指明了正确的方向,添加了额外的条件检查。我最终使用了in_the_loop:

if (!in_the_loop()){
    return;
}

相关推荐