WordPress:所有帖子都在呈现,而不是在分类页面上仅呈现指定的分类帖子

WordPress: All posts are rendering instead of rendering only assigned taxonomy posts on taxonomy page

我有一个 products post 类型,它有多个类别。目前大约有五十多个 post 被分配到不同的类别。注意:我正在使用名为 product_categories.

自定义分类法

场景:

  1. 我有一个名为 food-products 的类别,它有一个子类别 chocolates, dairy, grocery
  2. 现在,当用户转到类别页面时,例如 site.com/product-category/food-products 当时 所有其他类别 post 也会显示 但是 当我点击子类别选项卡菜单时,它会显示正确分配的子类别 posts

所以,我的问题是子类别 post 中唯一受尊重的类别如何才能在页面加载时显示?

<?php $loop = new WP_Query(array('post_type' => 'product', 'posts_per_page' => -1));
$count =0; ?>        
<div class="row portfolio-container">
<?php if ( $loop ) : while ( $loop->have_posts() ) : $loop->the_post(); 
  $url = get_the_post_thumbnail_url( $post_id, 'thumbnail_size' );
  $terms = get_the_terms( $post->ID, 'product_categories' );
  if ( $terms && ! is_wp_error( $terms ) ) : 
    $links = array();
    foreach ( $terms as $term )  { $links[] = $term->name; }
      $links = str_replace(' ', '-', $links); 
      $tax = join( " ", $links );     
  else :  
    $tax = '';  
  endif; ?>      
  <div class="col-lg-4 col-md-6 portfolio-item <?php echo strtolower($tax); ?>">
    <div class="portfolio-wrap">
      <img src="<?php echo $url;?>" class="img-fluid" alt="">
      <div class="portfolio-info">
        <h4><a href="<?php the_permalink() ?>"><?php the_title();?></a></h4>
        <div class="portfolio-links">
          <a href="<?php echo $url; ?>" data-lightbox="portfolio" data-title="App 1" class="link-preview" title="Preview"><i class="ion ion-eye"></i></a>
          <a href="<?php the_permalink() ?>" class="link-details" title="More Details"><i class="ion ion-android-open"></i></a>
        </div>
      </div>
    </div>
  </div>
  <?php endwhile;?>
  <?php wp_reset_query();?>
  <?php endif;?>
</div>

JQuery:

$(window).on('load', function () {
  var portfolioIsotope = $('.portfolio-container').isotope({
    itemSelector: '.portfolio-item'
  });
  $('#portfolio-flters li').on( 'click', function() {
    $("#portfolio-flters li").removeClass('filter-active');
    $(this).addClass('filter-active');
    portfolioIsotope.isotope({ filter: $(this).data('filter') });
  });
});

这是我的作品demo video以供审阅。

您的 WP_Query 正在 returning 所有产品,这就是为什么它们都在页面加载时显示的原因。您需要更改查询,以便它只获取您想要的 category/categories 中的查询。

您想获取特定类别的产品,例如food-products 及其所有子类别,(例如 chocolates)。

为此,您可以更改 WP_Query 以指定要使用的类别,如下所示:

$loop = new WP_Query(
               array('post_type' => 'product', 
                     'posts_per_page' => -1, 
                      array( 'category_name' => 'food-products' ) // <-- THIS!! Also note that it is in an array
               ));

这告诉 WP_Query 获取属于 food-products 类别的 所有 product 个帖子,因此它将 return food-products 类别 的任何产品以及 child 类别的任何产品,例如chocolates

WP_Query 有许多不同的方法可以按类别查询...查看 category section of the WP_Query documentation 了解更多信息。


更新:自定义分类法

您可以对自定义分类法执行相同的操作,但您需要在参数中使用 tax_query 而不是 category_name。你的 WP_Query 应该是这样的:

// you don't need to create a variable for the args, if just makes it clearer in the example
$args = array (
    'post_type' => 'product', 
    'posts_per_page' => -1, 
    'tax_query' => array(
        array(                            // note the nested arrays
              'taxonomy' => 'product_categories',  // this is the name of your custom taxonomy
              'field' => 'slug',          // you can search by slug, name, term_id or term_taxonomy_id
              'terms' => 'food-products'  // the taxonomy slug to search for
        )
    )
);

$loop = new WP_Query($args);

您可能需要更改 taxonomyterm 的值以匹配您的自定义分类。我还假定您正在通过 slug 进行搜索,但您可以通过名称或 ID 进行搜索。

tax_query 有一个 include_children 参数,用于表示是否包含 children(例如 chocolates),但这默认为 true,因此只有在 不想 想要包含 children 时才需要使用它。

点击此处taxonomy section of the WP_Query documentation了解更多信息。


更新 2:获取当前类别的产品

您在评论中说您有一个适用于所有条款的模板 taxonomy-product_categories.php,每个类别都使用此模板在其自己的页面中显示,但您只想显示具有当前条款的产品。

您需要做的是只使用 WP_Query 中的当前术语,而不是全部。您应该能够使用 get_queried_object() 获取当前术语并在您的 tax_query 中使用它,而不是对特定术语进行硬编码。

// get the term of the current page
// We can then use $currentterm->slug in tax_query to dynamically search for this term instead of hard coding a specific term
$currentterm = get_queried_object();

$args = array (
    'post_type' => 'product', 
    'posts_per_page' => -1, 
    'tax_query' => array(
        array(                            // note the nested arrays
              'taxonomy' => 'product_categories',  // this is the name of your custom taxonomy
              'field' => 'slug',          // you can search by slug, name, term_id or term_taxonomy_id
              'terms' => $currentterm->slug  // search for the slug of the current term
        )
    )
);
$loop = new WP_Query($args);

所以这应该做的是:如果你在site.com/product-category/food-products,它会得到当前术语food-products,然后只搜索该类别的产品。 当你去例如site.com/product-category/home-decor,它将动态选择新词作为 home-decor 并在查询中使用它。