php - 按自定义字段过滤帖子 - url 正确更新但过滤不起作用
问题描述
我正在尝试通过使用 ACF pro 创建的几个自定义字段过滤自定义帖子类型(图库)中的帖子。现在,URL 会正确更新,但无论选择哪个选项,存档库页面上都不会显示任何帖子。(如果我使用 LIKE 而不是 IN 作为比较运算符,则会显示所有帖子,并且不会过滤掉任何帖子)。
我参考了本教程和代码片段以及在对这篇文章的单个回复中共享的更正,以及在这个论坛上提出类似问题的许多帖子。有一次,我让这适用于单个字段过滤器,但第二个字段不起作用。我不确定我当时做对了什么,或者我现在做错了什么。调试日志显示以下设置没有错误:
这是我正在测试的领域:
字段键:field_6174a76da315c
字段名称:type_of_art
字段类型:复选框
选择:
视觉:视觉
文学:文学
表演:表演
其他:其他
这是我的函数文件中当前的代码:
// array of filters (field key => field name)
$GLOBALS['my_query_filters'] = array(
'field_6174a76da315c' => 'type_of_art'
// 'field_618edb3358d2c' => 'filter_test',
);
// action
add_action('pre_get_posts', 'my_pre_get_posts', 10, 1);
function my_pre_get_posts( $query ) {
// bail early if is in admin
if( is_admin() ) return;
// bail early if not main query
// - allows custom code / plugins to continue working
if( !$query->is_main_query() ) return;
// get meta query
$meta_query = $query->get('meta_query');
// loop over filters
foreach( $GLOBALS['my_query_filters'] as $key => $name ) {
// continue if not found in url
if( empty($_GET[ $name ]) ) {
continue;
}
// get the value for this filter
// eg: http://www.website.com/events?city=melbourne,sydney
$value = explode(',', $_GET[ $name ]);
// append meta query
$meta_query = [];
$meta_query[] = array(
'key' => $name,
'value' => $value,
'compare' => 'IN',
);
}
// update meta query
$query->set('meta_query', $meta_query);
}
这是我的存档库文件中的代码:
<div id="archive-filters">
<?php foreach( $GLOBALS['my_query_filters'] as $key => $name ):
// get the field's settings without attempting to load a value
$field = get_field_object($key, false, false);
// set value if available
if( isset($_GET[ $name ]) ) {
$field['value'] = explode(',', $_GET[ $name ]);
}
// create filter
?>
<div class="filter" data-filter="<?php echo $name; ?>">
<?php create_field( $field ); ?>
</div>
<?php endforeach; ?>
</div>
<script type="text/javascript">
(function($) {
// change
$('#archive-filters').on('change', 'input[type="checkbox"]', function(){
// vars
var url = '<?php echo home_url('gallery'); ?>';
args = {};
// loop over filters
$('#archive-filters .filter').each(function(){
// vars
var filter = $(this).data('filter'),
vals = [];
// find checked inputs
$(this).find('input:checked').each(function(){
vals.push( $(this).val() );
});
// append to args
args[ filter ] = vals.join(',');
});
// update url
url += '?';
// loop over args
$.each(args, function( name, value ){
url += name + '=' + value + '&';
});
// remove last &
url = url.slice(0, -1);
// reload page
window.location.replace( url );
});
})(jQuery);
</script>
</div>
我尝试在之后添加这行代码来调试:
<?php echo "<pre>"; print_r($wp_query->query_vars); echo "</pre>"; ?>
这是选择过滤器选项“Visual”的结果:
Array
(
[post_type] => gallery
[lang] => en
[error] =>
[m] =>
[p] => 0
[post_parent] =>
[subpost] =>
[subpost_id] =>
[attachment] =>
[attachment_id] => 0
[name] =>
[pagename] =>
[page_id] => 0
[second] =>
[minute] =>
[hour] =>
[day] => 0
[monthnum] => 0
[year] => 0
[w] => 0
[category_name] =>
[tag] =>
[cat] =>
[tag_id] =>
[author] =>
[author_name] =>
[feed] =>
[tb] =>
[paged] => 0
[meta_key] =>
[meta_value] =>
[preview] =>
[s] =>
[sentence] =>
[title] =>
[fields] =>
[menu_order] =>
[embed] =>
[category__in] => Array
(
)
[category__not_in] => Array
(
)
[category__and] => Array
(
)
[post__in] => Array
(
)
[post__not_in] => Array
(
)
[post_name__in] => Array
(
)
[tag__in] => Array
(
)
[tag__not_in] => Array
(
)
[tag__and] => Array
(
)
[tag_slug__in] => Array
(
)
[tag_slug__and] => Array
(
)
[post_parent__in] => Array
(
)
[post_parent__not_in] => Array
(
)
[author__in] => Array
(
)
[author__not_in] => Array
(
)
[update_post_term_cache] => 1
[meta_query] => Array
(
[0] => Array
(
[key] => type_of_art
[value] => Array
(
[0] => visual
)
[compare] => IN
)
)
[ignore_sticky_posts] =>
[suppress_filters] =>
[cache_results] => 1
[lazy_load_term_meta] => 1
[update_post_meta_cache] => 1
[posts_per_page] => 10
[nopaging] =>
[comments_per_page] => 50
[no_found_rows] =>
[taxonomy] => language
[term] => en
[order] => DESC
)
我已经确认我的一些测试画廊帖子被指定为 type_of_art 的视觉对象。(同样的结果也发生在其他选择上)。
谢谢参观。
解决方案
万一有人遇到类似问题 - 我最终使用了一个插件(Search & Filter Pro),经过一番摸索,我做了我需要做的事情。
推荐阅读
- html - 下拉样式粘在顶部不起作用
- amazon-web-services - AWS 目标组 - 一个目标不起作用
- php - Laravel 5 - 我应该在哪里编写这个函数,以及如何编写?
- php - here-api:获取定位 API REST 响应的地址
- c - 与已定义符号 C 的令牌连接
- python - 如何在在线服务器中运行 Selenium python 代码
- c++ - 我有一个具有不同前缀的相关函数的 C 库。派生的 C++ 类如何在不重复代码的情况下调用它们?
- php - php通过自动加载器调用函数
- python - 使用 python psycopg 将字符串参数传递给 sql-procedure (postgreSQL) 时发生错误
- laravel - Laravel 非对象