Как программно принудительно установить пользовательские постоянные ссылки в моей теме?

13 дек. 2011 г., 05:01:37
Просмотры: 17.9K
Голосов: 6

Я создаю пользовательскую тему. Это высокоспециализированная тема, которая превращает WordPress в приложение, а не в CMS или блог. Например, система записи в стоматологический офис (с возможностями CMS и виджетов).

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

2
Комментарии

"моей теме нужны красивые URL для правильной работы" почему?

chrisguitarguy chrisguitarguy
20 дек. 2011 г. 22:40:42

@ChristopherDavis потому что это тема-приложение, а не обычная тема. У меня есть MVC-фреймворк, загруженный внутри папки темы, который активно использует перезаписи.

Volomike Volomike
10 янв. 2012 г. 03:49:23
Все ответы на вопрос 3
4

Для полного включения постоянных ссылок также необходимо убедиться, что файл .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.

Важно: Также следует добавить условие, чтобы этот код выполнялся только один раз. (Можно создать опцию и проверить, установлена ли она. Если нет, тогда выполнить этот код для постоянных ссылок и установить эту опцию.)

Я также обычно проверяю, находится ли пользователь в админке, и выполняю код только в этом случае.

22 окт. 2015 г. 05:03:29
Комментарии

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

Pieter Goosen Pieter Goosen
22 окт. 2015 г. 06:00:15

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

Don Rhummy Don Rhummy
22 окт. 2015 г. 06:01:52

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

Pieter Goosen Pieter Goosen
22 окт. 2015 г. 06:03:16

@PieterGoosen сделано. (Хотя у меня это уже было в ответе, за исключением части "is_admin()")

Don Rhummy Don Rhummy
22 окт. 2015 г. 06:04:08
4
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>
20 дек. 2011 г. 22:32:57
Комментарии

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

Otto Otto
25 авг. 2012 г. 15:15:59

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

Don Rhummy Don Rhummy
21 окт. 2015 г. 22:23:35

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

Volomike Volomike
22 окт. 2015 г. 04:57:38

@Volomike я добавил ответ

Don Rhummy Don Rhummy
22 окт. 2015 г. 05:04:06
0

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

/*
 * Установка постоянных ссылок при активации темы
 */
    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 при посещении сайта.

10 июл. 2020 г. 22:29:33