Wordpress pre_get_posts使用高级自定义字段进行过滤

时间:2016-08-11 22:15:14

标签: php wordpress get advanced-custom-fields posts

我无法找到答案,也无法为我的具体案例找到相关文章(或者我发现但没有认出来)。

所以,我有正常的博客文章,我有自定义字段名称"标记"我只有一个单词"音乐" (标签是文字类型)。

我的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"例如:"音乐,电影,流行音乐,生活"所以当人们输入搜索"生活电影"他们获得具有这些特定领域的所有帖子。谢谢你,对不起比预期更大的文本墙。任何帮助都会得到满足。

2 个答案:

答案 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)

编辑:我发现了实际问题...我无法命名我的自定义字段“标记”,因为某些原因www.example.com/?tag=music给出了一些奇怪的错误。将自定义字段的名称更改为其他任何内容(例如,标记),并且它可以正常工作。很奇怪,我希望有人觉得它很有用。