按自定义字段过滤帖子 - url 正确更新但过滤不起作用
Posted
技术标签:
【中文标题】按自定义字段过滤帖子 - url 正确更新但过滤不起作用【英文标题】:filtering posts by custom fields - url updates correctly but filtering doesn't work 【发布时间】:2021-12-25 13:27:40 【问题描述】:我正在尝试通过使用 ACF pro 创建的几个自定义字段过滤自定义帖子类型(图库)中的帖子。现在,URL 会正确更新,但无论选择哪个选项,存档库页面上都不会显示任何帖子。 (如果我使用 LIKE 而不是 IN 作为比较运算符,则会显示所有帖子,并且不会过滤掉任何帖子。
我提到了this tutorial and code snippets,并在对this post 的单一回复中分享了更正,以及该论坛上许多提出类似问题的帖子。有一次,我让这适用于单个字段过滤器,但第二个字段不起作用。我不确定我当时做对了什么,或者我现在做错了什么。调试日志显示以下设置没有错误:
这是我正在测试的字段:
字段键: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>"; ?>
这是选择了“视觉”过滤器选项的结果:
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 的视觉对象。 (其他选择也会出现同样的结果)。
感谢观看。
【问题讨论】:
【参考方案1】:以防万一有人遇到类似问题 - 我最终使用了一个插件 (Search & Filter Pro),它经过了一些优化,完成了我需要做的事情。
【讨论】:
你能edit你的答案并解释为什么这个答案以及它是如何做的吗? 嗨@Elikill58——我不确定你在寻找什么进一步的细节。我放弃了自己创建过滤器,而是使用了一个插件。以上是关于按自定义字段过滤帖子 - url 正确更新但过滤不起作用的主要内容,如果未能解决你的问题,请参考以下文章
php Сustom类别过滤器解析URL类别过滤器按自定义过滤器按属性自定义过滤器自定义排序
视图 1:按自定义表/字段过滤(或使用 Argument Hand.Code)