ブログIDを付けてswitch_to_blog()
を呼び出すとき、そのブログが実際に存在するかどうかはわかりません。この関数は常にTRUE
を返します。
テストケース:
switch_to_blog( PHP_INT_MAX );
$post = get_post( 1 );
restore_current_blog();
これにより、データベースエラーが発生し、ユーザーに公開されます。どうすればそれを防ぐことができますか?
Multilingual Press の主任開発者でした。ユーザーが投稿を翻訳すると、次のような画面が表示されます。
これで、次のことが起こります。
私はそのシナリオを避けたいと思います。ターゲットブログが存在する場合、どうすれば すばやく を確認できますか?私はswitch_to_blog()
を複数の異なるクラスで頻繁に呼び出しているので、速くする必要があります。
チェックをキャッシュするという@ G.M.の考えは、私に次のようなヘルパー関数を導きました。私はそれをどこでも利用できるようにするためにグローバル名前空間に入れました。
この関数は、ブログのステータスが存在し、削除済みとしてマークされていない場合に限り、ブログのステータスについては何も言いません。データベースクエリは非常に速く(0.0001秒)、サイトIDごとに1回だけクエリが実行されます(関数が呼び出される頻度に関係なく)。
if ( ! function_exists( 'blog_exists' ) ) {
/**
* Checks if a blog exists and is not marked as deleted.
*
* @link http://wordpress.stackexchange.com/q/138300/73
* @param int $blog_id
* @param int $site_id
* @return bool
*/
function blog_exists( $blog_id, $site_id = 0 ) {
global $wpdb;
static $cache = array ();
$site_id = (int) $site_id;
if ( 0 === $site_id )
$site_id = get_current_site()->id;
if ( empty ( $cache ) or empty ( $cache[ $site_id ] ) ) {
if ( wp_is_large_network() ) // we do not test large sites.
return TRUE;
$query = "SELECT `blog_id` FROM $wpdb->blogs
WHERE site_id = $site_id AND deleted = 0";
$result = $wpdb->get_col( $query );
// Make sure the array is always filled with something.
if ( empty ( $result ) )
$cache[ $site_id ] = array ( 'do not check again' );
else
$cache[ $site_id ] = $result;
}
return in_array( $blog_id, $cache[ $site_id ] );
}
}
使用法
if ( ! blog_exists( $blog_id ) )
return new WP_Error( '410', "The blog with the id $blog_id has vanished." );