我正在使用模板系统的示例代码。
此地址的页码:http://project.test/my_cpt/hello-post/
.
无法理解原因is_singular( \'my_cpt\' )
是true
虽然in_the_loop()
是false
.
在页面模板中The Loop "E;“工程”:
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
?>
<h2><a href="<?php the_permalink(); ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>
<?php
}
}
我想我的问题是什么时候
is_singular() && in_the_loop()
都是真的?
当我跑的时候if ( have_posts() ) { while ( have_posts()...
这是循环中的还是创建循环?
更新部分与执行if &&
测验
上面的示例用于template_include
hook正在运行页面、帖子,甚至链接、菜单、媒体等。这就是为什么这两个测试都是必要的。
过滤器如下所示:
add_filter( \'template_include\', array( __CLASS__, \'my_template_include_method\' ) );
或者,如果它没有调用类方法,则只会是:
add_filter( \'template_include\', \'my_template_include_function\' );
完整的方法/函数如下所示:
public static function my_template_include_function( $original_template ) {
if ( is_singular( \'my_cpt\' ) && in_the_loop() ) {
return wpbp_get_template_part( MMC_TEXTDOMAIN, \'content\', \'my_template\', false );
}
return $original_template;
}
The
wpbp_get_template_part
来自我最近发现的一个插件样板
Wordpress Plugin Boiler Plate.
由于目前我正在寻找一个单数帖子,我可以single_template
像这样:
add_filter( \'single_template\', array( __CLASS__, \'my_single_include_function\' ) );
看起来是这样的:
public static function my_single_include_function( $single_template ) {
global $post;
if ( \'my_cpt\' === $post->post_type ) {
return wpbp_get_template_part( MMC_TEXTDOMAIN, \'single\', \'my_template\', false );
}
return $single_template;
}
模板本身看起来像:
templates/content-my_template
和
templates/single-my_template
.
最合适的回答,由SO网友:Sally CJ 整理而成
我想我的问题是什么时候is_singular() && in_the_loop()
都是真的?
请注意,两者is_singular()
和in_the_loop()
指向主WordPress查询set via wp()
(参见Query Overview on WordPress Codex) 使用全局$wp_query
变量
其次,我们在调用时创建/启动一个循环have_posts()
和the_post()
, 只有在那之后in_the_loop()
返回atrue
. 示例:
// For the main query.
if ( have_posts() ) {
while ( have_posts() ) : the_post();
var_dump( in_the_loop() ); // true
...
endwhile;
}
因此
is_singular() && in_the_loop()
只会返回
true
时间:
你在一个单数的WordPress页面上example.com/sample-page/
(单页;帖子类型page
) 还有像你这样的CPT页面(example.com/my_cpt/hello-post/
) 其中岗位类型为my_cpt
.
并且您正在主查询的循环中。
因此,例如my_template_include_function()
函数,使用is_singular( \'my_cpt\' )
就足够了,我不明白你为什么要检查in_the_loop()
这里-单个模板应该显示/启动主查询的循环,因此在WordPress运行template_include
或single_template
胡克,那个环not 还没有开始,或者您还不在主查询的循环中。
如果我错了,请纠正我。:)
(Update) 如果您的功能(例如my_template_include_function()
) 实际上是挂接到另一个钩子,该钩子确实在主查询的循环中运行,那么是的,您可以使用in_the_loop()
那里示例:
过滤器:(如果在(子)主题中,这将放置在functions.php
文件)
function my_custom_single_template_part( $template ) {
if ( is_singular( \'my_cpt\' ) && in_the_loop() ) {
return \'/path/to/your/template-part.php\';
}
return $template;
}
add_filter( \'my_single_template_part\', \'my_custom_single_template_part\' );
主回路:
if ( have_posts() ) {
while ( have_posts() ) : the_post();
$template = apply_filters( \'my_single_template_part\', \'template-parts/content\' );
get_template_part( $template );
endwhile;
}