检查是否正在`the_post()`中执行过滤器(“the_content”)

时间:2017-02-02 作者:T.Todua

我想使用

add_filter(\'the_content\',...........)
然而,我希望过滤器只影响主帖子的内容。参见phseudo示例:

<html>
.......
<meta decsription>.....the_content...</meta>
.......
<left_widget>....the_content...</left_widget> 
.......
<MAIN_POST>....the_content...</MAIN_POST>         <----------------- I want only this to be affected
......
如何实现?(当然,毫无疑问的是分类页面,其中列出了post\\u内容)

5 个回复
SO网友:cybmeta

This method doesn\'t work. I leave this answer only as reference.

如果我理解正确,更简单的方法是检查您是否在过滤器回调内的主查询中:

add_filter( \'the_content\', \'cyb_filter_content\' );
function cyb_filter_content( $content ) {

    if( is_main_query() ) {

        // Work with $content here

    }

    return $content;

}
但是这个DOESN\'T WORK. Why?

is_main_query() 是否:

function is_main_query() {
    global $wp_query;
    return $wp_query->is_main_query();
}
因此,它不会检查当前循环的查询是否是主查询,而是检查全局$wp_query 对象是主查询;以及全球$wp_query 对象is always the main query 除非它被修改过,这是不寻常的,而且通常不被推荐。所以is_main_query() 退货true 几乎每一个地方,每一次。

SO网友:T.Todua

找到的解决方案here, 使用in_the_loop() (但也请阅读我回答下面的评论):

add_filter( \'the_content\', \'custom_content\' );

function custom_content( $content ) {
    if ( in_the_loop() ) {
        // ....
    }
    return $content;
}

SO网友:KAGG Design

这非常简单,请参见下面的代码。

add_filter( \'the_content\', \'my_the_content_filter\' );
function my_the_content_filter( $content ){
    // If it is not page named debug, do nothing
    if( $GLOBALS[\'post\']->post_name != \'debug\' )
        return $content;

    // do actions...
    $content = \'my super cool new content\';
    return $content;
}

SO网友:Nathan Johnson

挂接到的问题the_content 不能保证我们在循环中。

解决方案pre_get_posts 排除某些查询。通过the_post 挂钩前the_content.

详细信息将操作添加到pre_get_posts 具体查看页面是否为单数。

add_action( \'pre_get_posts\', \'wpse_106269_pre_get_posts\', 10, 1 );
function wpse_106269_pre_get_posts( $query ) {
  if( is_singular() ) {
    add_action( \'the_post\', \'wpse_106269_the_post\', 10, 2 );
  }
}
将操作添加到the_post. 当我们在的时候,每个帖子都会触发这个动作钩the loop. 一旦我们进去the_post, 我们知道我们在循环中,所以我们可以在the_content.

function wpse_106269_the_post( $post, $query ) {
  remove_action( \'the_post\', \'wpse_106269_the_post\', 10, 2 );    
  add_filter( \'the_content\', \'wpse_106269_the_content\', 10, 1 );
}
确保the_content 筛选器仅在中激发the_post, 删除它,以便将来不会被触发,除非the_post 行动挂钩。

function wpse_106269_the_content( $content ) {
  remove_filter( \'the_content\', \'wpse_106269_the_content\', 10, 1 );
  //* Do something with $content
  return $content;
}

SO网友:Mark Kaplun

这可能是一项不可能完成的任务。the_content 和它的朋友the_excerpt 缺乏上下文,并且无法通过查看各种全局变量来猜测上下文,因为它们可能已被更改。

一些主题提供了一些动作,表明他们开始输出帖子内容,但这远远不是标准的。

使用它的唯一方法是假设其他插件和主题开发人员很聪明,不使用the_content 对于任何不实际显示帖子内容的内容。(牵强的假设)