【问题标题】:Wordpress pre_get_posts filtering with advanced custom fields带有高级自定义字段的 Wordpress pre_get_posts 过滤
【发布时间】:2016-12-18 19:36:52
【问题描述】:

我只是找不到答案,也找不到针对我的具体案例的相关文章(或者我找到但不认识它)。

所以,我有正常的博客文章,并且我有自定义字段名称“标签”,其中只有 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);

现在,当我输入网址时,例如:localhost/myblog/?tag=music 没有显示任何帖子,即使我在“标签”字段中几乎没有包含“音乐”的帖子。 我想先得到这个简单案例的解决方案,因为我不知道我做错了什么。

另外,如果我想在文本字段“标签”中创建多个值,我想要解决方案,例如:“音乐、电影、流行音乐、生活”,所以当人们输入搜索“生活电影”时,他们会得到所有带有这些的帖子具体领域。谢谢你,很抱歉文字墙比预期的要大。如有任何帮助,我们将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    我从您的解释中了解到,“标签”只是一个自定义字段,而不是分类。因此,您无需检查任何查询变量,只需使用“元查询”即可。

    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'])
        ) ) );
      }
    }
    

    如果您使用此 sn-p,页面上的主要查询将仅包含具有自定义字段键“标签”和来自 $_GET 的值的帖子。我添加了一些检查,以确保我们没有查看管理面板并且修改后的查询是页面上的主要查询。否则可能会有些混乱。我还清理了 GET 值。

    现在,您的第二个问题。这是可能的,但我们需要修改我们的sn-p。首先,让我们决定,人们将如何要求多个标签?我更喜欢使用逗号。所以 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”的帖子时,会看到“tag”字段具有“film”“music”值的帖子。如果您想显示只有所有个询问标签的帖子,请将“relation”从“OR”更改为“AND”。希望对您有所帮助!

    【讨论】:

    • 感谢您的回复,但似乎仍然不起作用,无论是示例。现在,我的functions.php中没有为acf手动注册函数,我只是通过管理面板添加它们,也许我必须注册它们..?很抱歉打扰您,这似乎很简单,但对我不起作用。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-09-02
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      • 2016-06-30
      • 2018-01-21
      • 2017-08-28
      • 2015-01-21
      • 2017-05-01
      相关资源
      最近更新 更多