【发布时间】: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