web-dev-qa-db-ja.com

どうやってswitch_to_blog()を信頼することができますか?

ブログIDを付けてswitch_to_blog()を呼び出すとき、そのブログが実際に存在するかどうかはわかりません。この関数は常にTRUEを返します。

テストケース:

switch_to_blog( PHP_INT_MAX );
$post = get_post( 1 );
restore_current_blog();

これにより、データベースエラーが発生し、ユーザーに公開されます。どうすればそれを防ぐことができますか?

実社会のユースケース

Multilingual Press の主任開発者でした。ユーザーが投稿を翻訳すると、次のような画面が表示されます。

enter image description here

これで、次のことが起こります。

  1. 彼女はその投稿を正常に保存し、その翻訳を翻訳し続けます。
  2. 別のユーザー、ネットワーク管理者は、彼女が書いている間にドイツのブログを削除します。
  3. 彼女は再び保存をヒットし、データベースエラーを受け取ります。

私はそのシナリオを避けたいと思います。ターゲットブログが存在する場合、どうすれば すばやく を確認できますか?私はswitch_to_blog()を複数の異なるクラスで頻繁に呼び出しているので、速くする必要があります。

18
fuxia

チェックをキャッシュするという@ 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." );
9
fuxia