使用多个过滤器过滤管理帖子列表;如何使用逻辑 AND 运算符构造查询对象

P.J*_*P.J 1 wordpress

我需要帮助了解如何构造 WP_query 对象以应用多个条件/过滤器。

在这种情况下,我当前正在使用两个 get 变量过滤管理帖子列表,这两个变量都应该与结果帖子列表匹配。我可以让它对一个变量很好地工作,但不能同时对两个变量都有效。

设置 get 变量后,以下内容可以完美地通过单个 get 变量(在 get 变量中标记为“Notification”,以及 ACF 数据库键“author_notified”)过滤管理帖子列表。

add_filter( 'parse_query', 'filter_admin',15 );

function filter_admin( $query ){
    global $pagenow;
    $type = 'post';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }
    if ( 'post' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['Notification']) && $_GET['Notification'] != '') {
        $query->query_vars['meta_key'] = 'author_notified';
        $query->query_vars['meta_value'] = $_GET['Notification'];
    }

}
Run Code Online (Sandbox Code Playgroud)

这会产生一个查询对象,其中 WP_query[query_vars][meta_key] 和 WP_query[query_vars][meta_value] 针对所需的帖子子集。

应如何构建查询对象以定位同时匹配两个相似条件的帖子子集?或者更简单地说,如何通过两个必须都为真的条件来过滤管理帖子列表?

我对 PHP/wordpress 还很陌生,不确定如何构建查询对象。任何帮助或建议将不胜感激!

P.J*_*P.J 6

解决了,非常感谢@FluffyKitten 的故障排除提示。

WP_query 对象的结构应如下所示,以实现对管理帖子列表的多个过滤器。本质上,ACF 字段可以使用逻辑运算符添加到 WP_query[query_vars][meta_query]:

        [meta_query] => Array
            (
                [relation] => AND
                [0] => Array
                    (
                        [key] => author_notified
                        [value] => 1
                        [compare] => =
                        [type] => NUMERIC
                    )

                [1] => Array
                    (
                        [key] => recommended_decision
                        [value] => 0
                        [compare] => =
                        [type] => CHAR
                    )

            )
Run Code Online (Sandbox Code Playgroud)

该查询对象结构可以通过如下函数完成,假设名为“Notification”和“Recommendation”的 GET 变量已在其他位置设置:

add_filter( 'parse_query', 'posts_filter2',15 );

function posts_filter2( $query ){
   global $pagenow;
   $type = 'post';
   if (isset($_GET['post_type'])) {
       $type = $_GET['post_type'];
   }
   if ( 'post' == $type && is_admin() && $pagenow=='edit.php') {

        $queryParamsCounter = 0;
        if (isset( $_GET['Notification'] ) && $_GET['Notification'] != '')
        {
          $notification = (int)$_GET['Notification'];
          $queryParamsCounter++;
        }
        if (isset( $_GET['Recommendation'] ) && $_GET['Recommendation'] != '')
        {
          $queryParamsCounter++;
          $recommendation = $_GET['Recommendation'];
        }

        $meta_query = array();

        if ($queryParamsCounter > 1) {
          $meta_query['relation'] = 'AND';
        }

        if (isset($notification)) {
          $meta_query[] =       array(
            'key' => 'author_notified',
            'value'    => $notification,
            'compare' => '=',
            'type'    => 'NUMERIC',  
          );
        }
        if (isset($recommendation)) {
          $meta_query[] = array(
            'key'     => 'recommended_decision',
            'value'   => $recommendation,
            'compare' => '=',
            'type'    => 'CHAR',
          );
        }

        $query->set( 'meta_query', $meta_query);

    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果仅选择一个过滤器,则不应使用关系键。

我希望这可以帮助其他面临同样挑战的人!