WordPress REST API-在导入之前修改JSON

时间:2018-10-24 作者:KiwisTasteGood

大家好,我有一些来自外部公司的关于我的WP的数据,这些数据位于/WP json/WP/v2/jobs/将作为帖子导入。

此数据包含需要导入的JSON,但它试图使用字符串(例如“Manager”)而不是术语\\u id(即“381”)来设置分类法。这意味着我返回了一个错误。

{
    "code": "rest_invalid_param",
    "message": "Invalid parameter(s): job_location, job_industry, job_sector",
    "data": {
        "status": 400,
        "params": {
            "job_location": "job_location[0] is not of type integer.",
            "job_industry": "job_industry[0] is not of type integer.",
            "job_sector": "job_sector[0] is not of type integer."
        }
    }
}
所以我想要的是当他们将此值发布给我们时,例如:

“job\\u sector”:“Manager”

相反,我希望遍历我们的分类法,并找到这个“Manager”job\\u扇区的ID,重建JSON和THEN 让WP导入我传递的数据,使用正确的ID无错误。

有谁能帮助我拦截JSON并以正确的格式传递它吗?

我尝试了“rest\\u pre\\u dispatch”,但这似乎只是编辑发送回他们的结果,WP已经对其进行了处理。

编辑:这是我的代码:

 function wpse281916_rest_check_referer( $result, $server, $request ) {
     if ( null !== $result ) {
         // Core starts with a null value.
         // If it is no longer null, another callback has claimed this request.
         // Up to you how to handle - for this example we will just return early.
         return $result;
     }

     $array = json_decode($result, true);
     $term = get_term_by(\'name\',$array["job_sector"],\'job_sector\');
     $term = json_decode(json_encode($term),true);
     $termid = $term[\'term_id\'];   
     $array[\'job_sector\'] = $termid;
     $result = json_encode($array);
     return $result;
 }

// add the filter
add_filter( \'rest_pre_dispatch\', \'wpse281916_rest_check_referer\', 10, 3 );
编辑2:建议后

    function wpse281916_rest_check_referer( $result, $server, $request ) {
        if ( null !== $result ) {
            // Core starts with a null value.
            // If it is no longer null, another callback has claimed this request.
            // Up to you how to handle - for this example we will just return early.
            return $result;
        }

        $array = json_decode($request, true);
        $term = get_term_by(\'name\',$array["job_sector"],\'job_sector\');
        $term = json_decode(json_encode($term),true);
        $termid = $term[\'term_id\'];
        $array[\'job_sector\'] = $termid;
        $request = json_encode($array);
        return null;
    }

   // add the filter
   add_filter( \'rest_pre_dispatch\', \'wpse281916_rest_check_referer\', 10, 3 );

2 个回复
最合适的回答,由SO网友:Timothy Jacobs 整理而成

使用rest_pre_dispatch 钩子可能是最简单的方法,但在将新请求数据放回WP_REST_Request 对象正确。

您正在重新分配WP_REST_Request 对象设置为请求数据数组。这些更改不会持久化,因为参数不是通过引用传递的。相反,您希望修改WP_REST_Request 对象

可以使用类似数组的语法或WP_REST_Request::set_param( $param_name, $param_value ).

您还应该检查以确保您只在正确的路径上运行此代码。我还将优先考虑更早地启动钩子,因为您本质上是说这个更改应该应用于这个请求中发生的所有事情。

function wpse281916_rest_check_referer( $result, $server, $request ) {

    if ( \'/wp/v2/jobs\' !== $request->get_route() || \'POST\' !== $request->get_method()) {
        return $result;
    }

    $job_sector = $request[\'job_sector\'];

    if ( null === $job_sector ) {
        return $result;
    }

    $term = get_term_by( \'name\', $job_sector, \'job_sector\' );

    if ( $term && ! is_wp_error( $term ) ) {
        $request[\'job_sector\'] = $term->term_id;
    } else {
        $request[\'job_sector\'] = 0;
    }

    return $result;
}

// add the filter
add_filter( \'rest_pre_dispatch\', \'wpse281916_rest_check_referer\', 0, 3 );

SO网友:BenB

看起来你在找rest_pre_dispatch

这个钩子允许在调度之前通过返回非空的来劫持请求。返回的值将用于服务请求。

从文档中:

$result

(mixed) Response to replace the requested version with. Can be anything a normal endpoint can return, or null to not hijack the request.
似乎您必须修改$请求并返回null,以便不劫持默认响应。

结束

相关推荐

在创建自定义REST路由时,我们是否可以假设/wp-json/在任何情况下都将始终为/wp-json/?

有关更多上下文:WP REST API Is it rather easy to rename the default wp-json uri part?看起来很容易改变wp-json 对任何事情。我正在通过本地化将此链接传递到JS文件的自定义路径:$params = [ \'rest_link\' => esc_url( get_site_url() . \'/wp-json/block_help/v1/block_identification?block_identifier=\