【问题标题】:Why can't I access the query params from WP_REST_Request?为什么我无法从 WP_REST_Request 访问查询参数?
【发布时间】:2019-02-17 08:56:05
【问题描述】:

在我的博客上,我正在尝试创建一个端点,以便使用 ajax 加载更多文章。但是,查询字符串参数似乎没有传递给我的函数。 这是我的代码,全部在function.php 文件中:

add_action( 'rest_api_init', function () {
  register_rest_route( 'blog', '/articles', array(
    'methods' => WP_REST_Server::READABLE,
    'callback' => 'load_more'
  ));
});

function load_more(WP_REST_Request $request) {
  var_dump($request->has_valid_params());
  var_dump($request->get_params());
  var_dump($request);
}

这是当我调用/wp-json/blog/articles/?lang=en&tag=test 时返回的内容:

bool(true)

array(0) {}

object(WP_REST_Request)#2259 (8) {
  ["method":protected]=>
  string(3) "GET"
  ["params":protected]=>
  array(6) {
    ["URL"]=>
    array(0) {
    }
    ["GET"]=>
    array(0) {
    }
    ["POST"]=>
    array(0) {
    }
    ["FILES"]=>
    array(0) {
    }
    ["JSON"]=>
    NULL
    ["defaults"]=>
    array(0) {
    }
  }
  ["body":protected]=>
  string(0) ""
  ["route":protected]=>
  string(14) "/blog/articles"
  ["attributes":protected]=>
  array(6) {
    ["methods"]=>
    array(1) {
      ["GET"]=>
      bool(true)
    }
    ["accept_json"]=>
    bool(false)
    ["accept_raw"]=>
    bool(false)
    ["show_in_index"]=>
    bool(true)
    ["args"]=>
    array(0) {
    }
    ["callback"]=>
    string(9) "load_more"
  }
  ["parsed_json":protected]=>
  bool(true)
  ["parsed_body":protected]=>
  bool(false)
}

这几乎就像是在到达我的函数之前从请求对象中删除了参数。

【问题讨论】:

  • 尝试使用不同的路线,也许它与某处现有的 slug 冲突?
  • 您找到解决方案了吗?我面临着完全相同的问题。仅当在注销状态下访问 rest 路由时才会发生。
  • 你能给我提点东西吗?这个load_more(WP_REST_Request $request),WP_REST_Request的主要目的是什么?它是函数、参数、预期的东西还是回调?

标签: php wordpress wordpress-rest-api


【解决方案1】:

您可以通过WP_REST_Request::get_query_params()访问查询参数:

$queryParams = $request->get_query_params();
$tag = $queryParams['tag'];

你也可以使用

$tag = $request->get_param('tag');

但这会按顺序合并$_POST$_GET 和路径参数

【讨论】:

    【解决方案2】:


    对象属性受到保护,因此无法使用标准方法获取它们,即使您想访问也会遇到Fatal Error

    然而,我尝试通过首先将对象转换为数组然后遍历每个项目并获取所需的值来访问值。

    WP_REST_Request $request;
    $request2 = (array)$request;
    foreach($request2 as $req2) {
       if (is_array($req2)) {
         foreach($req2 as $req2_k => $req2_v) {
           if ($req2_k == 'cpt') {
              echo $req2_v;
           }
         }
       }
    }
    

    如您所见,我想从attributes 数组索引中获取cpt 值,您需要根据自己的喜好调整循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-13
      • 2015-01-16
      • 2021-01-17
      • 1970-01-01
      • 2015-01-11
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多