是否使用函数文件中定义的自定义参数设置_查询_参数?

时间:2021-08-19 作者:user13286

我正在使用高级自定义字段和ACF to REST API 插件。在我的函数文件中,我指定了自定义查询参数,以按REST请求中的ACF字段筛选自定义帖子类型:

add_filter(\'rest_product_query\', function($args) {
  $fields = array(\'size\', \'color\');

  foreach ($fields as $field) {
    if (isset( $_GET[ $field ]) && ! empty($_GET[$field])) {
      $args[\'meta_query\'][] = array(
        \'key\'   => $field,
        \'value\' => esc_sql($_GET[$field]),
      );
    }
  }
  return $args; 
});
当我在浏览器ie中直接转到REST API url时,这部分工作得非常好:

https://example.com/wp-json/acf/v3/product?per_page=100&size=large&color=blue

但是,我现在尝试使用WP_REST_Request(), 但是,当我将自定义参数传递到调用中时,它们将被忽略。下面是该代码的外观:

$request = new WP_REST_Request(\'GET\', \'/acf/v3/product\');
$request->set_query_params(
    [\'per_page\' => 100],
    [\'size\' => \'large\'],
    [\'color\' => \'blue\']
);
$response = rest_do_request($request);
$server = rest_get_server();
$data = $server->response_to_data($response, false);
$json = wp_json_encode($data);
echo count($data); // this returns 57 instead of the expected 15
当我直接转到URL时,会返回15个产品,但当我回显countWP_REST_Request() 回复我得到57个结果(所有产品)。如果我更改per_page 参数,它正确地返回我限制它的结果数,因此它似乎只忽略了我在函数文件中定义的自定义参数。

有什么想法吗?谢谢

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

它似乎只忽略了我在函数文件中定义的自定义参数

代码中有两个问题:

  1. WP_REST_Request::set_query_params() 实际上只接受一个参数,即参数数组,因此您的代码应该如下所示:

    $request->set_query_params([ // pass a single array containing one or more arguments
        \'per_page\' => 100,
        \'size\'     => \'large\',
        \'color\'    => \'blue\',
    ]);
    
    rest_<post type>_query filter 第二个参数名为$request 这是一个WP_REST_Request 实例,因此在筛选函数中,而不是使用$_GET[ $field ], 您应该使用$request[ $field ] (或者您也可以使用$request->get_param( $field ) 方法)如:

    // 1. Make sure your function accepts the 2nd parameter:
    add_filter(\'rest_post_query\', function($args, $request) {
      $fields = array(\'size\', \'color\');
    
      foreach ($fields as $field) {
        // 2. Use $request[ $field ] and not $_GET[ $field ].
        if (! empty($request[$field])) {
          $args[\'meta_query\'][] = array(
            \'key\'   => $field,
            \'value\' => esc_sql($request[$field]),
          );
        }
      }
    
      return $args;
    }, 10, 2); // 3. Note the 3rd parameter (number of arguments for your function).
    
    为什么$request 使用而不是依赖$_GET$_POST 超全局,是因为WP_REST_Request 实际上发出内部API请求,因此不会建立HTTP连接,除非当前URL(运行的页面new WP_REST_Request) 包含sizecolor 参数如中所示example.com/some-page/?color=white, 然后在过滤函数中,$_GET[\'color\'] 例如,未定义(未设置)。

    另一方面$request[\'color\']$request->get_param( \'color\' ) 将始终为您提供正确的值,而不考虑上面包含的当前URLcolor 或者不在查询字符串中,只要您的查询参数实际包含color 参数(和其他必要参数)。(请参见set_query_params() 上文)

    因此,在REST API请求期间,始终使用$request 访问查询参数。

    实际上,这一部分:

    $server = rest_get_server();
    $data = $server->response_to_data($response, false);
    
    可以简单地写为:

    $data = $response->get_data();