WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

flush_rewrite_rules()WP 3.0.0

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

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

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

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

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

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

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

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

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

Также для сброса можно обнулить опцию 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.4.3

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

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