Как ускорить функцию switch_to_blog()?

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

В этом уроке я бы хотел поделиться с вами способом ускорения связки switch_to_blog() – restore_current_blog() при работе с ними в цикле.

Например у вас есть массив с сайтами вашей сети мультисайт и вам нужно пройтись через каждый из них в цикле и сделать какое-то определённое действие. Выглядеть это будет вот так:

$site_ids = array( 5, 7, 10, 22, ... );
 
foreach( $site_ids as $site_id ) {
 
	switch_to_blog( $site_id );
 
	// тут мы выполняем некоторые действия для сайта
 
	restore_current_blog();
 
}

Так вот, если вы работаете с подобным циклом и у вас большое количество сайтов внутри массива, то вся эта история может работать не супер-быстро.

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

$site_ids = array( 5, 7, 10, 22, ... );
$first_site_id = get_current_blog_id();
 
foreach( $site_ids as $site_id ) {
 
	switch_to_blog( $site_id );
 
	// тут мы выполняем некоторые действия для сайта
 
}
 
switch_to_blog( $first_site_id );
$GLOBALS[ '_wp_switched_stack' ] = array();
$GLOBALS[ 'switched' ] = false;

Я почитал слегка о том, что люди пишут в интернете о подобном подходе – и некоторые клинятся, что выиграли в производительности до 40%! Ну что же, круто, а вы что думаете об этом?

Миша

Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.

Пишите, если нужна помощь с сайтом или разработка с нуля.

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

Миша Рудрастых и WordPress

Полезности из мира WordPress и жизни студии.

Мой телеграм-канал