Как программно принудительно установить пользовательские постоянные ссылки в моей теме?
Я создаю пользовательскую тему. Это высокоспециализированная тема, которая превращает WordPress в приложение, а не в CMS или блог. Например, система записи в стоматологический офис (с возможностями CMS и виджетов).
Поскольку моей теме нужны красивые URL для правильной работы, мне необходимо, чтобы файл .htaccess создавался автоматически, как при ручной настройке постоянных ссылок на "Пользовательские" (когда вводится что-то вроде %postname%). Как программно вызвать это в WordPress, чтобы система создала этот файл? Конечно, я мог бы просто перезаписать файл самостоятельно при активации темы, но правильнее было бы использовать для этого API WordPress.

Для полного включения постоянных ссылок также необходимо убедиться, что файл .htaccess создан. Для этого нужно установить опцию и сбросить правила с помощью булевого значения.
global $wp_rewrite;
// Записываем правило
$wp_rewrite->set_permalink_structure('/%postname%/');
// Устанавливаем опцию
update_option( "rewrite_rules", FALSE );
// Сбрасываем правила и указываем записать htaccess
$wp_rewrite->flush_rules( true );
Если вы используете это в плагине, код должен находиться в хуке init
, не в хуке load
. Если код будет в хуке load
, возникнет ошибка, указывающая, что $wp_rewrite
равен null.
Важно: Также следует добавить условие, чтобы этот код выполнялся только один раз. (Можно создать опцию и проверить, установлена ли она. Если нет, тогда выполнить этот код для постоянных ссылок и установить эту опцию.)
Я также обычно проверяю, находится ли пользователь в админке, и выполняю код только в этом случае.

Не следует сбрасывать правила перезаписи на хуке init
, никогда. Это дорогостоящая операция, которая значительно замедляет время загрузки страницы. Правила перезаписи сохраняются в базе данных, поэтому сброс правил на init
означает множество обращений к БД для повторного сохранения правил перезаписи при каждой загрузке страницы.

@PieterGoosen Прочитайте остальную часть моего ответа. Я проверяю, были ли правила уже установлены, и устанавливаю их только один раз (при первой установке плагина), после чего они больше не выполняются. Также я проверяю is_admin()
, но это необязательно, если код выполняется только один раз.

Добавьте эту информацию в свой ответ. Это важные сведения, которые сделают ваш ответ более приемлемым ;-)

function change_permalinks() {
global $wp_rewrite;
$wp_rewrite->set_permalink_structure('/%postname%/');
$wp_rewrite->flush_rules();
}
add_action('init', 'change_permalinks');
Вам может не понадобиться хук действия, если вы добавляете этот код в функцию активации вашей темы.
Я также обнаружил, что это работает лишь частично. Вам всё равно нужно зайти на страницу настроек постоянных ссылок, чтобы файл .htaccess был создан. Так что же делать? Я обнаружил, что можно использовать IFRAME, который автоматически загружает эту страницу из панели настроек темы, и тогда файл .htaccess создаётся автоматически.
<iframe style="position:absolute;top:-5000px" src="<?= site_url() ?>/wp-admin/options-permalink.php"></iframe>

Вызов flush_rules в действии init - это очень плохая идея. Это может быть допустимо в функции активации или установки, но не в init.

Я знаю, что это старый вопрос, но вы можете заставить его перезаписать файл ".htaccess", изменив ваши правила сброса на это: update_option( "rewrite_rules", FALSE ); $wp_rewrite->flush_rules( true );
Это приведет к записи файла ".htaccess".

@DonRhummy пожалуйста, опубликуйте это как ответ, и я отмечу его как новый правильный ответ.

Вот как я использую этот код, чтобы изменения применялись только при активации моей темы и только если нет ранее сохраненных настроек (чтобы не сломать существующие настройки до использования моей темы).
/*
* Установка постоянных ссылок при активации темы
*/
function set_custom_permalinks() {
$current_setting = get_option('permalink_structure');
// Прерываем, если настройки уже сохранены
if($current_setting) {
return
}
// Сохраняем постоянные ссылки с пользовательскими настройками, принудительно создаем файл правил
global $wp_rewrite;
update_option("rewrite_rules", FALSE);
$wp_rewrite->set_permalink_structure('/news/%postname%/');
$wp_rewrite->flush_rules(true);
}
add_action('after_switch_theme', 'set_custom_permalinks');
Преимущество этого подхода в том, что код выполняется только один раз при активации темы, а не при каждой загрузке WordPress при посещении сайта.
