Как установить структуру постоянных ссылок через functions.php

16 окт. 2011 г., 00:19:43
Просмотры: 21.5K
Голосов: 9

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

0
Все ответы на вопрос 3
8
16

Вы можете установить структуру постоянных ссылок, вызвав метод 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' );
16 окт. 2011 г. 18:43:04
Комментарии

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

Tomas Buteler Tomas Buteler
17 окт. 2011 г. 00:26:21

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

soulseekah soulseekah
17 окт. 2011 г. 05:01:18

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

soulseekah soulseekah
17 окт. 2011 г. 07:41:43

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

Tomas Buteler Tomas Buteler
18 окт. 2011 г. 02:21:30

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

Sisir Sisir
28 апр. 2012 г. 14:16:04

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

Tomas Buteler Tomas Buteler
28 апр. 2012 г. 18:08:52

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

csstd csstd
27 окт. 2013 г. 06:27:34

Существует множество мест, куда можно подключить этот код для получения нужного результата

Xhynk Xhynk
4 июн. 2014 г. 00:56:40
Показать остальные 3 комментариев
0

Предыдущий ответ не работает. Я нашел чистое решение. Можно использовать этот код. Он будет работать на 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' );
31 авг. 2017 г. 09:01:49
0
/**
 * Устанавливает постоянные ссылки (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();
12 сент. 2019 г. 16:47:01