WordPress:所有帖子都在呈现,而不是在分类页面上仅呈现指定的分类帖子
WordPress: All posts are rendering instead of rendering only assigned taxonomy posts on taxonomy page
我有一个 products
post 类型,它有多个类别。目前大约有五十多个 post 被分配到不同的类别。注意:我正在使用名为 product_categories
.
的 自定义分类法
场景:
- 我有一个名为
food-products
的类别,它有一个子类别 chocolates, dairy, grocery
。
- 现在,当用户转到类别页面时,例如
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);
您可能需要更改 taxonomy
和 term
的值以匹配您的自定义分类。我还假定您正在通过 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
并在查询中使用它。
我有一个 products
post 类型,它有多个类别。目前大约有五十多个 post 被分配到不同的类别。注意:我正在使用名为 product_categories
.
场景:
- 我有一个名为
food-products
的类别,它有一个子类别chocolates, dairy, grocery
。 - 现在,当用户转到类别页面时,例如
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);
您可能需要更改 taxonomy
和 term
的值以匹配您的自定义分类。我还假定您正在通过 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
并在查询中使用它。