태그 보관물: switch-to-blog

switch-to-blog

switch_to_blog ()를 어떻게 신뢰할 수 있습니까? 사용자에게 노출됩니다. 어떻게 방지 할

switch_to_blog()블로그 ID로 전화 를 걸면 해당 블로그가 실제로 존재하는지 여부를 알 수 없습니다. 이 함수는 항상을 반환합니다 TRUE.

테스트 사례 :

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

이로 인해 데이터베이스 오류가 발생하여 사용자에게 노출됩니다. 어떻게 방지 할 수 있습니까?

실제 사용 사례

저는 Multilingual Press 의 수석 개발자였습니다 . 사용자가 게시물을 번역하면 다음과 같은 화면이 나타납니다.

여기에 이미지 설명을 입력하십시오

이제 다음이 발생할 수 있습니다.

  1. 그녀는 게시물을 성공적으로 저장하고 게시물을 계속 번역합니다.
  2. 네트워크 관리자 인 다른 사용자는 글을 쓰는 동안 독일어 블로그를 삭제합니다.
  3. 저장을 다시 누르면 데이터베이스 오류가 발생합니다.

그 시나리오를 피하고 싶습니다. 대상 블로그가 있는지 빠르게 확인하려면 어떻게 합니까? switch_to_blog()여러 클래스에서 매우 자주 전화 하므로 속도가 빠릅니다.



답변

검사를 캐시하려는 @GM의 아이디어는 다음 도우미 기능으로 이어졌습니다. 모든 곳에서 사용할 수 있도록 전역 네임 스페이스에 넣었습니다.

이 기능은 블로그 상태가 존재하며 삭제 된 것으로 표시되지 않은 경우 블로그 상태에 대해 아무 것도 말하지 않습니다. 데이터베이스 쿼리는 매우 빠르며 (0.0001 초) 함수 호출 빈도에 관계없이 사이트 ID 당 하나의 쿼리 만 실행합니다.

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." );

답변