在主页中,我有一个用于显示不同帖子类型内容的自定义循环。我的索引上有这个循环。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项-video第2项-photo第3项-web其中链接是我创建的显示自定义帖子类型的页面,标题是帖子类型的标题(即视频、照片、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; ?>
最合适的回答,由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; ?>
这应该涵盖所有帖子类型,而不是在添加更多帖子时必须添加条件。