Функция restore_current_blog()
в WordPress используется для возврата к исходному сайту после вызова switch_to_blog()
. Она восстанавливает глобальные переменные и другие данные, чтобы WordPress мог продолжать работать с исходным сайтом, что важно для корректного отображения URL и загрузки медиафайлов. Если restore_current_blog()
не использовать, система может остаться в «переключенном» состоянии, что вызовет ошибки.
restore_current_blog(): bool
Возвращаемое значение:
true
— при успешном возврате на текущий сайт.false
— если переключения не было, и сайт уже является текущим.
restore_current_blog()
проверяет, было ли выполнено переключение на другой сайт, и, если нет, не выполняет никаких действий, что означает, что ее можно безопасно вызывать даже в случаях, когда переключения не было.
Важные аспекты
- Функция очищает глобальную переменную
$GLOBALS['_wp_switched_stack']
, которая отслеживает, был ли выполнен переход на другой сайт. Если эту переменную не очистить, WordPress может ошибочно считать, что он все еще находится в «чужом» сайте. - При нескольких вызовах
switch_to_blog()
каждый раз вызывайтеrestore_current_blog()
для предотвращения накопления переключений.
Пример 1. Возвращение на текущий сайт после переключения
В этом примере мы сначала переключаемся на сайт с ID 5
, выполняем действия (выводим заголовки записей), а затем возвращаемся к текущему сайту.
// Переключаемся на сайт 5
switch_to_blog( 5 );
// Получаем и выводим записи сайта 5
$posts = get_posts();
foreach ( $posts as $post ) {
echo esc_html( $post->post_title ) . '<br>';
}
wp_reset_postdata();
// Возвращаемся на исходный сайт
restore_current_blog();
Пример 2. Циклическое переключение между несколькими сайтами с возвратом
Когда требуется обработать несколько сайтов в цикле, используйте restore_current_blog()
после обработки каждого сайта, чтобы возвращаться к исходному состоянию перед следующим переключением.
$site_ids = [2, 3, 4]; // Список ID сайтов для обработки
foreach ( $site_ids as $site_id ) {
switch_to_blog( $site_id );
// Выполняем действия для каждого сайта
$site_name = get_option('blogname');
echo 'Сайт: ' . esc_html($site_name) . '<br>';
// Возвращаемся к исходному сайту
restore_current_blog();
}
Пример 3. Защита от возможных ошибок при использовании вложенных переключений
Если переключения между сайтами происходят внутри вложенных функций или циклов, важно помнить, что каждый switch_to_blog()
должен быть закрыт соответствующим restore_current_blog()
. Ниже показано, как это сделать корректно.
// Начинаем с исходного сайта
switch_to_blog( 5 );
// Выполняем операции на сайте 5
echo 'Текущий сайт: ' . get_option( 'blogname' ) . '<br>';
// Переходим на вложенный сайт 8
switch_to_blog( 8 );
echo 'Вложенный сайт: ' . get_option( 'blogname' ) . '<br>';
// Возвращаемся к сайту 5
restore_current_blog();
// Завершаем и возвращаемся к исходному сайту
restore_current_blog();
Важные заметки
- Если забыть вызвать
restore_current_blog()
, глобальная переменная$GLOBALS['_wp_switched_stack']
не будет очищена. Это может вызвать некорректное поведение, например, сбой в формировании URL черезwp_upload_dir()
. restore_current_blog()
не сбросит все переключения, если их было несколько. Каждый вызовswitch_to_blog()
требует соответствующегоrestore_current_blog()
.
Заключение
Функция restore_current_blog()
обязательна для вызова после каждого использования switch_to_blog()
, чтобы гарантировать корректную работу WordPress в мультисайтовой сети и избежать неожиданных сбоев в работе системы.