高级自定义字段复选框查询不起作用

时间:2016-05-10 14:04:20

标签: wordpress filter advanced-custom-fields

对于我拥有的某些网站,我希望我的访问者能够在Wordpress存档页面上过滤不同的高级自定义字段。为了创建这样的过滤器,我使用了this tutorial

但是,我似乎无法按照我想要的方式运行过滤器。这是我的存档页面代码。

function my_pre_get_posts( $query ) {

// bail early if is in admin
if( is_admin() ) {
    return;
}

// get meta query
$meta_query = $query->get('meta_query');

// loop over filters
foreach( $GLOBALS['my_query_filters'] as $key => $name ) {

    // continue if no values found in url
    if( empty($_GET[ $name ]) ) {           
        continue;
    }

    // get the values for this filter
    $value = explode(',', $_GET[ $name ]);

    // append meta query
$meta_query[] = array(
    'key'       => $name,
  'value'       => $value,
  'compare' => 'IN'
);       
}   

// update meta query
$query->set('meta_query', $meta_query);

//print_r($query);  

echo $GLOBALS['wp_query']->request;

这是运行时吐出的SQL代码:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
INNER JOIN wp_term_relationships ON ( wp_posts.ID = wp_term_relationships.object_id ) 
INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) 
WHERE 1 =1
AND (
wp_term_relationships.term_taxonomy_id
IN ( 2, 9, 11 )
)
AND (
(
wp_postmeta.meta_key =  'payment_method'
AND CAST( wp_postmeta.meta_value AS CHAR ) 
IN (
'Delta',  'Visa'
)
)
)
AND wp_posts.post_type =  'post'
AND (
wp_posts.post_status =  'publish'
OR wp_posts.post_status =  'private'
)
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date DESC 
LIMIT 0 , 100

但是,此SQL语句返回0结果。我也运行了这个查询:

SELECT * 
FROM  `wp_postmeta` 
WHERE  `meta_key` =  'payment_method'
LIMIT 0 , 30

这确实会返回结果。这些结果的元值类似于:

a:3:{i:0;s:5:"Delta";i:1;s:4:"Visa";i:2;s:11:"Visa(debit)";}

我猜这个生成的查询有问题,但我不知道究竟是什么。我希望有人可以帮助我。不确定是否值得注意,但运行第一段代码也会弄乱我的主题,因为它不会加载topmenu,例如?payment_method = Delta,Visa在网址中。

提前致谢。

1 个答案:

答案 0 :(得分:1)

搞定了!这是我现在用来将meta_query附加到查询的代码。

$values_to_search = explode(',', $_GET[ $name ]);
$meta_query = array('relation' => 'OR');
foreach ($values_to_search as $value) {
    $meta_query[] = array(
        'key'       => $name,
        'value'     => $value,
        'compare'   => 'LIKE',
    );
} 

我不确定为什么会这样做以及之前的解决方案"没有。如果您有任何想法,请告诉我们!