在 AJAX 后过滤器函数中使用多个“关系”参数
Posted
技术标签:
【中文标题】在 AJAX 后过滤器函数中使用多个“关系”参数【英文标题】:Use multiple 'relation' arguments in AJAX post filter function 【发布时间】:2017-01-10 19:49:11 【问题描述】:我正在尝试使用通过复选框组使用 多选 的表单来实现 ajax 后置过滤器。
此过滤器有 5 个组(主键),分别是 brand
、ram
、camera
、price
和 feature
。每个组都有 4 到 5 个不同的键/值(复选框)。
目前,这仅适用于单选模式: 如果我选择了同一组的 2 个复选框,什么都不显示...
如何为这组复选框启用多选功能?
这是进行 Ajax 查询的 php 函数:
add_action('wp_ajax_call_post', 'call_post');
add_action('wp_ajax_nopriv_call_post', 'call_post');
function call_post()
$choices = $_POST['choices'];
$meta_query = array('relation' => 'AND');
foreach($choices as $Key=>$Value)
if(count($Value))
foreach ($Value as $Inkey => $Invalue)
$meta_query[] = array( 'key' => $Key, 'value' => $Invalue, 'compare' => 'like' );
$args = array(
'post_type' => 'post',
'meta_query' =>$meta_query
);
$query = new WP_Query($args);
if( $query->have_posts() ) :
while( $query->have_posts() ): $query->the_post();
get_template_part('content');
endwhile;
wp_reset_query();
else :
_e('Sorry, no posts matched your criteria.');
wp_send_json($query->posts);
endif;
die();
?>
以下是本主题中使用的 html 表单和 javascript:Get posts with Ajax posts filter with multi selection checkboxes
谢谢
【问题讨论】:
【参考方案1】:要实现这一点,您需要:
按组对操作数据进行分组(选中的复选框) 在每组数组中包含一个'relation' => 'OR'
(仅如果该组选中了多个复选框)
你的 php 函数会是这样的:
add_action('wp_ajax_call_post', 'call_post');
add_action('wp_ajax_nopriv_call_post', 'call_post');
function call_post()
$choices = $_POST['choices'];
// Defining here your fields groups
$groups = array('brand', 'ram', 'camera', 'price', 'feature');
// Grouping data by group
foreach($choices as $Key => $Value)
foreach ($Value as $Inkey => $Invalue)
switch ($Key)
// One block for each group defined in $groups array
case $groups[0]:
$grp[0][] = array( 'key' => $Key, 'value' => $Invalue, 'compare' => 'like' );
break;
case $groups[1]:
$grp[1][] = array( 'key' => $Key, 'value' => $Invalue, 'compare' => 'like' );
break;
case $groups[2]:
$grp[2][] = array( 'key' => $Key, 'value' => $Invalue, 'compare' => 'like' );;
break;
case $groups[3]:
$grp[3][] = array( 'key' => $Key, 'value' => $Invalue, 'compare' => 'like' );
break;
case $groups[4]:
$grp[4][] = array( 'key' => $Key, 'value' => $Invalue, 'compare' => 'like' );
break;
$grp_arr = array();
// Adding ('relation' => 'OR') to each group with a length > 1
foreach ($grp as $key_grp => $grp_values)
if(count($grp_values) > 1)
$grp_arr[$key_grp] = array('relation' => 'OR');
foreach ($grp_values as $grp_val)
$grp_arr[$key_grp][] = $grp_val;
// Compiling it all
$meta_query = array('relation' => 'AND');
foreach ($grp_arr as $grp_arr_val)
$meta_query[] = $grp_arr_val;
// The query (compiled)
$query = new WP_Query( array(
'post_type' => 'post',
'meta_query' => $meta_query
) );
// The Loop
if( $query->have_posts() ) :
while( $query->have_posts() ): $query->the_post();
get_template_part('content');
endwhile;
wp_reset_query();!
else :
_e('Sorry, no posts matched your criteria.');
wp_send_json($query->posts);
endif;
die();
所以你会得到这种格式化数组:
$query = array(
'post_type' => 'product',
'meta_query' => array(
'relation' => 'AND',
array(
'relation' => 'OR',
array(
'key' => 'brand',
'value' => 'Nokia',
'compare' => 'like',
),
array(
'key' => 'brand',
'value' => 'LG',
'compare' => 'like',
),
),
array(
'relation' => 'OR',
array(
'key' => 'ram',
'value' => '1GB',
'compare' => 'like',
),
array(
'key' => 'ram',
'value' => '2GB',
'compare' => 'like',
),
),
),
);
所以这应该可以按预期工作,通过复选框组启用多选...
【讨论】:
以上是关于在 AJAX 后过滤器函数中使用多个“关系”参数的主要内容,如果未能解决你的问题,请参考以下文章