如何根据分类术语显示帖子列表?

时间:2016-09-28 作者:bdtheme

我有一个名为“football\\u fixture”的CPT。这个CPT有一个名为“竞争”的分类法,这个分类法有不同的术语laliga,eng。我想显示我的帖子如下:
laliga:
包括上述术语在内的所有已发布帖子的列表<包括上述条款在内的所有已发布帖子的列表
我使用以下代码,但它显示的内容如图1所示。enter image description here

我想要类似帖子的图片2:enter image description here图1:以下是我使用的代码:

<?php
/**
* Template Name: Fixture
* Description: The template for displaying all  posts and attachments
*/
?>
<?php get_header(); ?>
<?php


$paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;
$term_id = get_queried_object()->term_id;

$args = array( \'post_type\' => \'football_fixture\',
                \'paged\' => $paged,

            );

    query_posts( $args );
?>

<?php if(have_posts()): ?>
    <div class="<?php echo $col; ?>">


        <?php while(have_posts()): ?>
            <?php the_post(); ?>

            <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
                 <?php
                    $id         = get_the_ID();
                    $date       = rwmb_meta( \'pb_match_date\',\'\', $post->ID);
                    $time       = rwmb_meta( \'pb_match_time\',\'\', $post->ID );
                    $competition = rwmb_meta( \'pb_match_competition_cats\',\'\', $post->ID );
                    $team_a     = get_post_meta( $post->ID, \'match_details_home_team\', true );
                    $team_b     = get_post_meta( $post->ID, \'match_details_away_team\', true );

                ?>
                <div class="fixture-item">
                    <div class="fixture-info clearfix">
                        <p class="pull-left match-date"><?php echo ($date); ?></p>
                        <p class="pull-left match-date">
                        <?php 

                        $terms = get_the_terms( get_the_ID(), \'competition\' ); // \'taxonomy\' field doesn\'t store term IDs in the custom fields, instead, it sets post terms
                        if ( !empty( $terms ) ) {
                            $content = \'<ul>\';
                            foreach ( $terms as $term ) {
                                $content .= sprintf(
                                    \'<li><a href="%s" title="%s">%s</a></li>\',
                                    get_term_link( $term, \'tax_slug\' ),
                                    $term->name,
                                    $term->name
                                );
                            }
                            $content .= \'</ul>\';
                            echo $content;
                        }
                        ?>

                        </p>
                    </div>

                    <div class="row">
                        <div class="col-xs-4">
                            <div class="media">

                                <div class="media-body">
                                    <h4><?php echo $team_a; ?></h4>
                                </div>
                            </div>
                        </div>

                        <div class="col-xs-4 match-time">
                            <i class="fa fa-clock-o"></i> <?php echo $time; ?>
                        </div>

                        <div class="col-xs-4">
                            <div class="media">

                                <div class="media-body">
                                    <h4 class="pull-right"><?php echo $team_b; ?></h4>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div><!--/#post-->
        <?php endwhile; ?>

        <?php 
            wp_reset_query();
        ?>

    </div>
    <?php endif; ?>

<?php get_footer(); ?>

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

在自定义模板中,首先必须获取自定义帖子类型的所有术语。

您可以使用get_terms 检索分类中的术语

如果您使用的是4.5之前的wordpress

$terms = get_terms( \'competition\' , array(
    \'hide_empty\' => false
) );
或者如果您使用的是4.5.0或更高版本之前的wordpress

$terms = get_terms( array(
    \'taxonomy\' => \'competition\',
    \'hide_empty\' => false,
) ); 
下一个生成术语名称列表:

$termNames = array();
$count = count( $terms );
if ( $count > 0 ) {
    foreach ( $terms as $term ) {
        $termNames[] = $term->name;
    }
}
下一个循环遍历每个术语并查询当前术语的帖子;然后运行循环:

foreach($termNames as $termName) :

$args = array(
    \'post_type\' => \'football_fixture\',
    \'competition\' => $termName,
    \'order\' => \'ASC\',
);
query_posts( $args );
if(have_posts()): ?>
    <div class="<?php echo $col; ?>">
        <h2><?php echo $termName; ?></h2>
        <?php while(have_posts()):  the_post(); ?>
        <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
             <?php
                $id         = get_the_ID();
                $date       = rwmb_meta( \'pb_match_date\',\'\', $post->ID);
                $time       = rwmb_meta( \'pb_match_time\',\'\', $post->ID );
                $competition = rwmb_meta( \'pb_match_competition_cats\',\'\', $post->ID );
                $team_a     = get_post_meta( $post->ID, \'match_details_home_team\', true );
                $team_b     = get_post_meta( $post->ID, \'match_details_away_team\', true );

            ?>
            <div class="fixture-item">
                <div class="row">
                    <div class="col-xs-4">
                        <div class="media">
                            <div class="media-body">
                                <h4><?php echo $team_a; ?></h4>
                            </div>
                        </div>
                    </div>

                    <div class="col-xs-4 match-time">
                        <i class="fa fa-clock-o"></i> <?php echo $time; ?>
                    </div>

                    <div class="col-xs-4">
                        <div class="media">
                            <div class="media-body">
                                <h4 class="pull-right"><?php echo $team_b; ?></h4>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div><!--/#post-->
    <?php endwhile; ?>

    <?php 
        wp_reset_query();
    ?>

SO网友:Aurovrata

你需要query for your posts which have a the associated custom taxonomy term(s),

$args = array(
  \'post_type\' => \'football_fixture\',
  \'tax_query\' => array(
      array(
        \'taxonomy\' => \'competition\',
        \'field\'    => \'term_id\',
        \'terms\'    => array($term_id),  //put more term ids if required
      ),
    ),
  );
$query = new WP_Query( $args );
if($query->have_posts()){
  while($query->have_posts()){
    $query->the_post();
    echo \'<li>\' . get_the_title( $query->post->ID ) . \'</li>\';
  }

  // Restore original Post Data once finished, IMPORTANT
  wp_reset_postdata();
}
现在,你需要$term_id 为了确保上述查询有效,在您的示例中,您在顶部有以下行,

$term_id = get_queried_object()->term_id;
然而,the function get_queried_object 将只返回分类法模板的term\\u id,您要做的是在page template, 当页面标题以开头时,

 <?php
 /**
 * Template Name: Fixture    -- this indicates that you are building a page template
因此,您将无法访问任何术语id。您有2个选项可以获得您想要的结果,

在页面模板中硬编码术语ID,或将其作为URL属性中的参数传递taxonomy archive template, 因此,您可以直接在菜单中使用自定义分类术语,用户将单击术语链接,WordPress将解析术语id到您的页面

综合起来,我推荐第二种选择。创建一个名为taxonomy-competition.php 并使用以下内容将其保存在根主题或子主题文件夹中,

<?php
/**
 * Taxonomy \'competition\' archive template
 */
get_header();

$term_id = get_queried_object()->term_id;
$args = array(
  \'post_type\' => \'football_fixture\',
  \'tax_query\' => array(
      array(
        \'taxonomy\' => \'competition\',
        \'field\'    => \'term_id\',
        \'terms\'    => array($term_id),  //put more term ids if required
      ),
    ),
  );
$query = new WP_Query( $args );

echo \'<ul>\';
if($query->have_posts()){
  while($query->have_posts()){
    $query->the_post();
    echo \'<li>\' . get_the_title( $query->post->ID ) . \'</li>\';
  }

  // Restore original Post Data once finished, IMPORTANT
  wp_reset_postdata();
}
echo \'</ul>\';

get_footer();
这将显示根据给定术语组织的帖子标题列表。

要在前端使用它,请添加自定义分类法competition 要显示的术语navigational menu in the dashboard. 如果无法看到分类菜单选项,请确保在仪表板页面顶部的“屏幕选项”选项卡中选中该选项。

相关推荐

GET_THE_TERMS与wp_GET_POST_TERMS中的奇怪结果

我正在尝试制作一个面包屑函数,但有一个小问题。。。使用时:$categories = get_the_terms( $post->ID, \'product_cat\' ); 我得到了一个循环中使用的类别数组,等等。唯一的问题是它是按字母顺序排列的。(我希望它按层次顺序排列。)经过一番挖掘,我发现了一种替代方法,即使用wp\\u get\\u post\\u terms(),但我肯定遗漏了一些东西,因为当我使用此方法时:$categories = wp_get_post_terms( $p