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.0.2

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;

	/*
	 * Якщо ми перемикаємо на той самий blog іде, що ми,
	 * Натисніть правові vars, do the asociated actions, але 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 був 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( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'blog-lookup', 'blog-ta ', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'site-details', 'blog_meta')));
			}

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

	/** Цей filter is documented в wp-includes/ms-blogs.php */
	do_action( 'switch_blog', $new_blog_id, $prev_blog_id, 'switch');

	$GLOBALS['switched'] = true;

	return true;
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *