Отключить маршруты по умолчанию для WP REST API

Мне нужно отключить маршруты по умолчанию WP REST API и добавить пользовательские маршруты.

Я нашел этот вопрос, который помогает мне найти следующий ответ.

remove_action('rest_api_init', 'create_initial_rest_routes', 99);

Однако это также удалит любые маршруты настраиваемого типа контента. Так вместо этого вы можете использовать:

add_filter('rest_endpoints', function($endpoints) {
    if ( isset( $endpoints['/wp/v2/users'] ) ) {
        unset( $endpoints['/wp/v2/users'] );
    }
    // etc
});

Но из-за этого мне нужно знать все маршруты по умолчанию и удалять один за другим, что не является самым чистым способом.

Я хотел бы знать, есть ли какой-нибудь более чистый способ достичь этого?

ОБНОВЛЕНИЕ 1:

В соответствии с предложением Криса я хотел бы добавить более подробную информацию к вопросу.

В настоящее время я использую фильтр rest_api_init для добавления моих настраиваемых маршрутов с помощью метода register_rest_route в соответствии с приведенным ниже кодом, который я нашел на этой статье.

add_action( 'rest_api_init', function () {
  register_rest_route( 'myplugin/v1', '/sample/', array(
    'methods' => 'GET',
    'callback' => 'my_awesome_func',
  ) );
} );

function my_awesome_func( $data ) {
  return 'somthing';
}

Пользовательский маршрут работает хорошо, но, к сожалению, я не могу отключить маршруты по умолчанию, например /wp/v2/posts.

Мой вопрос:

Как отключить/отключить маршруты по умолчанию при использовании фильтра rest_api_init для регистрации новых настраиваемых маршрутов?

Ответ 1

REST API Toolbox выполнил эту работу для меня.

Мы можем обрабатывать многие вещи через этот плагин.

введите описание изображения здесь

Ответ 2

В соответствии с другим вопросом, это единственный "чистый" способ сделать это в настоящее время. Самый чистый способ подойти к вещам в Wordpress - это использовать фильтры и/или действия - это позволяет вам взаимодействовать с ядром без внесения изменений в ядро.

При нажатии на фильтры/действия вы также даете другим плагинам возможность работать с аргументами фильтра/действия до/после вашего крючка.

Если вы посмотрите на class-wp-rest-server.php, вы можете легко просмотреть все доступные фильтры и действия, связанные с отдыхом.

Вы заметите это, в частности:

    /**
     * Filters the array of available endpoints.
     *
     * @since 4.4.0
     *
     * @param array $endpoints The available endpoints. An array of matching regex patterns, each mapped
     *                         to an array of callbacks for the endpoint. These take the format
     *                         `'/path/regex' => array( $callback, $bitmask )` or
     *                         `'/path/regex' => array( array( $callback, $bitmask ).
     */
    $endpoints = apply_filters( 'rest_endpoints', $this->endpoints );

Из моих исследований это последнее место для изменения (удаления, изменения или добавления) конечных точек и является точной целью фильтра.

Как побочный элемент, вам не нужно делать это "один за другим" - вы можете просто сделать $endpoints = [], чтобы начать новый.

Ответ 3

Этот вопрос уже принял ответ. Но если кто-нибудь найдет это полезным. Мы можем легко удалить маршруты по умолчанию. Добавьте следующий код в свою тему (детская тема, если есть) functions.php или в любой пользовательский плагин

add_filter('rest_endpoints', function( $endpoints ) {

    foreach( $endpoints as $route => $endpoint ){
        if( false !== stripos( $route, '/wp/' ) ){
            unset( $endpoints[ $route ] );
        }
    }

    return $endpoints;
});