Wordpress pre_get_posts 使用高级自定义字段进行过滤
Wordpress pre_get_posts filtering with advanced custom fields
我找不到答案,也找不到与我的特定案例相关的文章(或者我找到但不认识)。
所以,我有普通的博客文章,我有自定义字段名称 "tag",其中我只有 1 个词 "music"(标签是文本类型)。
我用于选择 "tag" 中具有 "music" 的所有帖子的 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 例如:localhost/myblog/?tag=music none 的帖子正在显示,即使我有很少的帖子 "music" 在 "tag" 字段中。
我想首先为这个简单的案例找到解决方案,因为我不知道我做错了什么。
此外,如果我想在文本字段 "tag" 中创建多个值,我想要解决方案,例如:"music, film, pop, life" 这样当人们输入搜索 "life film" 时,他们会得到所有帖子那些特定的领域。谢谢你,抱歉文字墙比预期的要大。我们将不胜感激。
根据您的解释我了解到,"tag"只是一个自定义字段,而不是分类法。所以你不需要检查任何查询变量,只需使用 "meta query" 就可以了。
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);
}
}
就是这样。现在,人们在询问带有“?tag=film,music”的帖子时,会看到 "film" 或 "music" 字段值为 "tag" 的帖子。如果要显示只有 all 个请求标签的帖子,请将 "relation" 从 "OR" 更改为 "AND"。希望对您有所帮助!
编辑:我发现实际问题...我无法命名我的自定义字段 "tag" 因为出于某种原因 www.example.com/?tag=music 给出了一些奇怪的错误。将自定义字段的名称更改为其他任何名称(例如,标签),并且可以正常工作。很奇怪,我希望有人觉得它有用。
我找不到答案,也找不到与我的特定案例相关的文章(或者我找到但不认识)。
所以,我有普通的博客文章,我有自定义字段名称 "tag",其中我只有 1 个词 "music"(标签是文本类型)。
我用于选择 "tag" 中具有 "music" 的所有帖子的 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 例如:localhost/myblog/?tag=music none 的帖子正在显示,即使我有很少的帖子 "music" 在 "tag" 字段中。 我想首先为这个简单的案例找到解决方案,因为我不知道我做错了什么。
此外,如果我想在文本字段 "tag" 中创建多个值,我想要解决方案,例如:"music, film, pop, life" 这样当人们输入搜索 "life film" 时,他们会得到所有帖子那些特定的领域。谢谢你,抱歉文字墙比预期的要大。我们将不胜感激。
根据您的解释我了解到,"tag"只是一个自定义字段,而不是分类法。所以你不需要检查任何查询变量,只需使用 "meta query" 就可以了。
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);
}
}
就是这样。现在,人们在询问带有“?tag=film,music”的帖子时,会看到 "film" 或 "music" 字段值为 "tag" 的帖子。如果要显示只有 all 个请求标签的帖子,请将 "relation" 从 "OR" 更改为 "AND"。希望对您有所帮助!
编辑:我发现实际问题...我无法命名我的自定义字段 "tag" 因为出于某种原因 www.example.com/?tag=music 给出了一些奇怪的错误。将自定义字段的名称更改为其他任何名称(例如,标签),并且可以正常工作。很奇怪,我希望有人觉得它有用。