flush_rewrite_rules () отменяет эффект add_rewrite_rule ()

Как одна из возможностей моего плагина, я пытаюсь определить настраиваемую структуру http://www.mysite.tld/foo/{action} , например http://www.mysite.tld/foo/{action} . Я использую add_rewrite_rule() вместе с flush_rewrite_rules() при активации плагина, который работает так, как ожидалось.

Пока flush_rewrite_rules() будет вызван снова, во время другого запроса, либо вручную, либо путем включения другого плагина. Когда это произойдет, мое правило переписывания внезапно исчезнет (я использую Rewrite Rules Inspector, чтобы проверить это).

Минимальный код, необходимый для воспроизведения проблемы, следующий:

 <?php /* Plugin Name: PluginA */ register_activation_hook(__FILE__,'PluginA_activation'); function PluginA_activation() { add_rewrite_tag('%foo%','([^&]+)'); add_rewrite_rule('foo/([^/]+)','index.php?foo=$matches[1]','top'); flush_rewrite_rules(); } 

Любая идея, что я делаю неправильно?

Solutions Collecting From Web of "flush_rewrite_rules () отменяет эффект add_rewrite_rule ()"

Правила перезаписи сохраняются в опции. Когда flush_rewrite_rules() , этот параметр удаляется, WordPress собирает все правила, зарегистрированные во время текущего запроса, и записывает этот параметр в базу данных.

Ваша регистрация не выполняется по каждому запросу, поэтому она не существует, когда этот параметр перезаписывается.

Зарегистрируйте правило при загрузке страницы, сбросьте правила перезаписи при активации. Отделите регистрацию и флеш.

 register_activation_hook(__FILE__,'PluginA_activation'); add_action( 'wp_loaded', 'PluginA_rewrite_rules' ); function PluginA_activation() { PluginA_rewrite_rules(); flush_rewrite_rules(); } function PluginA_rewrite_rules() { add_rewrite_tag('%foo%','([^&]+)'); add_rewrite_rule('foo/([^/]+)','index.php?foo=$matches[1]','top'); }