对于我拥有的某些网站,我希望我的访问者能够在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在网址中。
提前致谢。
答案 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',
);
}
我不确定为什么会这样做以及之前的解决方案"没有。如果您有任何想法,请告诉我们!