当in_the_loop()为假时,何时以及为什么is_Single(‘my_cpt’)为真?

时间:2020-08-02 作者:MikeiLL

我正在使用模板系统的示例代码。

此地址的页码: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;
}
Thewpbp_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_templatetemplates/single-my_template.

1 个回复
最合适的回答,由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_includesingle_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;
}

相关推荐

Get Current User ID Inside a Loop返回0表示短码

我有一个函数,它对给定作者的所有帖子都有一个循环。我使用get_current_user_id() 但这在循环中似乎不起作用,或者可能是它的短代码问题。我的函数在shortcode的帮助下运行。当前用户总是返回0,因此它会显示我网站上所有帖子的元数据。function get_meta_value_by_meta_key(){ $author_id = \'get_current_user_id()\'; // do stuff to get user I $author