WP_Rewrite::flush_rules()publicWP 2.0.1

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

Смотрите функцию-обертку flush_rewrite_rules().

Нужно использовать после добавления новых правил перезаписи УРЛов, чтобы новые правила вступили в силу, иначе они работать не будут. Новые правила добавляются функцией 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_rewrite_rules()
Хуки из метода

Возвращает

null. Функция ничего не возвращает.

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

$wp_rewrite->flush_rules();

Примеры

0

#1 Пример обновления правил перезаписи УРЛов:

// Убедимся, что переменная $wp_rewrite определена глобально
global $wp_rewrite;
$wp_rewrite->flush_rules();

Или можно так:

$GLOBALS['wp_rewrite']->flush_rules();
0

#2 Пример обновления правил перезаписи с использованием функции flush_rewrite_rules(), во время активации плагина:

register_activation_hook( __FILE__, 'author_base_rewrite' );
function author_base_rewrite(){
	flush_rewrite_rules( false );
}

flush_rewrite_rules( false ) - false указывает, что не нужно обновлять файл .htaccess, если не указать false, то файл .htaccess будет обновлен в соответствии с правилами.

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

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

Код WP_Rewrite::flush_rules() WP 6.8.1

public function flush_rules( $hard = true ) {
	static $do_hard_later = null;

	// Prevent this action from running before everyone has registered their rewrites.
	if ( ! did_action( 'wp_loaded' ) ) {
		add_action( 'wp_loaded', array( $this, 'flush_rules' ) );
		$do_hard_later = ( isset( $do_hard_later ) ) ? $do_hard_later || $hard : $hard;
		return;
	}

	if ( isset( $do_hard_later ) ) {
		$hard = $do_hard_later;
		unset( $do_hard_later );
	}

	$this->refresh_rewrite_rules();

	/**
	 * Filters whether a "hard" rewrite rule flush should be performed when requested.
	 *
	 * A "hard" flush updates .htaccess (Apache) or web.config (IIS).
	 *
	 * @since 3.7.0
	 *
	 * @param bool $hard Whether to flush rewrite rules "hard". Default true.
	 */
	if ( ! $hard || ! apply_filters( 'flush_rewrite_rules_hard', true ) ) {
		return;
	}
	if ( function_exists( 'save_mod_rewrite_rules' ) ) {
		save_mod_rewrite_rules();
	}
	if ( function_exists( 'iis7_save_url_rewrite_rules' ) ) {
		iis7_save_url_rewrite_rules();
	}
}