eurobyte.ru - мощные сервера с Дата-центрами в Нидерландах и Москве. От 159 ₽/мес.

flush_rewrite_rules()WP 3.0.0

Обновляет правила перезаписи ссылок (ЧПУ) в базе данных и кэше. Удаляет имеющиеся правила, генерирует и записывает новые.

Нужно использовать после добавления новых правил перезаписи УРЛов, чтобы новые правила вступили в силу, иначе они работать не будут. Новые правила добавляются функцией add_rewrite_rule(), или при регистрации типа поста или таксономии.

WordPress сохраняет все правила перезаписи в опции rewrite_rules (в кэше). Иногда плагины, темы или функции могут добавить свои, новые правила перезаписи и WordPress ничего не будет знать об этих новых правилах, до тех пор, пока все правила не будут перезаписаны (обновлены).

Эта функция требовательна к ресурсам, поэтому, нельзя вызывать функцию каждый раз при генерации странице (при запросе). Её нужно использовать один раз! Например, во время активации/деактивации плагина/темы, или после условия (проверки), что это нужно сделать.

Сбрасывать правила перезаписи рекомендуется не раньше события wp_loaded.

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

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

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

Другие варианты сброса правил перезаписи:

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

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

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

update_option( 'rewrite_rules', '' );

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

Работает на основе: WP_Rewrite::flush_rules()
1 раз — 0.010174 сек (тормоз) | 50000 раз — 196.39 сек (тормоз) | PHP 7.1.11, WP 4.9.8

Хуков нет.

Возвращает

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

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

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

Примеры

1

#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' );
0

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

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

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

function bt_flush_rewrite_rules() {
	 flush_rewrite_rules();
}
0

#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 WordPress rewrite component.

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

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

Код flush_rewrite_rules() WP 6.8

function flush_rewrite_rules( $hard = true ) {
	global $wp_rewrite;

	if ( is_callable( array( $wp_rewrite, 'flush_rules' ) ) ) {
		$wp_rewrite->flush_rules( $hard );
	}
}
2 комментария
    Войти