<?php add_action('rest_api_init', function () { register_rest_route('myplugin/v1', '/data', array( 'methods' => 'GET', 'callback' => function () { return new WP_REST_Response(array('message' => 'Hello World'), 200); }, )); });
The callback returns a WP_REST_Response object with data and status 200. WordPress converts this to JSON with the message key.
The correct key is 'methods' (plural) and the value must be uppercase 'POST'. Option B uses the correct syntax.
<?php
function my_callback(WP_REST_Request $request) {
$param = $request->get_param('id');
if (!$param) {
return new WP_Error('no_id', 'ID parameter missing', array('status' => 400));
}
return array('id' => $param);
}
add_action('rest_api_init', function () {
register_rest_route('myplugin/v1', '/item', array(
'methods' => 'GET',
'callback' => 'my_callback',
));
});Without a permission_callback, WordPress denies access causing a 500 error. Returning WP_Error is correct but permission_callback is mandatory.
<?php
function error_callback() {
return new WP_Error('forbidden', 'You do not have access', array('status' => 403));
}
add_action('rest_api_init', function () {
register_rest_route('myplugin/v1', '/secret', array(
'methods' => 'GET',
'callback' => 'error_callback',
'permission_callback' => '__return_true',
));
});WP_Error with 'status' => 403 causes WordPress to send HTTP 403 Forbidden status code.
Returning a plain array is converted to JSON with HTTP 200 by default. Permission_callback is required but missing it causes 500 error, not 403. WP_REST_Response can set headers. WP_Error status depends on 'status' field, not always 500.
