【问题标题】:Advanced Custom Fields Checkbox Query not Working高级自定义字段复选框查询不起作用
【发布时间】:2016-09-05 13:40:24
【问题描述】:

对于我拥有的一些网站,我希望我的访问者能够过滤 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)";}

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

提前致谢。

【问题讨论】:

    标签: wordpress filter advanced-custom-fields


    【解决方案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',
        );
    } 
    

    我不确定为什么这有效,而之前的“解决方案”没有。如果您有任何想法,请告诉我!

    【讨论】:

    • 看起来你一开始没有得到结果,因为 WordPress 默认为“与”关系。您现在得到了结果,因为您已将关系明确设置为“或”,如果找到任何一个元值,这将为您提供结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多