WordPress的pre_get_posts过滤与高级自定义字段
我只是找不到答案,我也可以找到我的具体情况相关的文章(或我发现,但没有认出它)。WordPress的pre_get_posts过滤与高级自定义字段
所以,我有正常的博客文章,我有自定义字段名称“标签”,我只有1个单词“音乐”(标签是文本类型)。
我选择其中有“音乐”的“标签”的所有帖子PHP是:
add_filter('query_vars', function($vars) {
$vars[] = 'tag';
return $vars;
});
add_action('pre_get_posts', function ($query) {
if (!empty($_GET)) {
if ($tag = get_query_var('tag', false)) {
$meta_query[] = array(
'key' => 'tag',
'value' => $tag,
'compare' => '='
);
}
$query->query_vars['meta_query'] = $meta_query;
}
}, 1);
现在,当我在URL例如键入:帖子的本地主机/ myblog /标签=音乐没有一个是显示,即使我在“标签”字段中有“音乐”几个帖子。 我想首先解决这个简单的案例,因为我duno什么我做错了。
另外,我想解决方案,如果我想在文本字段“标签”,例如:“音乐,电影,流行音乐,生活”多重价值,所以当人们输入搜索“生活电影”时,他们获得所有职位与那些特定的领域。感谢您对文本的更大空间感到抱歉。任何帮助将appriciated。
正如我从你的解释中了解到的,“标签”只是一个自定义字段,而不是分类标准。所以你不需要检查任何查询变量,只需使用“元查询”即可。
add_action('pre_get_posts', 'make_my_query');
function make_my_query($query) {
if (!is_admin() && !empty($_GET) && isset($_GET['tag']) && $query->is_main_query()) {
$query->set('meta_query', array(array(
'key' => 'tag',
'value' => sanitize_text_field($_GET['tag'])
)));
}
}
如果你使用这个片段中,页面上主查询将包含从$ _GET自定义字段键“标签”和值只有职位。我已经添加了一些检查,以确保我们没有查看管理面板,修改后的查询是页面上的主要查询。否则可能会有些混乱。另外我清理了GET值。
现在,你的第二个问题。这是可能的,但我们需要修改我们的片段。首先,让我们来决定,人们如何要求多个标签?我更喜欢使用逗号。所以URL看起来像这样:localhost/myblog /?tag =音乐,电影。现在让我们把它发送到WP查询:
add_action('pre_get_posts', 'make_my_query');
function make_my_query($query) {
if (!is_admin() && !empty($_GET) && isset($_GET['tag'] && $query->is_main_query()) {
$get_params = explode(',', $_GET['tag']);
$meta_query = array(
'relation' => 'OR'
);
foreach ($get_params as $param) {
$meta_query[] = array(
'key' => 'tag',
'value' => sanitize_text_field($param)
);
}
$query->set('meta_query', $meta_query);
}
}
就这样。现在,有人要求“?tag = film,music”的帖子会看到有“film”或“tag”字段的“音乐”值的帖子。如果你想显示帖子,只有所有问标签,将“关系”从“或”更改为“和”。希望有所帮助!
编辑:我发现了实际的问题......我无法命名我的自定义字段“标记”,因为某些原因www.example.com/?tag=music提供了一些奇怪的错误。将自定义字段的名称更改为其他任何内容(例如,标记),并且它可以工作。奇怪,我希望有人觉得它有用。
感谢您的回复,但似乎仍然没有工作,都没有例子。现在,我没有在我的functions.php中手动注册acf函数,我只是通过管理面板添加它们,也许我必须注册它们。? 对不起,打扰了你,这似乎很简单,但只是不适合我。 –