根据帖子类型在主页上显示不同的内容

时间:2016-03-11 作者:palekjram

在主页中,我有一个用于显示不同帖子类型内容的自定义循环。我的索引上有这个循环。php

$loop = new WP_Query(
array(
    \'post_type\' => array(\'photo\', \'video\', \'web\'), 
    \'paged\' => get_query_var(\'paged\') ? get_query_var(\'paged\') : 1,
    \'posts_per_page\' => -1

)
); 
现在它显示正确,但我想包括它所属的文章类型的标题,以便我可以链接到正确的页面。

例如,如果我的主页中有这些项目(作为上述循环的结果):

第1项-videophotoweb其中链接是我创建的显示自定义帖子类型的页面,标题是帖子类型的标题(即视频、照片、web)。

我试着把它放进我的循环中,但它不起作用。

<?php while ( $loop->have_posts() ) : $loop->the_post(); ?>
                    <?php
        if ( is_singular( \'photo\' ) ) :
           echo "<a href=\'/photo\'>photo</a>";

        elseif ( is_singular( \'video\' ) ) :
            echo "<a href=\'/video\'>video</a>";

        elseif ( is_singular( \'web\' ) ) :
            echo "<a href=\'/web\'>web</a>";
         endif;
    ?>
    <?php get_template_part( \'content\', \'grid\'); ?>
<?php endwhile; ?>

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

您在许多方面都做得不对:

您不应该使用自定义查询来代替主查询。宁可使用pre_get_posts 相应地更改主查询。返回主循环,在函数文件或自定义插件中添加以下内容

add_action( \'pre_get_posts\', function ( $q )
{
    if (    $q->is_home()
         && $q->is_main_query()
    ) {
        $q->set( \'post_type\',      [\'photo\', \'video\', \'web\'] );
        $q->set( \'posts_per_page\', -1                        );
    }
});
  • is_singular() 这里的支票是错的。is_singular() 检查您是否在单发帖子页面上,因此在任何非单发帖子页面的页面上都将始终返回false。

    你需要的是get_post_type() 获取帖子所属的帖子类型并进行测试

    if ( \'photo\' === get_post_type() ) :
       echo "<a href=\'/photo\'>photo</a>";
    
    elseif ( \'video\' === get_post_type() ) :
        echo "<a href=\'/video\'>video</a>";
    
    elseif ( \'web\' === get_post_type() ) :
        echo "<a href=\'/web\'>web</a>";
     endif;
    
    最后,如果要链接到这些帖子类型的存档页面,应该使用get_post_type_archive(). 像下面这样的方法会奏效

    <a href="<?php echo get_post_type_archive_link( \'Photo\' ); ?>">Photo</a>
    
    而不是echo "<a href=\'/photo\'>photo</a>"

    根据评论,我对为什么不使用自定义查询代替主查询做了广泛的回答。请随意查看here. 它应该能为你回答很多问题

  • SO网友:majick

    使命感the_post() 填充$post 对象变量,因此可以通过直接从$post 对象(以及post类型对象):

    <?php $post_object = array();
    
    while ( $loop->have_posts() ) : $loop->the_post(); 
    
    global $post; $post_type = $post->post_type; // just for clarity
    
    // link to post permalink with post title anchor
    echo "<a href=\'".get_permalink($post->ID)."\'>".$post->post_title."</a>";
    
    // to be efficient, only get the post type object if we have not already
    if (!isset($post_object[$post_type])) {$post_object[$post_type] = get_post_type_object($post_type);}
    
    // link to post type archive, with post type name as anchor (plural)
    echo " (<a href=\'".get_post_type_archive_link($post_type)."\'>".$post_object[$post_type]->labels->name."</a>)";
    
    get_template_part( \'content\', \'grid\');
    
    endwhile; ?>
    
    这应该涵盖所有帖子类型,而不是在添加更多帖子时必须添加条件。

    相关推荐

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

    我正在使用模板系统的示例代码。此地址的页码: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(); ?>