通过filter或hook从wp rest api响应中删除_links对象

时间:2017-07-11 07:14:22

标签: wordpress-rest-api

我已从json输出中删除unset($data->data['field_name'])的不需要的数据。为此我使用wordpress过滤器rest_prepare_

但是我们如何从JSON输出中删除_links对象?

5 个答案:

答案 0 :(得分:2)

我不知道如何 取消设置 ,但您可以设置要返回的变量。

function prepare_rest($data, $post, $request){
    return [
        'id'    => $data->data['id'],
        'title' => $data->data['title']['rendered']
    ];
}

add_filter('rest_prepare_post', 'prepare_rest', 10, 3);

答案 1 :(得分:2)

这不是一个很好的解决方案,但有效。

function contract_remove_links( $data, $post, $context ) {

    $data->remove_link( 'collection' );
    $data->remove_link( 'self' );
    $data->remove_link( 'about' );
    $data->remove_link( 'author' );
    $data->remove_link( 'replies' );
    $data->remove_link( 'version-history' );
    $data->remove_link( 'https://api.w.org/featuredmedia' );
    $data->remove_link( 'https://api.w.org/attachment' );
    $data->remove_link( 'https://api.w.org/term' );
    $data->remove_link( 'curies' );

    return $data;
}

add_filter( 'rest_prepare_post', 'contract_remove_links', 10, 3 );

答案 2 :(得分:1)

要小心地从API中删除内容,但是如果您确定要删除它,可以这样进行:

function so_45027789_rest_prepare_post($data, $post, $request)
{
    foreach($data->get_links() as $_linkKey => $_linkVal) {
        $data->remove_link($_linkKey);
    }
    return $data;
}

add_filter('rest_prepare_post', 'so_45027789_rest_prepare_post', 1, 3);

仅当您在使用API​​的实现中明确要求较小的响应时,才建议这样做,从而使API的默认用法保持不变,例如通过查询变量:

function so_45027789_rest_prepare_post($data, $post, $request)
{
    $params = $request->get_params();
    if(isset($params['_minimal'])) {
        foreach($data->get_links() as $_linkKey => $_linkVal) {
            $data->remove_link($_linkKey);
        }
    }
    return $data;
}

add_filter('rest_prepare_post', 'so_45027789_rest_prepare_post', 1, 3);

答案 3 :(得分:0)

Unfortunately, you cannot remove it, it’s protected.

    unset( $data->links );

    PHP Fatal error:  Uncaught Error: Cannot access protected property WP_REST_Response::$links 

    /wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php(311)
        Line 1567:  $response->add_links( $this->prepare_links( $post ) );
        Line 1608:  protected function prepare_links( $post ) {

答案 4 :(得分:0)

rest_prepare_post是要使用的正确过滤器,但_links字段是由WordPress动态生成的。所以你不能直接删除它。

您可以在此参数中添加自己的link,也可以从" _links"中删除默认链接。

这是代码......

add_filter( 'rest_prepare_post', function ( $response ) {
$response->add_link( 'yourrel', rest_url( 'yourendpoint/thing' ), array(
    'embeddable' => true,
) );

$response->remove_link( 'collection' );

return $response;
} );