我无法找到答案,也无法为我的具体案例找到相关文章(或者我发现但没有认出来)。
所以,我有正常的博客文章,我有自定义字段名称"标记"我只有一个单词"音乐" (标签是文字类型)。
我的php用于选择所有有"音乐" in" tag"是:
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例如:localhost / myblog /?tag = music时,没有任何帖子显示,即使我有很少的帖子"音乐" in" tag"领域。 我想首先得到这个简单案例的解决方案,因为我duno我做错了什么。
另外,如果我想在文本字段中创建多个值,我想要解决方案" tag"例如:"音乐,电影,流行音乐,生活"所以当人们输入搜索"生活电影"他们获得具有这些特定领域的所有帖子。谢谢你,对不起比预期更大的文本墙。任何帮助都会得到满足。
答案 0 :(得分:0)
正如我从你的解释中所理解的,"标签"只是一个自定义字段,而不是分类法。因此,您不需要检查任何查询var,只需使用"元查询"这就是全部。
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'])
) ) );
}
}
如果您使用此代码段,则页面上的主查询将仅包含带有自定义字段键的帖子" tag"来自$ _GET的价值。我添加了一些检查,以确保我们没有查看管理面板,修改后的查询是页面上的主要查询。否则可能会有些混乱。我也消除了GET值。
现在,你的第二个问题。这是可能的,但我们需要修改我们的代码段。首先,让我们决定,人们将如何要求多个标签?我更喜欢用逗号。所以url看起来像那样:localhost / myblog /?tag = music,film。现在让我们将它发送给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);
}
}
这就是全部。现在人们,要求发布"?标签=电影,音乐"会看到有电影"电影" 或"音乐" "标签"的价值领域。如果您想要显示帖子,只有所有提出的标签,请更改"关系"来自" OR"到" AND"。希望有所帮助!
答案 1 :(得分:0)