Wordpress - 在前端按多个自定义分类法过滤自定义 Post 类型
Wordpress - Filtering Custom Post Type by multiple Custom Taxonomies on front end
我正在尝试允许用户使用来自多个自定义分类的 select 条件,以便通过具有多个 select 的 from 在前端过滤自定义 post 类型.
我的问题是代码只有在每个 select 都有标准 selected 时才有效。试图找到一种方法,让用户也可以 select 其中一个选项,并且它只会按该选项过滤 CPT。
* 所有代码都是抽象的。分类名称实际上是:incident_category、incident_classification、incident_type、等
标记:
<form action="<?php echo site_url() ?>/wp-admin/admin-ajax.php" method="POST" id="filter">
<?php
if( $terms = get_terms( array(
'taxonomy' => 'tax1',
) ) ) :
echo '<select name="tax1filter"><option value="">Select tax1...</option>';
foreach ( $terms as $term ) :
echo '<option value="' . $term->term_id . '">' . $term->name . '</option>';
endforeach;
echo '</select>';
endif;
if( $terms = get_terms( array(
'taxonomy' => 'tax2',
) ) ) :
echo '<select name="tax2filter"><option value="">Select tax2...</option>';
foreach ( $terms as $term ) :
echo '<option value="' . $term->term_id . '">' . $term->name . '</option>';
endforeach;
echo '</select>';
endif;
if( $terms = get_terms( array(
'taxonomy' => 'tax3',
) ) ) :
echo '<select name="tax3filter"><option value="">Select tax3...</option>';
foreach ( $terms as $term ) :
echo '<option value="' . $term->term_id . '">' . $term->name . '</option>';
endforeach;
echo '</select>';
endif;
?>
<button>Apply filter</button>
<input type="hidden" name="action" value="myfilter">
</form>
<div id="loop"></div>
JS:
jQuery(function($){
$('#filter').submit(function(){
var filter = $('#filter');
$.ajax({
url:filter.attr('action'),
data:filter.serialize(), // form data
type:filter.attr('method'), // POST
beforeSend:function(xhr){
filter.find('button').text('Processing...'); // changing the button label
},
success:function(data){
filter.find('button').text('Apply filter'); // changing the button label back
$('#loop').html(data); // insert data
}
});
return false;
});
});
函数:
add_action('wp_ajax_myfilter', 'misha_filter_function'); // wp_ajax_{ACTION HERE}
add_action('wp_ajax_nopriv_myfilter', 'misha_filter_function');
function misha_filter_function(){
$args = array(
'post_type' => 'cpt',
'orderby' => 'date',
'order' => 'DESC',
);
$relation = 'OR';
if(isset($_POST['tax1filter']) && isset( $_POST['tax2filter'] ) && isset( $_POST['tax3filter'] )) {
$relation = 'AND';
}
if( isset( $_POST['tax1filter'] ) || isset( $_POST['tax2filter'] || isset( $_POST['tax3filter']) )
$args['tax_query'] = array(
'relation' => $relation,
array(
'taxonomy' => 'tax1',
'field' => 'id',
'terms' => $_POST['tax1filter']
),
array(
'taxonomy' => 'tax2',
'field' => 'id',
'terms' => $_POST['tax2filter'],
),
array(
'taxonomy' => 'tax3',
'field' => 'id',
'terms' => $_POST['tax3filter'],
),
);
$query = new WP_Query( $args );
if( $query->have_posts() ) :
while( $query->have_posts() ): $query->the_post();
echo '<h5>' . $query->post->post_title . '</h5>';
endwhile;
wp_reset_postdata();
else :
echo 'No posts found';
endif;
die();
};
如有任何帮助,我们将一如既往地不胜感激!
这似乎得到了你所需要的:
function misha_filter_function(){
$taxonomies = get_taxonomies();;
$args = array(
'post_type' => 'cpt',
'orderby' => 'date',
'order' => 'DESC',
);
$relation = 'AND';
$params = array();
$args['tax_query']['relation'] = $relation;
foreach ( $taxonomies as $tax ) {
if( isset( $_POST[ $tax . 'filter' ] ) && !empty( $_POST[ $tax . '_filter' ] ) {
$args['tax_query'][] = array(
'taxonomy' => $tax,
'field' => 'id',
'terms' => $_POST[ $tax . 'filter' ],
);
}
}
$query = new WP_Query( $args );
if( $query->have_posts() ) :
while( $query->have_posts() ): $query->the_post();
echo '<h5>' . $query->post->post_title . '</h5>';
endwhile;
wp_reset_postdata();
else :
echo 'No posts found';
endif;
die();
};
我正在尝试允许用户使用来自多个自定义分类的 select 条件,以便通过具有多个 select 的 from 在前端过滤自定义 post 类型.
我的问题是代码只有在每个 select 都有标准 selected 时才有效。试图找到一种方法,让用户也可以 select 其中一个选项,并且它只会按该选项过滤 CPT。
* 所有代码都是抽象的。分类名称实际上是:incident_category、incident_classification、incident_type、等
标记:
<form action="<?php echo site_url() ?>/wp-admin/admin-ajax.php" method="POST" id="filter">
<?php
if( $terms = get_terms( array(
'taxonomy' => 'tax1',
) ) ) :
echo '<select name="tax1filter"><option value="">Select tax1...</option>';
foreach ( $terms as $term ) :
echo '<option value="' . $term->term_id . '">' . $term->name . '</option>';
endforeach;
echo '</select>';
endif;
if( $terms = get_terms( array(
'taxonomy' => 'tax2',
) ) ) :
echo '<select name="tax2filter"><option value="">Select tax2...</option>';
foreach ( $terms as $term ) :
echo '<option value="' . $term->term_id . '">' . $term->name . '</option>';
endforeach;
echo '</select>';
endif;
if( $terms = get_terms( array(
'taxonomy' => 'tax3',
) ) ) :
echo '<select name="tax3filter"><option value="">Select tax3...</option>';
foreach ( $terms as $term ) :
echo '<option value="' . $term->term_id . '">' . $term->name . '</option>';
endforeach;
echo '</select>';
endif;
?>
<button>Apply filter</button>
<input type="hidden" name="action" value="myfilter">
</form>
<div id="loop"></div>
JS:
jQuery(function($){
$('#filter').submit(function(){
var filter = $('#filter');
$.ajax({
url:filter.attr('action'),
data:filter.serialize(), // form data
type:filter.attr('method'), // POST
beforeSend:function(xhr){
filter.find('button').text('Processing...'); // changing the button label
},
success:function(data){
filter.find('button').text('Apply filter'); // changing the button label back
$('#loop').html(data); // insert data
}
});
return false;
});
});
函数:
add_action('wp_ajax_myfilter', 'misha_filter_function'); // wp_ajax_{ACTION HERE}
add_action('wp_ajax_nopriv_myfilter', 'misha_filter_function');
function misha_filter_function(){
$args = array(
'post_type' => 'cpt',
'orderby' => 'date',
'order' => 'DESC',
);
$relation = 'OR';
if(isset($_POST['tax1filter']) && isset( $_POST['tax2filter'] ) && isset( $_POST['tax3filter'] )) {
$relation = 'AND';
}
if( isset( $_POST['tax1filter'] ) || isset( $_POST['tax2filter'] || isset( $_POST['tax3filter']) )
$args['tax_query'] = array(
'relation' => $relation,
array(
'taxonomy' => 'tax1',
'field' => 'id',
'terms' => $_POST['tax1filter']
),
array(
'taxonomy' => 'tax2',
'field' => 'id',
'terms' => $_POST['tax2filter'],
),
array(
'taxonomy' => 'tax3',
'field' => 'id',
'terms' => $_POST['tax3filter'],
),
);
$query = new WP_Query( $args );
if( $query->have_posts() ) :
while( $query->have_posts() ): $query->the_post();
echo '<h5>' . $query->post->post_title . '</h5>';
endwhile;
wp_reset_postdata();
else :
echo 'No posts found';
endif;
die();
};
如有任何帮助,我们将一如既往地不胜感激!
这似乎得到了你所需要的:
function misha_filter_function(){
$taxonomies = get_taxonomies();;
$args = array(
'post_type' => 'cpt',
'orderby' => 'date',
'order' => 'DESC',
);
$relation = 'AND';
$params = array();
$args['tax_query']['relation'] = $relation;
foreach ( $taxonomies as $tax ) {
if( isset( $_POST[ $tax . 'filter' ] ) && !empty( $_POST[ $tax . '_filter' ] ) {
$args['tax_query'][] = array(
'taxonomy' => $tax,
'field' => 'id',
'terms' => $_POST[ $tax . 'filter' ],
);
}
}
$query = new WP_Query( $args );
if( $query->have_posts() ) :
while( $query->have_posts() ): $query->the_post();
echo '<h5>' . $query->post->post_title . '</h5>';
endwhile;
wp_reset_postdata();
else :
echo 'No posts found';
endif;
die();
};