switch_to_blog()
블로그 ID로 전화 를 걸면 해당 블로그가 실제로 존재하는지 여부를 알 수 없습니다. 이 함수는 항상을 반환합니다 TRUE
.
테스트 사례 :
switch_to_blog( PHP_INT_MAX );
$post = get_post( 1 );
restore_current_blog();
이로 인해 데이터베이스 오류가 발생하여 사용자에게 노출됩니다. 어떻게 방지 할 수 있습니까?
실제 사용 사례
저는 Multilingual Press 의 수석 개발자였습니다 . 사용자가 게시물을 번역하면 다음과 같은 화면이 나타납니다.
이제 다음이 발생할 수 있습니다.
- 그녀는 게시물을 성공적으로 저장하고 게시물을 계속 번역합니다.
- 네트워크 관리자 인 다른 사용자는 글을 쓰는 동안 독일어 블로그를 삭제합니다.
- 저장을 다시 누르면 데이터베이스 오류가 발생합니다.
그 시나리오를 피하고 싶습니다. 대상 블로그가 있는지 빠르게 확인하려면 어떻게 합니까? 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." );