Как установить структуру постоянных ссылок через functions.php
Я настраиваю сеть WordPress и хочу, чтобы все новые сайты имели одинаковую структуру постоянных ссылок (например, "/%year%/%monthnum%/%postname%/"). Интересует, возможно ли это сделать через хуки или модификации в functions.php, не полагаясь на то, что пользователи будут выбирать эту структуру самостоятельно.

Вы можете установить структуру постоянных ссылок, вызвав метод set_permalink_structure()
глобального объекта $wp_rewrite
.
add_action( 'init', function() {
global $wp_rewrite;
$wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
} );
Вот версия кода для PHP < 5.3 на случай, если у вас возникают ошибки.
function reset_permalinks() {
global $wp_rewrite;
$wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
}
add_action( 'init', 'reset_permalinks' );

Копирование и вставка вашего кода вызывает ошибку, но объяснение срабатывает! Только интересно, являются ли мой вопрос / намерения хорошей практикой...

Я предполагаю, что вы используете PHP < 5.3, где замыкания (анонимные функции) были недоступны, поэтому я отредактировал свой ответ, включив старый способ. Я протестировал оба варианта кода в файле functions.php своей темы, так что дайте знать, если это сработает. Ещё я заметил, что написал %year&
вместо %year%
, так что исправил и это.

Томас, спасибо за принятие ответа. Рад, что смог помочь. Что касается хороших практик — я считаю, что если ваша цель — принудительно зафиксировать такую структуру постоянных ссылок на всех сайтах, то это оправданно; под «зафиксировать» я подразумеваю, что код не позволит вносить изменения в структуру через админку. Если это приемлемо, то, думаю, такой подход вполне допустим.

У меня установлена версия 5.2.17, так что это объясняет ситуацию! Вторая версия работает из коробки :) Спасибо!

Оно работает, но вызывает конфликт при сохранении настроек со страницы постоянных ссылок (404 на записях). Затем при загрузке сайта (хук init) структура постоянных ссылок снова меняется (снова 404 на записях). Использование $wp_rewrite->flush_rules();
решает проблему. Плохая практика использовать это на хуке init и запускать при каждой загрузке. Просто посещение страницы постоянных ссылок сделает своё дело.

Вся идея заключалась в отключении страницы настроек постоянных ссылок, так что, возможно, мне это сойдёт с рук?

Этот вызов должен происходить на хуке 'after_switch_theme' или при активации плагина, после чего должен следовать вызов 'flush_rewrite_rules()'

Предыдущий ответ не работает. Я нашел чистое решение. Можно использовать этот код. Он будет работать на 100%. Спасибо
/**
* Настройка перезаписи URL, при активации темы
*/
if (isset($_GET['activated']) && is_admin()) {
global $wp_rewrite;
$wp_rewrite->set_permalink_structure('/%postname%/');
$wp_rewrite->flush_rules();
}
/**
* Перенаправление на страницу настроек постоянных ссылок.
* Иначе правила перезаписи не будут работать корректно.
*/
function redirect_to_permalink() {
wp_redirect('options-permalink.php');
}
add_action( 'after_switch_theme', 'redirect_to_permalink' );

/**
* Устанавливает постоянные ссылки (permalinks) для WordPress
*/
function setPermaLink(){
// Структура постоянных ссылок по умолчанию
$ps = '/%category%/%postname%/';
// Санитизация структуры постоянных ссылок
$permalink_structure = sanitize_option( 'permalink_structure', $ps);
// Префикс для блога
$blog_prefix = '/blog';
// Префикс для index.php
$prefix = '/index.php';
// Если структура постоянных ссылок не пуста
if ( ! empty( $permalink_structure ) ) {
// Очистка структуры от лишних слешей и символов #
$permalink_structure = preg_replace( '#/+#', '/', '/' . str_replace( '#', '', $permalink_structure ) );
// Обработка структуры в зависимости от наличия префиксов
if ( $prefix && $blog_prefix ) {
$permalink_structure = $prefix . preg_replace( '#^/?index\.php#', '', $permalink_structure );
} else {
$permalink_structure = $blog_prefix . $permalink_structure;
}
}
// Установка структуры постоянных ссылок и сброс правил перезаписи
$wp_rewrite->set_permalink_structure( $permalink_structure );
flush_rewrite_rules();
}
// Вызов функции
setPermaLink();
