Wordpress如何显示基于标签的所有帖子



我有三个标签:

  • 标记1
  • 标签2
  • 标记
  • 3

我需要显示我的custom post type和指定术语中的所有帖子。他们需要be sorted by tag并隐藏不被使用的标签,像这样:

  • 标记1

    • Post A
    • Post C
  • 标签2

    • Post B

但是它是这样显示的:

  • 标记1

    • Post A
    • Post C
  • 标签2

    • Post B
  • 标记
  • 3

    • (空的)

标签3正在显示,即使目前没有帖子使用标签…

下面是我使用的代码:
// These 3 variables change dynamically depending on page slug.
$cpt = houses;
$tax = type;
$term = small;
$args = array(
'posts_per_page'    => -1,
'orderby'           => 'name',
'order'             => 'ASC',
'post_type'         => $cpt,
'tax_query'         => array(
array(
'taxonomy'      => $tax,
'field'         => 'name',
'terms'         => $term
)
)
);
$tags = get_tags($args); // Tag 1, Tag 2, Tag 3
$posts = get_posts($args);
foreach($tags as $tag)
{
?>
<h5><?php echo $tag->name.' (Tag)'; ?></h5>
<?php
foreach($posts as $post)
{
if( has_tag( $tag ) )
{
?>
<a href="<?php echo the_permalink();?>"><?php echo the_title().' (Post)';?></a><br>
<?php
}
}
?>
<hr>
<?php
}
?>
我很感激你的帮助!

你的代码逻辑应该是这样的:

  • get_tag每个标签的
      • 获取相关帖子(在这里运行get_posts)
      • 只有在有职位的情况下
        • 返回标签的标题
        • 为每个相关的帖子(在这里为帖子运行foreach循环)
          • echo post的标题

因此,您可以将get_posts查询移动到foreach($tags as $tag)中,并使用$tag参数来查看是否有与该标记相关的任何帖子。

请注意,在$posts_args中,我使用了一个名为tag的额外参数,它将在tags foreach loop中为您完成此操作。tag参数的值是标记段符。

Tag arguments you could pass into your queryDocs

同样通过使用get_tags函数,您不必指定orderbyorder,因为'orderby'的默认值是'name', 'order'的默认值是'ASC',所以您不需要将它们作为参数传递。


所以整个代码应该是这样的:

$cpt = houses;
$tax = type;
$term = small;
$posts_args = array(
'posts_per_page'    => -1,
'orderby'           => 'name',
'order'             => 'ASC',
'post_type'         => $cpt,
'tag'               => $tag->slug,
//OR
//'tag_slug__in'      => array($tag->slug),
'tax_query'         => array(
array(
'taxonomy'      => $tax,
'field'         => 'name',
'terms'         => $term
)
)
);
$tags = get_tags(); // Tag 1, Tag 2, Tag 3
foreach ($tags as $tag) {
$posts = get_posts($posts_args);
if ($posts) { ?>
<h5><?php echo $tag->name . ' (Tag)'; ?></h5>
<?php
foreach ($posts as $post) { ?>
<a href="<?php echo the_permalink(); ?>"><?php echo the_title() . ' (Post)'; ?></a><br>
<?php
}
?>
<hr>
<?php
}
}
?>

输出如下:

Tag 1
Post A
Post C
--------
Tag 2
Post B 

如果你能让它工作,请告诉我!

相关内容

  • 没有找到相关文章

最新更新