Функция 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 в мультисайтовой сети и избежать неожиданных сбоев в работе системы.