switch_to_blog()WP 3.0.0

Переключается на указанный блог в системе мультисайтов.

Переключает все глобальные переменные на указанный блог в системе мультисайтов. Полезен, когда нужно получить записи и прочую информацию из другого блога.

Не переключается следующее:

  • Загруженные опции текущего блога;
  • Плагины текущего блога;
  • Объектный кэш текущего блога.
  • Смотрите также: https://core.trac.wordpress.org/ticket/14941

Чтобы переключиться обратно к текущему блогу, используйте restore_current_blog().

Имейте ввидуrestore_current_blog() отменяет только последнее переключение. Вызывать её нужно столько же раз сколько было вызвано переключение (пусть даже на один и тот же блог). Например:

// сейчас сайт 1, переключаемся на 2
switch_to_blog( 2 );
// и еще раз
switch_to_blog( 2 );
// отменим переключение
restore_current_blog();
// тут мы все равно находимся на блоге 2, нужно еще раз вызывать
restore_current_blog();
// тут мы на блоге 1 на котором были изначально

Если переключатся на блог (сайт сети) на котором мы уже находимся, то функция отрабатывает моментально (полного переключения не происходит), в этом случае отрабатывает только хук switch_blog без каких-либо дополнительных операций:

switch_to_blog( 2 );
// еще одно переключение
switch_to_blog( 2 );

ВАЖНАЯ ЗАМЕТКА: особенность функции из-за которой может редиректить на переключаемый блог.

Функция устанавливает хук перенаправления на переключаемый блог на событие template_redirect.

Так, по достижению этого события (несли переключение не было сброшено) произойдет перенаправление!

В каких случаях перенаправления не будет:

  • Если переключение происходит после события template_redirect, например, где-то в шаблоне, потому что событие уже было (прошло).
  • Если сбросить переключение на блог с помощью restore_current_blog().
  • Если переключиться обратно на текущий блог с помощью той же switch_to_blog().

Эта функция влияет только на данные переключаемого сайта (переменные, база данных). Она не дает доступ к коду, классам, функциям, которые есть только на переключаемом сайте, но нет на текущем (с которого происходит переключение). Также она не переключаем темы или не включает плагины, которые должны работать только на переключаемом сайте.

1 раз — 0.00094 сек (медленно) | 50000 раз — 5.201680 сек (быстро) | PHP 7.4.8, WP 5.7.2
Хуки из функции

Возвращает

true. Всегда возвращает true.

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

switch_to_blog( $new_blog, $deprecated );
$new_blog(число) (обязательный)
ID блога на который нужно переключиться.
По умолчанию: текущий блог
$deprecated
Не используется
По умолчанию: null

Примеры

0

#1 Одиночное переключение

Переключимся на блог 5 выведем его записи и вернемся обратно на текущий блог.

// переключаемся на блог 5
switch_to_blog( 5 );

// Выводим данные блога на который переключились
// Получаем посты с блога 5
$myposts = get_posts();
foreach( $myposts as $post ){
	echo esc_html( $post->post_title ) .'<br>';
}
wp_reset_postdata();

// возвращемся к текущему блогу
restore_current_blog();
0

#2 Множественное переключение

Прежде чем переключиться на другой блог, нужно сначала вернуться на текущий...

foreach( $blog_ids as $blog_id ){
	switch_to_blog( $blog_id );

	// обрабатываем данные блога на который переключились.

	restore_current_blog();
}

Если вызвать restore_current_blog() после нескольких переключений switch_to_blog(), то WordPress может получить данные из-за которых неправильно будут строится УРЛ вашего сайта.

Заметки

  • Смотрите: restore_current_blog()
  • Global. wpdb. $wpdb WordPress database abstraction object.
  • Global. int. $blog_id
  • Global. Массив. $_wp_switched_stack
  • Global. true|false. $switched
  • Global. Строка. $table_prefix
  • Global. WP_Object_Cache. $wp_object_cache

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

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

Код switch_to_blog() WP 6.4.3

function switch_to_blog( $new_blog_id, $deprecated = null ) {
	global $wpdb;

	$prev_blog_id = get_current_blog_id();
	if ( empty( $new_blog_id ) ) {
		$new_blog_id = $prev_blog_id;
	}

	$GLOBALS['_wp_switched_stack'][] = $prev_blog_id;

	/*
	 * If we're switching to the same blog id that we're on,
	 * set the right vars, do the associated actions, but skip
	 * the extra unnecessary work
	 */
	if ( $new_blog_id == $prev_blog_id ) {
		/**
		 * Fires when the blog is switched.
		 *
		 * @since MU (3.0.0)
		 * @since 5.4.0 The `$context` parameter was added.
		 *
		 * @param int    $new_blog_id  New blog ID.
		 * @param int    $prev_blog_id Previous blog ID.
		 * @param string $context      Additional context. Accepts 'switch' when called from switch_to_blog()
		 *                             or 'restore' when called from restore_current_blog().
		 */
		do_action( 'switch_blog', $new_blog_id, $prev_blog_id, 'switch' );

		$GLOBALS['switched'] = true;

		return true;
	}

	$wpdb->set_blog_id( $new_blog_id );
	$GLOBALS['table_prefix'] = $wpdb->get_blog_prefix();
	$GLOBALS['blog_id']      = $new_blog_id;

	if ( function_exists( 'wp_cache_switch_to_blog' ) ) {
		wp_cache_switch_to_blog( $new_blog_id );
	} else {
		global $wp_object_cache;

		if ( is_object( $wp_object_cache ) && isset( $wp_object_cache->global_groups ) ) {
			$global_groups = $wp_object_cache->global_groups;
		} else {
			$global_groups = false;
		}

		wp_cache_init();

		if ( function_exists( 'wp_cache_add_global_groups' ) ) {
			if ( is_array( $global_groups ) ) {
				wp_cache_add_global_groups( $global_groups );
			} else {
				wp_cache_add_global_groups(
					array(
						'blog-details',
						'blog-id-cache',
						'blog-lookup',
						'blog_meta',
						'global-posts',
						'networks',
						'network-queries',
						'sites',
						'site-details',
						'site-options',
						'site-queries',
						'site-transient',
						'rss',
						'users',
						'user-queries',
						'user_meta',
						'useremail',
						'userlogins',
						'userslugs',
					)
				);
			}

			wp_cache_add_non_persistent_groups( array( 'counts', 'plugins', 'theme_json' ) );
		}
	}

	/** This filter is documented in wp-includes/ms-blogs.php */
	do_action( 'switch_blog', $new_blog_id, $prev_blog_id, 'switch' );

	$GLOBALS['switched'] = true;

	return true;
}