После каждого экземпляра switch_to_blog()
вы должны позвонить, restore_current_blog()
чтобы восстановить текущий (фактически, предыдущий) блог.
Но если вы просматриваете два или более блогов и звоните switch_to_blog()
в каждый из них, есть ли причина не использовать дополнительный switch_to_blog()
в конце цикла для переключения на исходный блог, а не звонить restore_current_blog()
при каждом проходе.
Например
Почему бы нет:
$original_blog_id = get_current_blog_id();
foreach( $blog_ids as $blog_id ){
switch_to_blog( $blog_id );
//Do stuff
}
switch_to_blog( $original_blog_id );
вместо того:
foreach( $blog_ids as $blog_id ){
switch_to_blog( $blog_id );
//Do stuff
restore_current_blog_id();
}
Ответы:
После каждого случая
switch_to_blog()
вам нужно позвонитьrestore_current_blog()
иначе WP будет думать, что он находится в «переключенном» режиме и потенциально может вернуть неверные данные.Если вы посмотрите исходный код обеих функций, вы увидите, что эти функции отправляют / выводят данные в глобальный вызов
$GLOBALS['_wp_switched_stack']
. Если вы не звонитеrestore_current_blog()
после каждогоswitch_to_blog()
,$GLOBALS['_wp_switched_stack']
будет не пустым. Если$GLOBALS['_wp_switched_stack']
поле не пустое, WP думает, что оно находится в режиме переключения, даже если вы вернулись в исходный блог, используяswitch_to_blog()
. Переключаемая функция режима естьms_is_switched()
и влияетwp_upload_dir()
. Еслиwp_upload_dir()
он считает, что находится в режиме переключения, он может вернуть данные, которые являются неправильными.wp_upload_dir()
создает URL-адреса для сайта, поэтому это очень важная функция.Это правильное использование:
источник
wp_upload_dir()
используются для генерации URL-адресов, но я верю, что это действительно приводит к ошибочному поведению. В любом случае, наличиеms_is_switched()
средств в моем альтернативном подходе приводит к тому, что функция работает не так, как ожидалось, и может сломать как плагины, так и ядро. Спасибоrestore_current_blog()
нуждается в обновлении, поскольку там говорится, что для нескольких коммутаторов нужно только сохранить текущий$blog_id
и затем использовать несколькоswitch_to_blog()
вызовов.Если вы хотите работать с несколькими блогами, нет необходимости каждый раз восстанавливать предыдущий блог. Единственное, что растет
$GLOBALS['_wp_switched_stack']
- массив с идентификаторами блогов, не о чем беспокоиться.Но имейте в виду,
restore_current_blog()
больше не будет работать (!!!) После второго переключения, потому что он использует предыдущий блог - который не является первым блогом тогда. Так что храните первый идентификатор блога и звоните ...... вместо того,
restore_current_blog()
когда вы закончите. Глобальные переменные должны быть сброшены, иначе вы столкнетесь с проблемами, упомянутыми @ user42826.Влияние на производительность огромно. Я провел несколько тестов для локальной установки с 12 сайтами:
Результат:
Использование
restore_current_blog()
после каждого переключателя удваивает время, необходимое только для переключения.источник
restore_current_blog()
не просто восстановил предыдущий идентификатор блога и позвонилswitch_to_blog()
- краткий взгляд на источник кода, и кажется, что есть немного дублирования кода ...switch_to_blog()
это очень ограниченный (сломанный) API в любом случае. Если WordPress когда-нибудь исправит это , мы все равно должны будем реорганизовать наш код. И WordPress никогда не откажется от своих любимых глобалов.I don't think modifying the globals directly is a good idea
, не говорите об этом разработчикам ядра wp;)Спасибо @toscho ответу. Этот запрос в очереди WP - смотрите обновления здесь . До тех пор, пока в WP не исправлено, если кто-то отчаянно хочет использовать стандарт
restore_current_blog()
, то вот другой метод (пожалуйста, исправьте, если я ошибаюсь):сделать свою функцию, т.е.
и выполнить только один раз, когда вы закончите несколько переключателей. (подробнее: wp-includes / ms-blogs.php )
источник