Почему flush_rewrite_rules не срабатывает при активации плагина?

5 сент. 2013 г., 11:04:26
Просмотры: 1.89K
Голосов: 1

Я пытаюсь сбросить правила перезаписи в плагине, но это не работает. Мне приходится вручную заходить в настройки постоянных ссылок -> сохранять в админке, чтобы правила перезаписи обновились. Кто-нибудь видит причину?

class SpektrixPlugin {

public function __construct(){
    add_filter('query_vars', array($this, 'add_query_vars'));
    add_action('init', array($this, 'add_rewrite_rules'));
}

public function activate() {

    flush_rewrite_rules();
}

public function deactivate() {

    flush_rewrite_rules();
}

public function add_query_vars($vars) {
    $vars[] = "event"; // имя переменной, как она будет отображаться в URL
    return $vars;
}

public function add_rewrite_rules() {
    $page = get_page_by_title( 'Event' );
    add_rewrite_rule( 'whats-on/(.+)/?$' , 'index.php?page_id='.$page->ID.'&event=$matches[1]' , 'top' );
}


}

$SpektrixEvents = new SpektrixPlugin;

register_activation_hook( __FILE__, array($SpektrixEvents, 'activate') );
register_deactivation_hook( __FILE__, array($SpektrixEvents, 'deactivate') );
0
Все ответы на вопрос 1
6

Перед перезаписью правил их необходимо добавить:

public function activate() {
  $this->add_rewrite_rules();
  flush_rewrite_rules();
}
5 сент. 2013 г. 12:57:12
Комментарии

Применимо ли это также к хуку деактивации?

cybmeta cybmeta
6 сент. 2013 г. 13:32:38

@cybnet нет. При деактивации просто сбрасывайте правила, потому что если плагин не активен, то правила не добавляются при инициализации.

gmazzap gmazzap
6 сент. 2013 г. 15:15:47

Хммм... Я несколько раз пробовал деактивировать свой плагин, выполняя flush_rewrite_rules(); в хуке деактивации, но анализатор rewrite правил всё равно показывает мои пользовательские правила после деактивации. Только сброс в настройках->постоянные ссылки заставляет их исчезнуть (включая правила, добавленные WordPress при регистрации пользовательской таксономии плагином).

cybmeta cybmeta
6 сент. 2013 г. 15:26:29

Если я посещаю URL, обрабатываемый плагином, после его деактивации, я попадаю на домашнюю страницу без кода 404 в HTTP-заголовках. Только после ручного сброса правил перезаписи я получаю ошибку 404, что является корректным HTTP-статусом, если плагин неактивен. Поэтому важно сбрасывать правила перезаписи при деактивации плагина. И это должно происходить автоматически в хуке деактивации. Стоит ли создать новый вопрос по этому поводу?

cybmeta cybmeta
6 сент. 2013 г. 16:52:33

Я знаю, что их можно сбросить вручную, но это не суть вопроса. Также, вы предпочитаете не получать ошибку 404, но предпочтения тоже не в тему. Если страница не существует, сервер обязан вернуть статус 404 — это не теоретическая корректность, а стандарт в веб-приложениях.

cybmeta cybmeta
6 сент. 2013 г. 17:13:22

Я не собираюсь продолжать дискуссию. Из комментариев видна суть: автоматически сбрасывать правила перезаписи при активации и деактивации (как указано в документации WordPress) и соблюдать стандарты.

cybmeta cybmeta
6 сент. 2013 г. 17:37:16
Показать остальные 1 комментариев