Сбрасывать правила перезаписи на init или rest_api_init?
Если я использую 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 );

Сброс правил перезаписи не следует выполнять регулярно, как указано в кодексе:
Не делайте это на любом хуке, который будет срабатывать регулярно.
Вы должны делать это либо через хуки активации плагина, либо через хуки смены темы:
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();
}
}
Возможно, не самое лучшее решение, но оно сработает.

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

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

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

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