Сбрасывать правила перезаписи на init или rest_api_init?

24 сент. 2018 г., 13:57:11
Просмотры: 1.25K
Голосов: 2

Если я использую REST API для создания конечных точек в своем плагине, следует ли сбрасывать правила перезаписи на хуке init или в rest_api_init?

Я понимаю, что это должно делаться при активации/деактивации плагина. Однако после срабатывания любого из этих событий, разве не нужно учитывать традиционный процесс хуков, чтобы гарантировать сброс правил перезаписи ПОСЛЕ их изменения? То есть - после добавления REST-маршрутов.

Пример:

function activate() {

    // делаем что-то при активации плагина...

    add_action( 'init', function () {

        flush_rewrite_rules( true );
    }, 9999 );

    return true;

}

# Активация плагина
register_activation_hook( __FILE__, function () {

    require_once( PATH . '/backend/inc/activation.php' );
    Backend\activate();

} );

init

add_action( 'init', function () {

    flush_rewrite_rules( true );
}, 9999 );

rest_api_init

add_action( 'rest_api_init', function () {

    flush_rewrite_rules( true );
}, 9999 );
0
Все ответы на вопрос 1
6

Сброс правил перезаписи не следует выполнять регулярно, как указано в кодексе:

Не делайте это на любом хуке, который будет срабатывать регулярно.

Вы должны делать это либо через хуки активации плагина, либо через хуки смены темы:

add_action( 'after_switch_theme', 'wpse315001_flush_rewrite_rules' );

register_deactivation_hook( __FILE__, 'wpse315001_flush_rewrite_rules' );
register_activation_hook( __FILE__, 'wpse315001_flush_rewrite_rules' );
function wpse315001_flush_rewrite_rules() {
    flush_rewrite_rules();
}

Любой из вышеперечисленных вариантов, и это должно быть сделано ПОСЛЕ того, как вы зарегистрировали свои пользовательские типы записей.

Также следует сбрасывать правила перезаписи после деактивации вашего плагина. Это гарантирует, что не останется недействительных правил.

Однако, как и любая другая проблема, это также имеет неприятный обходной путь. Если ваши правила перезаписи содержат полууникальное ключевое слово, вы можете получить правила перезаписи из настроек, выполнить поиск по ним и сбросить правила только при необходимости:

add_action( 'init', 'wpse315001_flush_rewrite_rules', 99999 );
function wpse315001_flush_rewrite_rules(){

    // Получаем правила перезаписи
    $rules = get_option('rewrite_rules');

    // Проверяем, существует ли ваше полууникальное правило в этой строке
    if ( ! strpos( $rules, 'your-rewrite-rules' ) ) {
        // Сбрасываем все!
        flush_rewrite_rules();
    }
}

Возможно, не самое лучшее решение, но оно сработает.

24 сент. 2018 г. 14:58:28
Комментарии

Я понимаю, что это должно выполняться при активации/деактивации плагина. Однако, когда любое из этих событий срабатывает, разве вам всё равно не нужно учитывать традиционный процесс хуков, чтобы убедиться, что правила перезаписи сбрасываются ПОСЛЕ их изменения? То есть - после добавления остальных маршрутов.

Michael Ecklund Michael Ecklund
24 сент. 2018 г. 16:32:48

Изучая класс правил перезаписи, я вижу, что после вызова правила немедленно сбрасываются. Кроме того, кодекс прямо указывает, что это должно быть сделано после регистрации типов записей, вероятно, по той же причине. Какой-нибудь гениальный разработчик может регистрировать типы записей на другом хуке, в теме или даже с приоритетом 999999.

Johansson Johansson
24 сент. 2018 г. 16:39:10

@MichaelEcklund Я также обновил свой ответ для вас.

Johansson Johansson
24 сент. 2018 г. 16:46:43

вызовите функцию, которая регистрирует типы записей, изнутри функции wpse315001_flush_rewrite_rules, затем сбросьте правила.

Milo Milo
24 сент. 2018 г. 16:47:49

@Milo Я предполагаю, что это не так, поскольку это легко решило бы проблему. Думаю, CPT добавляется какими-то другими плагинами.

Johansson Johansson
24 сент. 2018 г. 16:48:42

ну, вы отмечаете, что это должно быть сделано ПОСЛЕ того, как вы зарегистрировали свои пользовательские типы записей, что должно происходить внутри этого блока кода, поэтому для полноты картины это следует добавить, поскольку в текущем виде этот код не будет работать.

Milo Milo
24 сент. 2018 г. 16:54:26
Показать остальные 1 комментариев