Когда я звоню switch_to_blog()
с идентификатором блога, я не знаю, существует ли этот блог на самом деле. Функция возвращает всегда TRUE
.
Прецедент:
switch_to_blog( PHP_INT_MAX );
$post = get_post( 1 );
restore_current_blog();
Это приведет к ошибкам в базе данных, которые выставляются пользователю. Как я могу предотвратить это?
Реальный пример использования
Я был ведущим разработчиком Multilingual Press . Когда пользователь переводит сообщение, он получает такой экран:
Теперь может произойти следующее:
- Она успешно сохраняет сообщение и продолжает переводить сообщение.
- Другой пользователь, сетевой администратор, удаляет немецкий блог, пока она пишет.
- Она снова нажимает сохранить и получает ошибки базы данных.
Я хочу избежать этого сценария. Как я могу быстро проверить, существует ли целевой блог? Я звоню switch_to_blog()
очень часто в разных классах, поэтому это должно быть быстро.
multisite
database
switch-to-blog
Фуксия
источник
источник
$wpdb->blogid;
и крюкwp_insert_post_data
?get_post()
- это просто чтение. Между последним сохранением и следующей перезагрузкой экрана редактирования может быть долгая пауза.SELECT blog_id FROM {$wpdb->blogs} WHERE site_id = %d AND public = '1' AND archived = '0' AND spam = '0' AND deleted = '0'
wp_cache_switch_to_blog()
, но это помогает только с постоянным кешем, а не по умолчанию на странице WP. В любом случае, для меня не совсем понятно, где вы хотите проверить существование блога: когда кто-то удаляет блог или кто-то пытается написать переведенный пост, указывающий на другой блог (включающий тот же контент на другом языке)?Ответы:
Идея @ GM кешировать чек привела меня к следующей вспомогательной функции. Я поместил его в глобальное пространство имен, чтобы он был доступен везде.
Функция ничего не говорит о статусе блога, только если он существует и не помечен как удаленный. Запрос к базе данных очень быстрый (0,0001 секунды) и выполняет только один запрос на каждый идентификатор сайта, независимо от того, как часто вызывается функция.
использование
источник
$wpdb->get_results
+wp_list_pluck
вместо только(int) $wpdb->get_var
? однако +1, и я думаю, что нечто подобное должно быть в ядре switch_to_blog ...get_var()
возвращает только один результат. Я использовалget_col()
сейчас, и я убедился, что пустой результат снова не получен.