这只是对“奥托”答案的补充。只是为了让它更容易理解。基本上,正如@Otto所说的,您必须颠倒逻辑,这意味着:如果您能够可靠地确定主查询,那么您可以在the_content
滤器
例如,可以在pre_get_posts
行动,因此这将起作用:
function wpse162747_the_content_filter_callback( $content ) {
return $content . \'with something appended\';
}
add_action( \'pre_get_posts\', \'wpse162747_pre_get_posts_callback\' );
function wpse162747_pre_get_posts_callback( $query ) {
if ( $query->is_main_query() ) {
add_filter( \'the_content\', \'wpse162747_the_content_filter_callback\' );
}
}
由于您应该在不再需要过滤器时将其移除,因此我认为
loop_end
行动应该是实现这一目标的好地方,作为我们可以利用的对应行动
loop_start
. 如下所示:
add_action( \'loop_start\', \'wpse162747_loop_start_callback\' );
function wpse162747_loop_start_callback( $query ) {
if ( $query->is_main_query() ) {
add_filter( \'the_content\', \'wpse162747_the_content_filter_callback\' );
}
}
add_action( \'loop_end\', \'wpse162747_loop_end_callback\' );
function wpse162747_loop_end_callback( $query ) {
if ( $query->is_main_query() ) {
remove_filter( \'the_content\', \'wpse162747_the_content_filter_callback\' );
}
}