Quando ligo switch_to_blog()
com um ID de blog, não sei se esse blog realmente existe. A função retorna sempre TRUE
.
Caso de teste:
switch_to_blog( PHP_INT_MAX );
$post = get_post( 1 );
restore_current_blog();
Isso resultará em erros de banco de dados expostos ao usuário. Como posso evitar isso?
Caso de uso no mundo real
Fui o desenvolvedor principal da Multilingual Press . Quando um usuário traduz uma postagem, ela recebe uma tela como esta:
Agora pode acontecer o seguinte:
- Ela salva a postagem com sucesso e continua traduzindo a postagem.
- Outro usuário, um administrador de rede, exclui o blog alemão enquanto ela está escrevendo.
- Ela pressiona salvar novamente e obtém erros no banco de dados.
Eu quero evitar esse cenário. Como posso verificar rapidamente se o blog de destino existe? Eu ligo switch_to_blog()
muito frequentemente em várias classes diferentes, por isso tem que ser rápido.
multisite
database
switch-to-blog
fuxia
fonte
fonte
$wpdb->blogid;
e o ganchowp_insert_post_data
?get_post()
é apenas uma leitura. Pode haver uma longa pausa entre a última gravação e a próxima tela de edição recarregada.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()
, mas isso só ajuda com o cache persistente, não o padrão na página WP. De qualquer forma, para mim não está realmente claro onde você deseja verificar a existência do blog: quando alguém exclui um blog ou quando alguém tenta escrever a postagem traduzida que aponta para um blog diferente (ativando o mesmo conteúdo em outro idioma)?Respostas:
A idéia da @ GM de armazenar em cache a verificação me levou à seguinte função auxiliar. Coloquei-o no espaço de nomes global para disponibilizá-lo em qualquer lugar.
A função não diz nada sobre o status do blog, apenas se ele existir e não estiver marcado como excluído. A consulta ao banco de dados é muito rápida (0,0001 segundos) e executa apenas uma consulta por ID do site, independentemente da frequência com que a função é chamada.
Uso
fonte
$wpdb->get_results
+ emwp_list_pluck
vez de apenas(int) $wpdb->get_var
? no entanto +1, e eu acho que algo semelhante deve estar em switch_to_blog núcleo ...get_var()
retorna apenas um resultado. Eu useiget_col()
agora e certifiquei-me de que um resultado vazio não seja buscado novamente.