WordPress flush rewrite rules

WordPress и управление rewrite правилами

При переносе одного из сайтов на WordPress, также потребовалось перенести имеющийся каталог продукции. При этом было необходимо не только использовать ЧПУ, но и постараться сохранить прежние адреса элементов каталога.

Каталог двухуровневый и адресация имеет следующий вид:

Типов продукции было всего два и в том самописном движке, с которого сайт портировался, каждый тип обслуживался своим скриптом. Если переносить данную модель на WordPress, то логично сделать две страницы, slug имена которых будут соответствовать типам продукции, а страницу производителя и конечного продукта генерировать налету, предварительно не создавая для них отдельных страниц в WP.

У WordPress есть механизм, позволяющий расширять стандартные правила роутинга, основанный на функции add_rewrite_rule() . Более того, в Сети хватает заметок о том, как им пользоваться и что необходимо предпринять, чтобы добиться желаемого результата. Но не одна из них, как оказалось, не описывает проблему полностью. Советы и решения не работают без напильника или описывают неочевидные вещи.

И так, решить задачу можно двумя способами:

  • локально, то есть через используемый шаблон и файл functions.php этого шаблона;
  • разработкой плагина, что несколько сложнее, но идеологически правильно.

Задача решается на WordPress версии 3.3.1

Независимо от того, какой способ будет выбран, принцип работы одинаковый. Описываем в файле плагина или в файле functions.php функцию, например, с именем addRewrite() . В теле функции пишем следующий код:

Функция add_rewrite_rule() добавляет правило роутинга или рерайта, если выражаться терминологией, принятой WP. В качестве первого параметра передается регулярное выражение, описывающее допустимое значение uri. Второй параметр задает перенаправление.

В данном конкретном случае, добавляемое правило будет работать для страницы, слаг имя (slug) которой или tyres (каталог шин), или discs (каталог дисков). Второй сегмент, описанный шаблоном ([a-z]+), будет содержать имя производителя. В рамках решения задачи, которую я упоминал вначале, должен быть описан и третий сегмент, где будет передано наименование конкретного товара из каталога. Но я опустил данную секцию, дабы не загромождать регулярное выражение.

Нюансы использования add_rewrite_rule():

  • правило не должно начинаться со слеша. Как вы можете видеть по коду примера, перед (tyres|discs) слеш не стоит;
  • нумерация элементов в массиве $matches начинается с 1 (единицы), а не с нуля;
  • функция может быть вызвана несколько раз, каждый раз добавляя новое правило. Третий параметр задает позицию добавляемого правила в общем стеке правил. В данном примере они добавляются в начало. Значение умолчания – bottom.

Теперь, с помощью add_action() вешаем наш хук на «событие» init:

Это пример чистого использования WordPress функции add_rewrite_rule(). В таком виде работать ничего не будет.

Во-первых, список переменных, которые WP готов принять, ограничен и переменная producer, которая используется в переадресации, не будет принята и, как следствие, не будет доступна в плагине или шаблоне.

Читайте также:  Canon e16 картридж для какого принтера

Для исправления ситуация необходимо задействовать функцию add_rewrite_tag() , которая регистрирует дополнительные переменные, передаваемые скрипту.

В первом параметре передается имя переменной, а во втором формат значения, задаваемый регулярным выражением.

Нюансы использования add_rewrite_tag():

  • вызов функции должен произойти до процесса инициализации или во время него. Ситуация, когда функция вызывается внутри хука, повешенного на событие init, наиболее удобна;
  • первый параметр должен принимать имя, которое обернуто знаками % (процент).

Еще одна особенность, о которой почти нигде не говорится, заключается в том, что WordPress кэширует правила переадресации. Кэшируются они в базу данных, в таблицу wp_options. Именем опции является rewrite_rules. В качестве значения хранится сериализованный массив.

Если кэш не сбросить, то ваше новое правило работать не будет. Сбросить кэш можно тремя способами:

  • создать новую страницу или изменить существующую в панели WordPress;
  • в панели WP, на странице «постоянные ссылки» пересохранить правила формирования ЧПУ;
  • вызвать функцию flush_rewrite_rules() .

Функция flush_rewrite_rules() должна вызываться после того, как вы добавили свои правила.

И так, рабочий пример кода выглядит следующим образом:

Если этот код засунуть в файл functions.php, то функция flush_rewrite_rules() будет вызываться при каждом обновлении страницы. Это совершенно неправильно, конечно. В рабочих проектах так делать недопустимо.

Для получения доступа к значению зарегистрированной переменной необходимо использовать объект $wp_query и его свойство query_vars .

Не пытайтесь общаться с данным объектом из файла functions.php вашей темы, так как массив $wp_query->query_vars будет пустым и свою переменную вы там не найдете. Но в теле шаблона все будет так, как и ожидается:

Выведет значение переданной переменной &producer.

Дальше, например, можно подставить это значение в SQL запрос и получить список товаров для требуемого производителя. Так делать некрасиво. Работать с моделью из представления – совсем дурной тон, но что уж поделаешь, коль в WordPress такой способ хорошо прижился и многими практикуется. В общем, это на вашей совести.

WordPress rewrite в плагине с использованием Shortcode API

Идеологически верным является написание небольшого плагина, который сделает все тоже самое, но не будет вынуждать нас писать логику в шаблоны. Самый простой вариант – реализация через WordPress Shortcode API.

В тело страницы или записи блога вставляем код shortcode, например такой [my_catalog]. В файле плагина пишем тот же самый код, что и в случае с шаблонами и добавляем к нему регистрацию нового шорткода:

Внутри функции catalogShortCode() пишем остальную логику, где уже работаем с БД и прочее.

В целом, точно также, через shortcode, можно работать и в файле functions.php, но вариант с плагином более изящен и практичен. Если вы примете решение сменить тему оформления, вам не придется копировать код из одного шаблона в другой. А если у вас мультидоменная установка WP, то без плагина не обойтись в принципе.

Использование flush_rewrite_rules() по уму.

В документации WordPress дается правильный пример сброса кэша правил роутинга. Предлагается вот такой вариант:

Как вы могли заметить, массив $rules является ассоциативным, где ключами служат регулярные выражения, передаваемые в качестве значения первого параметра функции add_rewrite_rule() .

Читайте также:  Hp t630 на принтер плоттер ру

Комментарии (17)

Большое спасибо, ваша статья помогла.
не забывайте перед echo $wp_query->query_vars[‘producer’];
global $wp_query;

Источник

WP_Rewrite::flush_rules() │ public │ WP 2.0.1

Обновляет правила перезаписи ссылок (ЧПУ) в базе данных и кэше.

С версии 3.0. для обновления правил перезаписи существует функция-обертка flush_rewrite_rules().

Нужно использовать после добавления новых правил перезаписи УРЛов, чтобы новые правила вступили в силу, иначе новые правила перезаписи работать не будут. Новые правила добавляются функцией add_rewrite_rule().

Не надо использовать функцию каждый раз при загрузке страницы. Не вешайте функцию на хуки, который вызывается при загрузке страницы, типа: init. Эта функция требовательна к ресурсам, поэтому, её нужно использовать один раз, например, во время активации/деактивации плагина/темы.

WordPress сохраняет все правила перезаписи в кэше. Иногда плагины, темы или функции могут добавить свои, новые правила перезаписи и WordPress ничего не будет знать об этих новых правилах, до тех пор, пока все правила не будут перезаписаны (обновлены).

Это не обычная функция, а метод класса WP_Rewrite, поэтому при вызове этого метода, нужно убедится что переменная $wp_rewrite , содержащая в себе экземпляр класса WP_Rewrite, определена глобально. Вызывать метод нужно по правилам классов: $wp_rewrite->flush_rules(); .

ВАЖНО: Этот метод (функция) вызывается во время обновления настроек ЧПУ, поэтому для ручного обновления правил перезаписи можно просто зайти на страницу настроек ЧПУ ( параметры > постоянные ссылки ) правила перезаписи при этом обновятся.

Источник

flush_rewrite_rules() │ WP 3.0.0

Обновляет правила перезаписи ЧПУ: удаляет имеющиеся, генерирует и записывает новые.

Эта функция полезна при регистрации новых типов записей, так как она позволяет автоматически сбрасывать правила перезаписи ЧПУ. Обычно это делается вручную.

Если вы создали новый тип записи с помощью функции register_post_type(), затем создали новую запись этого типа, и при заходе на неё увидели ошибку 404, значит правила перезаписи ЧПУ не были сброшены.

Так происходит потому что новые правила перезаписи (хранятся в БД) не были созданы. Чтобы их создать нужна эта функция.

Вручную сбросить правила перезаписи ЧПУ можно через страницу настроек «Постоянные ссылки» (Permalinks). Во время посещения этой страницы, правила перезаписи удаляются из базы данных, генерируются новые и сохраняются на место прежних.

В старых версиях WP на этой страницы нужно было еще нажать кнопку Сохранить.

Сбрасывать правила перезаписи необходимо только единожды, потому что это ресурсоемкая операция. Сбрасывать правила можно при активации, деактивации, удалении плагина или в других случаях, когда вы точно знаете что это нужно сделать. Не нужно использовать функцию каждый раз при генерации страницы! Не нужно вешать эту функцию на хук init , кроме случаев, когда вы знаете что делаете.

Сбрасывать правила перезаписи нужно на хуке wp_loaded.

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

Также для сброса можно обнулить опцию rewrite_rules (в ней хранятся правила ЧПУ).

При следующей генерации страницы опция создастся автоматически. См. wp_rewrite_rules(). При этом базовые правила ЧПУ будут получены сразу по необходимости, а также будет создано событие на перегенерацию на хуке wp_loaded , чтобы еще раз правильно обновить ЧПУ.

Читайте также:  Linux с оболочкой mac os

Источник

wp rewrite

Перечисляет или сбрасывает правила перезаписи сайта, обновляет структуру ссылок.

Список команд Описание
wp rewrite flush Сброс правил перезаписи.
wp rewrite structure Обновляет структуру постоянных ссылок.
wp rewrite list Возвращает список текущих правил перезаписи.

Примеры

Исходный код команд

wp rewrite flush

Сброс правил перезаписи.

Обновляет правила перезаписи ЧПУ: удаляет имеющиеся, генерирует и записывает новые. Команда работает на основе функции flush_rewrite_rules(), а значит её описание справедливо и для этой команды.

To regenerate a .htaccess file with WP-CLI, you’ll need to add the mod_rewrite module to your wp-cli.yml or config.yml. For example:

Использование

Можно указать Глобальные параметры и следующие:

[—hard] Нужно ли обновлять файл .htaccess или просто обновить правила в базе данных. Работает только на обычном сайте (не мультисайт).

Примеры

wp rewrite structure

Обновляет структуру постоянных ссылок.

Sets the post permalink structure to the specified pattern.

To regenerate a .htaccess file with WP-CLI, you’ll need to add the mod_rewrite module to your WP-CLI config. For example:

Использование

Можно указать Глобальные параметры и следующие:

The new permalink structure to apply. [—category-base=] Set the base for category permalinks, i.e. ‘/category/’. [—tag-base=] Set the base for tag permalinks, i.e. ‘/tag/’. [—hard] Perform a hard flush — update .htaccess rules as well as rewrite rules in database.

Примеры

wp rewrite list

Возвращает список текущих правил перезаписи.

wp rewrite list [—match= ] [—source= ] [—fields= ] [—format=

Источник

Developer Resources

Removes rewrite rules and then recreate rewrite rules.

Contents

Description

Calls WP_Rewrite::wp_rewrite_rules() after removing the ‘rewrite_rules’ option.
If the function named ‘save_mod_rewrite_rules’ exists, it will be called.

Parameters

More Information

This method can be used to refresh WordPress’ rewrite rule cache. Generally, this should be used after programmatically adding one or more custom rewrite rules.

Because this function can be extremely costly in terms of performance, it should be used as sparingly as possible – such as during activation or deactivation of plugins or themes. Every attempt should be made to avoid using it in hooks that execute on each page load, such as init.

What it does

WordPress keeps a cache of all custom rewrite rules. Sometimes plugins or themes make modifications to those rules, however WordPress will not actually recognize the changes until the cache is regenerated.

This is not a procedural function, but a non-static method of the WP_Rewrite class. To call flush_rules(), you must first ensure you are using WordPress’ $wp_rewrite global, and call it as a method (see “Usage” above for an example).

Note: This same method is called whenever permalink settings are changed or saved in the WordPress admin, so rewrite rules can be manually refreshed by visiting the Settings > Permalinks screen in WordPress’s admin.

WARNING: If this function is called without a parameter or with a parameter of true, your .htaccess will be overwritten and any custom rules will be lost!

Источник

Поделиться с друзьями
КомпСовет
Adblock
detector