Хук rest_api_init
срабатывает в WordPress при подготовке к обработке REST API запроса. Это идеальное место для регистрации кастомных маршрутов, чтобы они загружались только тогда, когда это действительно необходимо. Использование данного хука помогает избежать лишних нагрузок и обеспечивать эффективную работу API.
Хук rest_api_init
передает объект REST-сервера $wp_rest_server
, представляющий текущий сервер WordPress API.
do_action( 'rest_api_init', WP_REST_Server $wp_rest_server )
- $wp_rest_server (WP_REST_Server) — объект сервера, обрабатывающий текущий REST API запрос.
Пример 1: Создание маршрута для получения публикаций
В этом примере создается REST API маршрут, возвращающий список публикаций:
add_action( 'rest_api_init', function() {
register_rest_route( 'myplugin/v1', '/custom-posts', array(
'methods' => 'GET',
'callback' => 'myplugin_get_custom_posts',
) );
} );
function myplugin_get_custom_posts() {
$posts = get_posts( array(
'post_status' => 'publish',
'numberposts' => 50,
) );
$data = array();
foreach ( $posts as $post ) {
$data[] = array(
'id' => $post->ID,
'title' => $post->post_title,
'excerpt' => $post->post_excerpt,
'author' => get_the_author_meta( 'display_name', $post->post_author ),
);
}
return rest_ensure_response( $data );
}
Теперь, отправив запрос GET http://example.com/wp-json/myplugin/v1/custom-posts
, вы получите список публикаций с полями ID, заголовком, отрывком и автором.
Пример 2: Создание защищенной конечной точки для получения данных пользователя
Иногда необходимо создать маршрут, доступный только авторизованным пользователям. В этом примере маршрут возвращает данные текущего пользователя и доступен только для зарегистрированных пользователей:
add_action( 'rest_api_init', function() {
register_rest_route( 'myplugin/v1', '/user-info', array(
'methods' => 'GET',
'callback' => 'myplugin_get_user_info',
'permission_callback' => function() {
return is_user_logged_in();
},
) );
} );
function myplugin_get_user_info() {
$user = wp_get_current_user();
if ( ! $user->exists() ) {
return new WP_Error( 'no_user', 'Пользователь не найден', array( 'status' => 404 ) );
}
$data = array(
'id' => $user->ID,
'username' => $user->user_login,
'email' => $user->user_email,
'roles' => $user->roles,
);
return rest_ensure_response( $data );
}
Данный код создает конечную точку GET http://example.com/wp-json/myplugin/v1/user-info
, доступную только авторизованным пользователям.
Пример 3: Добавление маршрута для создания новой записи (POST-запрос)
Следующий пример создает маршрут, позволяющий добавлять новый пост в базу данных с помощью POST-запроса. Этот маршрут доступен только пользователям с правами редактирования записей.
add_action( 'rest_api_init', function() {
register_rest_route( 'myplugin/v1', '/create-post', array(
'methods' => 'POST',
'callback' => 'myplugin_create_post',
'permission_callback' => function() {
return current_user_can( 'edit_posts' );
},
'args' => array(
'title' => array(
'required' => true,
),
'content' => array(
'required' => true,
),
),
) );
} );
function myplugin_create_post( $request ) {
$title = sanitize_text_field( $request->get_param( 'title' ) );
$content = sanitize_textarea_field( $request->get_param( 'content' ) );
$post_id = wp_insert_post( array(
'post_title' => $title,
'post_content' => $content,
'post_status' => 'publish',
) );
if ( is_wp_error( $post_id ) ) {
return $post_id;
}
return rest_ensure_response( array( 'message' => 'Запись успешно создана!', 'id' => $post_id ) );
}
Этот код создает маршрут POST http://example.com/wp-json/myplugin/v1/create-post
, с параметрами title
и content
.
Заключение
Хук rest_api_init
открывает широкие возможности для расширения функциональности WordPress через REST API, позволяя интегрировать сторонние приложения и работать с данными вашего сайта.