WordPress как на ладони
wordpress jino

switch_to_blog() WP MU

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

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

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

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

  • Загруженные опции текущего блога;
  • Плагины тек. блога;
  • Объектный кэш тек. блога.

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

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

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

✈ 1 раз = 0.001188с = очень медленно | 50000 раз = 3.68с = быстро
Хуки из функции:
Возвращает

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

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

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

Примеры

#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();

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

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

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

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

	restore_current_blog();
}

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

Код switch to blog: wp-includes/ms-blogs.php WP 4.8.2

<?php
function switch_to_blog( $new_blog, $deprecated = null ) {
	global $wpdb, $wp_roles;

	$blog_id = get_current_blog_id();
	if ( empty( $new_blog ) ) {
		$new_blog = $blog_id;
	}

	$GLOBALS['_wp_switched_stack'][] = $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 == $blog_id ) {
		/**
		 * Fires when the blog is switched.
		 *
		 * @since MU
		 *
		 * @param int $new_blog New blog ID.
		 * @param int $new_blog Blog ID.
		 */
		do_action( 'switch_blog', $new_blog, $new_blog );
		$GLOBALS['switched'] = true;
		return true;
	}

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

	if ( function_exists( 'wp_cache_switch_to_blog' ) ) {
		wp_cache_switch_to_blog( $new_blog );
	} 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( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'site-details' ) );
			}
			wp_cache_add_non_persistent_groups( array( 'counts', 'plugins' ) );
		}
	}

	if ( did_action( 'init' ) ) {
		$wp_roles = new WP_Roles();
		$current_user = wp_get_current_user();
		$current_user->for_blog( $new_blog );
	}

	/** This filter is documented in wp-includes/ms-blogs.php */
	do_action( 'switch_blog', $new_blog, $prev_blog_id );
	$GLOBALS['switched'] = true;

	return true;
}

Cвязанные функции

Из раздела: Мультисайт

switch_to_blog Комментариев нет

Здравствуйте, !

Ваш комментарий