У меня немного странная проблема с правилами перезаписи, которые не обновляются должным образом.
Я пытался использовать flush_rewrite_rules();
и flush_rewrite_rules(true);
.
Я также пытался глобализировать, $wp_rewrite
используя $wp_rewrite->flush_rules();
и$wp_rewrite->flush_rules(true);
Ни один из которых, кажется, не очищает правила перезаписи правильно. Эти вызовы действительно сбрасывают правила перезаписи при вызове. Откуда я это знаю? Использование решения для отладки перезаписи правил сброса .
В настоящее время я переписал правила, сбрасываемые при активации и деактивации плагина. Там нет проблем.
У меня есть страница настроек администрирования плагина для пользователей, чтобы настроить плагин. Некоторые параметры настраивают структуру постоянных ссылок, поэтому правила перезаписи необходимо сбросить на странице настроек администрирования плагина «Сохранить настройки». (Использует стандарт update_option();
) для сохранения настроек.
Хотелось бы отметить, что в зависимости от указанных настроек создаются настраиваемые типы сообщений, соответствующие заданным пользователем настройкам. Поэтому правила перезаписи должны быть сброшены сразу после сохранения настроек. Это где вещи не функционируют должным образом.
Приведенное выше решение для отладки правил перезаписи, представленное командой @toscho
, показывает, что оно сбрасывает тонны правил перезаписи. Однако при посещении отдельного элемента пользовательского типа записи или даже архива пользовательского типа записи в этом случае каждый из них возвращает 404 ошибки.
Пользовательский тип записи зарегистрирован правильно и соответствующим образом. Я точно знаю, что это не проблема.
Сразу же после установки плагина с настройками страницы администрирования сохраните. Создаются пользовательские типы записей, настраивается структура постоянных ссылок, и все правила перезаписи пытаются быть сброшены.
Пользовательские типы сообщений затем загружаются всегда и загружаются init
как обычно.
По какой-то причине правила перезаписи не обновляются должным образом, потому что, как я уже говорил, посещение отдельных или архивных разделов пользовательского типа записи возвращает 404 ошибки.
Теперь странная часть: если все, что я делаю, это просто посещаю страницу настроек постоянных ссылок администрирования, а затем возвращаюсь к интерфейсу, чтобы просмотреть отдельные или архивные разделы пользовательского типа записи, они волшебным образом работают, как и ожидалось.
Что делает эта страница с настройками администрации, что я не делаю, что позволяет правилам перезаписи корректно сбрасываться, а мои нет?
Я имею в виду, что как временное решение я перенаправляю пользователя на страницу настроек постоянных ссылок администрирования после сохранения страницы настроек администрирования плагина, но это не идеальное решение. Я бы предпочел, чтобы правила перезаписи просто корректно вставлялись в код моего плагина.
Есть ли в WordPress определенный момент, когда сброс правил перезаписи просто не сбрасывает ВСЕ правила больше?
admin_menu
- Добавлена страница настроек плагина для администрирования WordPress.
add_options_page()
- Страница настроек плагина добавлена в меню настроек.
Страница настроек отображается в обратном вызове для add_options_page()
. Это также где $_POST
обрабатывается для обновления настроек плагина и очистки правил перезаписи.
Поскольку это уже длинный вопрос, я хотел бы предоставить блоки кода (если это поможет) в удаленной ссылке, чтобы помочь в получении правильного ответа.
flush_rewrite_rules
, которая просто удаляетrewrite_rules
опцию и восстанавливает ее, вы можете открыть файлwp-admin/options-permalinks.php
и посмотреть, где это происходит. так как эта операция просто удаляет весь параметр, невозможно частично очистить правила.init
который регистрирует типы сообщений. Я подумал, что настройки страницы сохраняются, и страница перезагружается ... затемinit
снова запускается, чтобы зарегистрировать необходимые типы записей. Поэтому я решил, что типы сообщений уже будут загружены, и все, что мне нужно было сделать, это обновить опцию, а затем сбросить правила перезаписи со страницы настроек моего плагина. Я выложу ответ, как я нашел решение.Ответы:
Лучшее место для сброса правил переписывания - активация / деактивация плагина.
Смотрите статью кодекса
Заранее извиняюсь, я не прошел весь ваш вопрос, так что это немного ответ печенья.
источник
Трудно сказать, что не так, не видя ваш код. Но после сохранения некоторых настроек удобно подключиться,
admin_init
как показано ниже, чтобы сбросить правила перезаписи.Код:
Вы должны установить опцию где-то на странице настроек или, если быть точным, где-то в процессе сохранения настроек. Делать это без опции плохо, потому что вы не хотите каждый раз сбрасывать правила.
Примечание: не проверено
источник
*_option()
из-за страницы настроек. @helgathevikingУ меня был файл класса типов постов, который отвечал за чтение настроек опций плагина и создание необходимых пользовательских типов постов на основе заданных пользователем настроек.
Этот файл классов типов сообщений был загружен на крючок
init
.Я решил, что все, что мне нужно будет сделать, это обновить настройки плагина, а затем сбросить правила перезаписи. Так как класс типов сообщений уже был загружен на основе настроек плагина. Но со страницами администрирования они загружаются ПОСЛЕ
init
крючка.Типы записей никогда не были зарегистрированы, потому что настройки еще не были установлены. Класс регистрации типов записей закончился преждевременно, и типы записей не были зарегистрированы.
Решение было:
(Ранее ... step2 отсутствовал - как упомянуто выше ...)
Отныне типы сообщений будут загружаться на
init
крючок, и в них уже будут указаны параметры, позволяющие создавать типы сообщений и соединять их с соответствующими правилами перезаписи.По какой-то причине мне пришлось добавить вызов JavaScript для перенаправления на текущую страницу, выполнив три вышеуказанных шага.
Мне также пришлось добавить вызов
flush_rewrite_rules();
на странице настроек администрирования плагина.Так что ради обеспечения того, чтобы все сбрасывалось ...
Шаг 1) Перейдите на страницу настроек администрирования плагина. - Первоначальная промывка.
Шаг 2) Обновите настройки плагина. - Второй поток.
Шаг 3) Страница перенаправляет на страницу настроек плагина. Вызывает ... Третий и последний сброс (аналогично первоначальному сбросу - выполняется автоматически при посещении страницы настроек плагина)
Я не говорю, что это практическое решение, но оно сработало для меня. Очень странная проблема и, скорее всего, связана с моей инфраструктурой кодирования.
источник
@ tazo-todua это сработало и у меня при использовании мультисайта.
источник
МОЕ найденное решение было:
источник
У меня была точно такая же проблема. В моем плагине у меня есть типы записей, которые создаются динамически. Поэтому они не могут быть зарегистрированы с помощью
register_post_type()
статического метода во времяactivation_hook
и, следовательно, еще не активны, когдаflush_rewrite_rules()
запускаются во время этого перехвата (что обычно является рекомендуемым способом сброса правил перезаписи).В конце концов, самое чистое решение, которое я мог придумать, это очистить правила перезаписи после регистрации типов записей, но, конечно, только если такая очистка действительно была необходима (поскольку операция выполняется медленно). В моем случае у меня есть несколько пользовательских типов записей, которые наследуются от одного базового класса, и поэтому было желательно реализовать код, выполняющий очистку.
Необходимость промывки можно определить, посмотрев на результат
get_option( 'rewrite_rules' )
:Недостатки:
register_post_type()
.Преимущества:
Используйте это только в том случае, если вы не можете зарегистрировать свой тип записи в статической функции, которая может вызываться как во время, так
init
и вactivation_hook
!Зависимость от того, как
register_post_type()
выглядят правила перезаписи, сгенерированные во время, можно уменьшить, заменив тестif(strpos($key, $args['rewrite']['slug'] ) === 0)
более сложным, то есть регулярным выражением.источник