WP-API v2自定义端点响应格式

时间:2016-08-17 作者:evu

我正在尝试使用自定义端点(基本上是为了进行随机排序),并使用以下代码:

// Custom WP API endpoint
function theme_enable_random_api() {

    // create json-api endpoint

    add_action(\'rest_api_init\', function () {

        // http://example.com/wp-json/random/v2/posts

        register_rest_route(\'random/v2\', \'/random\', array (
            \'methods\'             => \'GET\',
            \'callback\'            => \'wp_json_offers_v2__posts\',
            \'permission_callback\' => function (WP_REST_Request $request) {
                return true;
            }
        ));
    });

    // handle the request

    function wp_json_offers_v2__posts($request) {
        // json-api params

        $parameters = $request->get_query_params();

        // default search args

        $args = array(
            \'post_type\'     => $parameters[\'type\'],
            \'numberposts\'   => 9,
            \'offset\'        => $parameters[\'offset\'],
            \'post_not_in\'       => $parameters[\'exclude\'],
            \'orderby\'       => \'rand\',
        );

        // run query

        $posts = get_posts($args);

        // return results
        return new WP_REST_Response($posts, 200);
    }

}

add_action(\'init\', \'theme_enable_random_api\');
然而,我得到的响应与对api的标准调用得到的响应不同。

标准:

自定义终结点:

问题是我不能像在标准中那样访问分类法/acf信息。我对PHP不是很在行,所以很可能我没有正确地理解它。

干杯

3 个回复
最合适的回答,由SO网友:Chris Morris 整理而成

您可以调用REST API方法来准备输出,其方式与插件默认方式相同,这也将允许任何插件连接到输出中,因为您使用了示例输出中的ACF插件。

这个WP_REST_Posts_Controller 类在其get posts方法中具有以下内容

$posts_query = new WP_Query();
$query_result = $posts_query->query( $query_args );

$posts = array();
foreach ( $query_result as $post ) {
    if ( ! $this->check_read_permission( $post ) ) {
        continue;
    }

    $data = $this->prepare_item_for_response( $post, $request );
    $posts[] = $this->prepare_response_for_collection( $data );
}
所以你可以实例化一个新的WP_REST_Posts_Controller 实例并调用prepare_item_for_responseprepare_response_for_collection 方法将其格式化为与默认端点相同的格式。

类似于以下内容的内容应该可以工作(未经测试)

function wp_json_offers_v2__posts($request) {
    // json-api params

    $parameters = $request->get_query_params();

    // default search args

    $args = array(
        \'post_type\'     => $parameters[\'type\'],
        \'numberposts\'   => 9,
        \'offset\'        => $parameters[\'offset\'],
        \'post_not_in\'       => $parameters[\'exclude\'],
        \'orderby\'       => \'rand\',
    );

    // run query

    $posts = get_posts($args);

    $controller = new WP_REST_Posts_Controller($parameters[\'type\']);

    foreach ( $posts as $post ) {
       $data    = $controller->prepare_item_for_response( $post, $request );
       $posts[] = $controller->prepare_response_for_collection( $data );
    }

    // return results
    return new WP_REST_Response($posts, 200);
}

SO网友:Kostiantyn Petlia

公认的答案很有帮助。谢谢但是prepare\\u item\\u for\\u response()方法自v.3.0以来就被弃用了,所以,希望这段代码能够帮助用户自定义WC订单的端点。

    // Parse all others params
    $args = wp_parse_args( $request->get_params(), $args );

    // Get orders
    $orders = wc_get_orders( $args );

    if ( ! empty( $orders ) && is_array( $orders ) ) {
        $controller = new WC_REST_Orders_Controller ();

        // The response data
        $orders_data = [];
        // We need prepare objects to the response
        foreach ( $orders as $order ) {
            if ( $order instanceof WC_Order ) {
                // Objects
                $prepared_object = $controller->prepare_object_for_response( $order, $request );
                $orders_data[]   = $controller->prepare_response_for_collection( $prepared_object );
            } else {
                // IDs
                $orders_data[] = (int) $order;
            }
        }

        // Return the response
        return new WP_REST_Response( $orders_data, 200 );

    }

SO网友:Myles Hyson

上面的答案忘记设置新的数组变量。一旦你加上它的工作非常好。

function get_all_posts($request)
{
    $posts = get_posts([
        \'posts_per_page\' => -1,
        \'post_status\' => \'publish\'
    ]);

    $controller = new WP_REST_Posts_Controller(\'post\');

    $array = [];

    foreach ( $posts as $post ) {
        $data = $controller->prepare_item_for_response($post,$request);
        $array[] = $controller->prepare_response_for_collection($data);
    }

    return $array;
}
输出看起来就像正常的api响应。

相关推荐

WP REST API-通过REST API更新对现有数据库表的回调(POST请求)

我已经注册了一个新的rest路由到现有的数据库表wpso\\U messages。我能够创建一个get\\u回调函数,从数据库中获取所有数据。我想添加一个POST请求功能,它允许我通过rest api向wpso\\U消息表引入新的数据行。如何做到这一点,有什么建议吗?下面是我注册rest路由和get\\u回调的代码:<?php function get_wp_query() { global $wpdb; $rows = $wpd