我有多个选择的Dropdown。还使用AJAX通过WP_Query获取数据。
过程:如果我首先选择页面中的“ DropDown”或“ DropDown”,则它将返回结果。然后选择第二个DropDown,然后将其设置为“ AND”关系以获取结果,这意味着应该返回通用结果。
我在设置不同选择之间的关系时遇到了问题。
请帮助我!
这是代码:Filter.js
var test1 = [];
var test2 = [];
var test3 = [];
var ajaxurl = ajaxfilter.ajax_url;
jQuery(document).ready(function() {
jQuery('#domaine').on('change', function() {
test1 = jQuery(this).val();
if (test1 !== null) {
var data = {
action: 'get_fill_portfolio',
opt_domaine: test1,
opt_status: test2,
opt_fond: test3
}
jQuery.post(ajaxurl, data, function(response) {
jQuery('.load-state').html(response);
});
}
});
jQuery('#status').on('change', function() {
test2 = jQuery(this).val();
if (test2 !== null) {
var data = {
action: 'get_fill_portfolio',
opt_domaine: test1,
opt_status: test2,
opt_fond: test3
}
jQuery.post(ajaxurl, data, function(response) {
jQuery('.load-state').html(response);
});
}
});
jQuery('#fond').on('change', function() {
test3 = jQuery(this).val();
if (test3 !== null) {
var data = {
action: 'get_fill_portfolio',
opt_domaine: test1,
opt_status: test2,
opt_fond: test3
}
jQuery.post(ajaxurl, data, function(response) {
jQuery('.load-state').html(response);
});
}
});
Functions.php
add_action('wp_ajax_get_fill_portfolio', 'get_fill_portfolio');
add_action('wp_ajax_nopriv_get_fill_portfolio', 'get_fill_portfolio');
// Select Dropdown List
function get_fill_portfolio()
{
/* check_ajax_referer( 'load_states', 'security' );
$return = array();
echo $return;
wp_die(); // You missed this too*/
$all_portfolio = [];
global $post;
$opt_domaine = $_POST['opt_domaine'];
$opt_status = $_POST['opt_status'];
$opt_fond = $_POST['opt_fond'];
$string = rtrim(implode(',', $opt_domaine), ',');
$string1 = rtrim(implode(',', $opt_status), ',');
$string2 = rtrim(implode(',', $opt_fond), ',');
$args = array(
'post_type' => 'stm_portfolio',
'post_status' => 'publish',
'orderby' => 'menu_order',
'order' => 'ASC',
'posts_per_page' => -1,
'meta_query' => array(
'relation' => 'OR',
array(
'relation' => 'AND',
'mnf_domaine' => array(
'key' => 'mnf_domaine',
'value' => $string,
'compare' => 'IN'
),
),
array(
'relation' => 'AND',
'mnf_status' => array(
'key' => 'mnf_status',
'value' => $string1,
'compare' => 'IN'
),
),
array(
'relation' => 'AND',
'mnf_fond' => array(
'key' => 'mnf_fond',
'value' => $string2,
'compare' => 'IN'
)
)
)
);
$query_s = new WP_Query( $args );
if ( $query_s->have_posts() ) {
while ( $query_s->have_posts() ) : $query_s->the_post();
$all_portfolio[] = [
'name' => get_the_title( $post->ID),
'mnf_site_web' => get_field('mnf_site_web', $post->ID),
'link' => get_permalink($post->ID),
'mnf_domaine' => get_field('mnf_domaine', $post->ID),
'mnf_status' => get_field('mnf_status', $post->ID),
'mnf_fond' => get_field('mnf_fond', $post->ID),
'img_url' => get_the_post_thumbnail_url( $post->ID, 'full' )
];
endwhile;
if ( $all_portfolio ) :
$domaine = get_field_object('mnf_domaine');
$status = get_field_object('mnf_status');
$fond = get_field_object('mnf_fond');
endif;
?>
<div class="logo-filter">
<div class="row">
<?php foreach ( $all_portfolio as $portfolio ) : ?>
<div class="col-md-3 col-sm-4 col-xs-6">
<a href="<?=$portfolio['link']?>" target="" class="logo-link">
<img alt="<?=$portfolio['name']?>" src="<?=$portfolio['img_url']?>">
</a>
</div>
<?php endforeach; ?>
</div>
</div>
<?php
wp_reset_query();
}
}
?>
当我从具有多个选择的任何下拉列表中进行搜索时,应该给出结果。
目前,我有3个下拉菜单。所以在这里,我想根据下拉菜单中的多选实现搜索功能。当我使用'relation' => 'AND'
时,我必须选择三个下拉菜单,然后返回结果。因此,我尝试使用'relation' => 'OR'
,因此返回所有结果。
因此,在这里我混淆了使用三个下拉菜单与多选功能之间的关系。
我想将Query设置为
AND (
( wp_postmeta.meta_key = 'mnf_domaine' AND wp_postmeta.meta_value IN ('media', 'media1') )
AND
( mt1.meta_key = 'mnf_status' AND mt1.meta_value IN ('test1', 'test2') )
OR
( mt2.meta_key = 'mnf_fond' AND mt2.meta_value IN ('') )
谢谢!