在分类页面上显示标签

Displaying Tags on taxonomy page

我目前在我的 CMS 中有一个选项,可以将标签添加到我的自定义 post 类型的单页中。

现在,我想将此标签显示为 'featured' 项目。 因此,在我的分类法-'filename' 中,我使用以下代码收集标签并将它们显示在分类法页面中:

            <?php 
        $args = array(
          'tag_slug__and' => array('sector1'),
          'post_type' => array( 'sectors' )
          );
        $loop = new WP_Query( $args );
        while ($loop->have_posts() ) : $loop->the_post();
        ?>
        <a href="<?php echo get_permalink(); ?>">
         <?php echo "<div class='col-md-6' style='margin-bottom:20px;'>"; ?>
         <div class="row mobilemargin">
          <div class="categorytiletextsector1">
            <div class="col-md-6 col-sm-6 col-xs-12 nopr"><?php echo get_the_post_thumbnail( $page->ID, 'categoryimage', array('class' => 'sector1img hovereffect')); ?> </div>
            <div class="col-md-6 col-sm-6 col-xs-12">
              <div class="testdiv">
               <h5><?php the_title(); ?></h5>
               <p><?php the_excerpt(); ?></p>
             </div>
           </div>
         </div>
       </div>
       <?php echo "</div>"; ?>

     </a>
   <?php endwhile; ?>
   <?php wp_reset_query(); ?>

现在,我的问题是,这会在每个类别页面上显示所选标签,因为它是在分类页面上设置的。

我怎样才能使它只在当前类别上设置。

所以如果我的项目在 'category A' 中,只有 'A' 的类别页面会显示这个,使用项目类别?

任何帮助都会很棒

编辑。 使用了这段代码,希望这能奏效,但运气不佳

$args = array(
    'tag_slug__and' => array( 'sector1' ),
    'post_type'     => array( 'sectors' ),
    'tax_query'     => array(
        array(
            'taxonomy' => 'sectors',
            'terms'    => get_queried_object_id(),
        ),
    ),
);

您的问题是您的自定义查询。这里有一个非常重要的注意事项是,永远不要在任何类型的存档页面或主页上用自定义查询替换主查询。我最近在 this post 中详细解释了所有内容。请务必阅读它和所有链接的帖子,因为这会让你受益匪浅

您的解决方案是删除您的自定义查询并将其替换为我们都知道的默认循环

if ( have_posts() ) {
    while ( have_posts() ) {
        the_post();

        // Your template tags and html mark up

    }
}

如果您需要更改主查询中的任何内容,请使用 pre_get_posts 进行更改

编辑

最好的办法是使用完整的 tax_query 来显示所选分类术语和标签中的帖子

您可以这样尝试:(至少需要 PHP 5.4+。另外,这个未经测试

$q = get_queried_object();
$args = [
    'post_type' => 'sectors',
    'tax_query' => [
        [
            'taxonomy' => $q->taxonomy,
            'terms' => $q->term_id,
            'include_children' => false // Exclude child terms
        ],
        [
            'taxonomy' => 'post_tag',
            'field' => 'slug',
            'terms' => 'sector1', //I believe this is the slug
        ],
    ],
];

对于较旧的 PHP 版本,请使用以下内容

$q = get_queried_object();
$args = array(
    'post_type' => 'sectors',
    'tax_query' => array(
        array(
            'taxonomy' => $q->taxonomy,
            'terms' => $q->term_id,
            'include_children' => false // Exclude child terms
        ),
        array(
            'taxonomy' => 'post_tag',
            'field' => 'slug',
            'terms' => 'sector1', //I believe this is the slug
        ),
    ),
);

编辑 2

要排除 sector1 标签和任何其他 sectorX 标签中的帖子,您可以执行以下操作

您可以这样尝试:(至少需要 PHP 5.4+。另外,这个未经测试

$q = get_queried_object();
$args = [
    'post_type' => 'sectors',
    'tax_query' => [
        [
            'taxonomy' => $q->taxonomy,
            'terms' => $q->term_id,
            'include_children' => false // Exclude child terms
        ],
        [
            'taxonomy' => 'post_tag',
            'field' => 'slug',
            'terms' => 'sector1', //I believe this is the slug
            'operator' => 'NOT_IN'
        ],
    ],
];

对于较旧的 PHP 版本,请使用以下内容

$q = get_queried_object();
$args = array(
    'post_type' => 'sectors',
    'tax_query' => array(
        array(
            'taxonomy' => $q->taxonomy,
            'terms' => $q->term_id,
            'include_children' => false // Exclude child terms
        ),
        array(
            'taxonomy' => 'post_tag',
            'field' => 'slug',
            'terms' => 'sector1', //I believe this is the slug
            'operator' => 'NOT_IN'
        ),
    ),
);

请注意,您可以像这样将标签数组传递给 terms 参数

'terms' => array( 'sector1', 'sector2', 'etc' ),

或短数组语法

'terms' => ['sector1', 'sector2', 'etc'],

编辑 3

由于这是您的主要查询,您需要进行一些更改。正如我所说,删除自定义查询。你的主循环应该看起来像这样

<?php if (have_posts()) : ?> 
    <?php while (have_posts()) : the_post(); ?> 
        <a href="<?php echo get_permalink(); ?>"> 
        <?php echo "<div class='col-md-6 col-sm-6 col-xs-12' style='margin-bottom:30px;'>"; ?> 
        <div class="row mobilemargin"> 
            <div class="categorytiletext2"> 
                <div class="col-md-6 col-sm-12 col-xs-12 nopr"><?php echo get_the_post_thumbnail( $page->ID, 'categoryimage', array('class' => 'hovereffect newimgheight')); ?> </div> 
                <div class="col-md-6 col-sm-12 col-xs-12 mobilewhite"> 
                    <div class="testdiv"> 
                        <h5 class="captext"><?php the_title(); ?></h5> 
                        <?php $trimexcerpt = get_the_excerpt(); 

                        $shortexcerpt = wp_trim_words( $trimexcerpt, $num_words = 10, $more = '… ' ); 

                        echo '<a href="' . get_permalink() . '"><p>' . $shortexcerpt . '</p></a>'; 

                        ?> 
                    </div> 
                </div> 
            </div> 
        </div> 
        <?php echo "</div>"; ?> 

        </a> 
        <!-- If there is no posts, display an error message --> 
    <?php endwhile; 
else: ?> 
    <p><?php _e('Sorry, no posts matched your criteria.'); ?></p> 
<?php endif; ?> 
<!-- If there is no posts, display an error message -->

您现在可以使用 pre_get_posts 从您的分类页面中删除所需的标签。在您的 functions.php 中,执​​行以下操作:(需要 PHP 5.3+,并且还未经测试

add_action( 'pre_get_posts', function ( $q )
{
    if ( !is_admin() && $q->is_main_query() && $q->is_tax() ) {
       $q->set( 'tag__not_in', array( 145 ) );
    }
});

旧版本使用

add_action( 'pre_get_posts', 'so30256167_remove_tags' );
function so30256167_remove_tags( $q )
{
    if ( !is_admin() && $q->is_main_query() && $q->is_tax() ) {
       $q->set( 'tag__not_in', array( 145 ) );
    }
}

请记住将 145 更改为您的确切标签 id 或标签数组 ids

编辑 4

如果您没有标签 ID,可以使用 get_term_by() 从标签 slug 中获取标签 ID。像这样的事情会做:(需要PHP 5.3+,并且还未经测试

add_action( 'pre_get_posts', function ( $q )
{
    if ( !is_admin() && $q->is_main_query() && $q->is_tax() ) {
        $tag_object = get_term_by( 'slug', 'sector1', 'post_tag' ); 
        $tagID = $tag_object->term_id; 

       $q->set( 'tag__not_in', array( $tagID ) );
    }
});

旧版本使用

add_action( 'pre_get_posts', 'so30256167_remove_tags' );
function so30256167_remove_tags( $q )
{
    if ( !is_admin() && $q->is_main_query() && $q->is_tax() ) {
        $tag_object = get_term_by( 'slug', 'sector1', 'post_tag' ); 
        $tagID = $tag_object->term_id; 

       $q->set( 'tag__not_in', array( $tagID ) );
    }
}

如果你有一组标签块,你可以替换下面的

$tag_object = get_term_by( 'slug', 'sector1', 'post_tag' ); 
$tagID = $tag_object->term_id; 

$q->set( 'tag__not_in', array( $tagID ) );/*

$tag_array = array( 'slug1', 'slug2', 'slug3' );
foreach ( $tag_array as $tag ) {
    $tag_object = get_term_by( 'slug', $tag, 'post_tag' ); 
    $tagids[] = $tag_object->term_id;
} 
$q->set( 'tag__not_in', $tagids );

只要记得相应地更改 slugs

编辑 5

你在 functions.php 和 pre_get_posts 中的最终代码应该是

add_action( 'pre_get_posts', 'so30256167_remove_tags' );
function so30256167_remove_tags( $q )
{
    if ( !is_admin() && $q->is_main_query() && $q->is_tax() ) {
        $tag_array = array( 'sector1', 'sector2', 'sector3', 'sector4' );
        foreach ( $tag_array as $tag ) {
            $tag_object = get_term_by( 'slug', $tag, 'post_tag' ); 
            $tagids[] = $tag_object->term_id;
        } 
        $q->set( 'tag__not_in', $tagids );    
    }
}