WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Рекомендуемые продукты со скидкой от Template Monster

flush_rewrite_rules() WP 3.0

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

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

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

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

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

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

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

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

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

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

delete_option( 'rewrite_rules' );
Работает на основе: WP_Rewrite::flush_rules()
✈ 1 раз = 0.010174с = тормоз | 50000 раз = 196.39с = тормоз | PHP 7.1.11, WP 4.9.8

Хуков нет.

Возвращает

Ничего не возвращает.

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

flush_rewrite_rules( $hard );
$hard(логический)
Нужно ли обновлять файл .htaccess или просто обновить правила. По умолчанию - true, обновляется файл .htaccess.
По умолчанию: true

Примеры

#1. Сброс ЧПУ при активации/деактивации плагина

Пример, показывает как сбрасывать правила перезаписи ЧПУ в момент активации/деактивации плагина:

function myplugin_activate() {

	// Здесь, регистрируем таксономию или тип поста

	flush_rewrite_rules();
}

register_activation_hook( __FILE__, 'myplugin_activate' );

function myplugin_deactivate() {
	flush_rewrite_rules();
}
register_deactivation_hook( __FILE__, 'myplugin_deactivate' );

#2. Сброс ЧПУ при активации/деактивации темы

Пример, показывает как сбрасывать правила перезаписи ЧПУ в момент активации темы:

/* Сбрасываем правила для произвольного типа записей. */
add_action( 'after_switch_theme', 'bt_flush_rewrite_rules' );

function bt_flush_rewrite_rules() {
	 flush_rewrite_rules();
}

#3. Сброс ЧПУ, если файл был изменен или каждые 48 часов

Если вы разрабатываете тему, то на время разработки может пригодится такой код, который будет сбрасывать правила перезаписи ЧПУ, если файл был изменен или каждые 48 часов.

// do not use on live/production servers
add_action( 'init','maybe_rewrite_rules' );
function maybe_rewrite_rules() {
	// Получим время файла, как номер версии
	$ver = filemtime( __FILE__ );
	$defaults = array( 'version' => 0, 'time' => time() );
	$r = wp_parse_args( get_option( __CLASS__ . '_flush', array() ), $defaults );

	// Сбрасываем если изменилась версия если прошло 48 часов.
	if ( $r['version'] != $ver || $r['time'] + 172800 < time() ) {
		flush_rewrite_rules();

		$args = array( 'version' => $ver, 'time' => time() );
		if ( ! update_option( __CLASS__ . '_flush', $args ) )
			add_option( __CLASS__ . '_flush', $args );
	}

}

Заметки

  • Global. WP_Rewrite. $wp_rewrite

Список изменений

С версии 3.0.0 Введена.

Код flush rewrite rules: wp-includes/rewrite.php WP 5.2.3

<?php
function flush_rewrite_rules( $hard = true ) {
	global $wp_rewrite;
	$wp_rewrite->flush_rules( $hard );
}

Cвязанные функции

Из метки: Rewrite (ЧПУ перезапись)

1 коммент
  • Александр wppw.ru

    flush_rewrite_rules плохо отрабатывает на активации/деактивации плагина (в частности из-за возможного переопределения поведения через фильтры). Гораздо надёжнее удалять опцию

    delete_option( 'rewrite_rules' );

    Вот такой мой небольшой вклад в ресурс и большое спасибо за труды, многое почерпнул отсюда)

    1
    Ответить2 мес назад #
Здравствуйте, !     Войти . Зарегистрироваться