在分类法页面

时间:2015-05-15 09:38:09

标签: php wordpress tags custom-post-type taxonomy

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

现在,我想将此标记显示为“特色”标记。项目。 因此,在我的分类 - '文件名'中,我使用以下代码收集标记并在分类页面中显​​示它们:

            <?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(); ?>

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

如何才能在当前类别中设置此项。

因此,如果我的商品位于&#39;类别A&#39;中,则只有&#39; A&#39;的类别页面。会显示这个,使用项目类别?

任何帮助都会很棒

编辑。 使用此代码,希望这应该工作,但没有运气

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

1 个答案:

答案 0 :(得分:1)

您的问题是您的自定义查询。这里有一个非常重要的注意事项,永远不会更改主查询替换任何类型的存档页面或主页上的自定义查询。我最近在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 或标记数组 ID

编辑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 ) );
    }
}

如果你有一系列标签slugs,你可以替换以下

$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 );

请记住相应更改slu it

编辑5

带有pre_get_posts的functions.php中的最终代码应为

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 );    
    }
}