关于标题我很抱歉,我不知道如何把问题以标题的形式很好地表达出来,但我的问题如果很描述性的话。
我想问这个问题已经有一段时间了,真的!我想知道,所以我会尽可能地描述和详细。首先,让我告诉你目前的情况以及情况如何。
我有一个Custom Post Type of "Products"
由自定义帖子类型UI插件创建
随着two custom Taxonomies of "Types" and "Countries"
在我的分类法中用作我的产品的过滤器。php
好了,现在你了解了设置,这就是我所做的,假设我有一家衬衫店,我正在根据“国家”和“类型”筛选我的产品
国家/地区:
美国
中国
法国
类型:
棉花
丝绸
聚酯纤维
现在开始我的分类法。php我在左侧列出了所有自定义帖子类型的产品Countries
和Types
因此,人们可以通过它们进行过滤,并看到合适的产品。
The problem:
当我进入我的衬衫页面,在那里我看到了我所有的衬衫,我可以在左侧看到“类型”,所以假设我然后点击
cotton
现在我可以看到我的所有自定义帖子类型的产品
cotton
这很好,但现在这就是问题所在。当我在
cotton
分类学术语
Types
我可以在左边看到我的国家条款,当我点击时,让我们说
USA
我看到了所有
Products
列在美国条款下,但那是
NOT 我想要什么。我想要它,这样当我在棉花上,然后点击
Country
Term of USA
我只会看到
cotton
使用美国国家术语
NOT 美国条款下的所有产品。
函数中的我的代码。php for my products in my taxonomy(我的分类法)页面以正确显示分页:
add_action( \'pre_get_posts\', function ( $q ) {
if( !is_admin() && $q->is_main_query() && $q->is_tax() ) {
$q->set( \'posts_per_page\', 2 );
$q->set( \'orderby\', \'name\' );
$q->set( \'order\', \'ASC\' );
}
});
然后在我的分类法中。php我在左侧设置了我的产品和自定义分类过滤器,如下所示:
// listing all of my Types Terms of the current term on the left using it as filters for my shirts.
<div class="categories types">
<p>Types</p>
<ul>
<?php
//get the current term
$current_term = get_term_by( \'slug\', get_query_var( \'term\' ), get_query_var( \'taxonomy\' ) );
//then set the args for wp_list_categories
$args = array(
\'child_of\' => $current_term->term_id,
\'taxonomy\' => \'types\',
\'hide_empty\' => 1,
\'order\' => \'ASC\',
\'show_count\' => 1,
\'hierarchical\' => true,
\'depth\' => 1,
\'title_li\' => \'\'
);
wp_list_categories( $args );
?>
</ul>
</div><!--categories end-->
// listing all of my Types Terms of the current term on the left using it as filters for my shirts.
<div class="categories countries">
<p>Types</p>
<ul>
<?php
//get the current term
$current_term = get_term_by( \'slug\', get_query_var( \'term\' ), get_query_var( \'taxonomy\' ) );
//then set the args for wp_list_categories
$args = array(
\'child_of\' => $current_term->term_id,
\'taxonomy\' => \'countries\',
\'hide_empty\' => 1,
\'order\' => \'ASC\',
\'show_count\' => 1,
\'hierarchical\' => true,
\'depth\' => 1,
\'title_li\' => \'\'
);
wp_list_categories( $args );
?>
</ul>
</div><!--categories end-->
//listing my products custom post types
<div class="products">
<?php while( have_posts() ) : the_post(); ?>
//the loop
<?php the_field(\'title\'); ?>
<?php the_field(\'image\'); ?>
<?php endwhile; ?>
//pagination
<?php
global $wp_query;
$total_pages = $wp_query->max_num_pages;
if ($total_pages > 1){
$current_page = max(1, get_query_var(\'paged\'));
echo paginate_links(array(
\'base\' => get_pagenum_link(1) . \'%_%\',
\'format\' => \'/page/%#%\',
\'current\' => $current_page,
\'total\' => $total_pages,
\'before_page_number\' => \'<div class="pagination-navigation">\',
\'after_page_number\' => \'</div>\'
));
}
?>
</div><!--products end-->
正如你在上面看到的,这是我的函数。php和我的分类法。php。
所以我一直在思考这个问题,我可以使用什么样的逻辑,而iv只能想出一种可能的方法。所以我对国家的分类是个问题,因为当我点击一个国家USA
我想看看我上个学期的国家cotton
和NOT 以下所有国家USA
.
很抱歉这么长时间的解释,但是CLICK HERE 看到我想要实现的目标,你就会完全理解。
SO网友:cybmeta
当您使用wp_list_categories()
您将获得一个术语列表,每个术语都链接到其归档页面。我认为您需要的是一个筛选产品的表单,而不是归档术语链接的列表,因此您可以在请求之间保留选定的筛选器,例如,使用$_POST
, $_SESSION
或$_COOKIES
.
示例使用$_POST
:
<?php
//taxonomies you want to filter
$taxonomies = array( "countries", "types" );
function get_terms_dropdown($taxonomy, $args){
$terms = get_terms($taxonomy, $args);
$output = \'<select id="\'.$taxonomy.\'" name="\'.$args[\'name\'].\'" multiple>\';
foreach($terms as $term){
in_array($term->term_id, $args[\'selected\']) ? $sel = \' selected\' : $sel = \'\';
$output .=\'<option value="\'.$term->term_id.\'"\'.$sel.\'>\'.$term->name.\'</option>\';
}
$output .="</select>";
return $output;
}
?>
<?php
//Set the action of the from to custom post type archive
?>
<form method="post" action="<?php echo get_post_type_archive_link(\'products\');?>" id="products-filter-form">
<?php
foreach($taxonomies as $taxonomy) {
//check if there is a previously selected terms
$selected = (!empty($_POST[\'tax_input\'][$taxonomy])) ? ($_POST[\'tax_input\'][$taxonomy]) : array();
$selected = array_map(\'intval\', $selected);
$args = array(
\'hide_empty\' => false,
\'selected\' => $selected,
\'name\' => \'tax_input[\'.$taxonomy.\'][]\',
);
echo get_terms_dropdown($taxonomy,$args);
}
?>
<button type="submit">Filter</button>
<button type="reset" value="reset">Reset</button>
</form>
现在,在preg\\u get\\u posts操作中,您将所选分类术语添加到查询中:
add_action( \'pre_get_posts\', \'cyb_pre_get_post\' );
function cyb_pre_get_post($query){
if($query->is_main_query() && !is_admin() && is_post_type_archive( \'products\' ) ) {
//taxonomies you want to filter
$taxonomies = array( "countries", "types" );
$tax_input = isset($_POST[\'tax_input\']) ? $_POST[\'tax_input\'] : \'\';
if(!empty($tax_input)){
//Ready to construct the tax_query
foreach($taxonomies as $taxonomy) {
if(isset($tax_input[$taxonomy])) {
$value = array_map(\'intval\', $tax_input[$taxonomy]);
if(!empty($value) && $value[0] != "0"){
$tax_query[] = array(
\'taxonomy\' => $taxonomy,
\'field\' => \'id\',
\'terms\' => $value
);
}
}
}
$query->set(\'tax_query\',$tax_query);
//The tax_query has been set
}
}
}
Note: 使用测试的代码
category
和
post_tag
分类法和它正在发挥作用。它可能需要一些修改才能完全满足您的需要。