É obrigatório usar o prefixo $ wpdb-> em tabelas personalizadas

16

Desculpe se esta pergunta é trivial. Estou apenas começando a desenvolver plugins no WordPress.

Em todos os tutoriais, encontrei o seguinte: ao criar as tabelas personalizadas, $wpdb->prefixé usado.

Exemplo:

$table_name = $wpdb->prefix . "liveshoutbox";

Minha pergunta:

É obrigatório usar $wpdb->prefix? O que acontece Se eu não usar o prefixo para minhas tabelas personalizadas?

novato
fonte

Respostas:

22

É obrigatório, embora não seja imposto.

Considere o cenário em que dois sites do Wordpress foram configurados no mesmo banco de dados. Um com prefixo wp_e outro com wp2_. Se você instalar o plug-in nos dois sites com o prefixo, as tabelas criadas serão wp_liveshoutboxpara o primeiro site e wp2_liveshoutboxpara o segundo site. Mas se você omitir o prefixo, o site estará usando a mesma tabela nomeada liveshoutboxe a coisa toda será interrompida.

sakibmoon
fonte
12
Em outras palavras , é obrigatório . :)
Primeiro
4

Considere o seguinte:

Seu plugin é usado em uma rede wordpress, que usa prefixos de tabela diferentes para cada site. Seu plugin pode estar sendo executado simultaneamente em 836 sites diferentes, todos no mesmo banco de dados. wp_385677_liveshoutboxé um nome de tabela perfeitamente razoável.

Seu plug-in é instalado por um usuário com algum conceito de segurança e alterou o prefixo da tabela para bloquear bots que tentam injetar select * from wp_usersno sistema. Mesmo se eles encontrarem uma nova vulnerabilidade, ela não funcionará.

Usar atalhos como nomes de tabelas codificados é uma boa maneira de colocar um produto em funcionamento, mas não é uma boa maneira de liberá-lo. em pouco tempo, o plug-in terá uma pilha de comentários "não funciona", no pior caso, você quebrará o site de outra pessoa.

Se eu tiver uma consulta complexa e não quiser lidar com a dificuldade de escrever, 'select foo from ' . $wpdb->prefix . '_mytable left join ' . $wpdb->prefix . '_mytablemeta on ' . $wpdb->prefix . '.ID = ' . $wpdb->prefix . '.meta_id ....você pode usar substitutos. Por exemplo:

$query = 'select foo from %table% left join %meta% on %table%.ID = %meta%.meta_id ... ';

$change = array (
    '%table%' => $wpdb->prefix . '_mytable',
    '%meta%'  => $wpdb->prefix . '_mytablemeta'
    );


$sql = str_replace( array_keys( $change ), array_values( $change ), $query );

$results = $wpdb->get_results( $sql );

Wordpress está mudando constantemente. O que "funciona" hoje pode não funcionar amanhã. É por isso que existem funções de API. Os desenvolvedores do Wordpress garantirão que o comportamento da API pública seja consistente (ou depreciarão a função). Se você começar a usar chamadas de método internas porque é "mais rápido assim", ele geralmente voltará a morder você. Existem muito poucos atalhos verdadeiros no software - eles apenas transferem o trabalho necessário de agora para mais tarde e, como o cartão de crédito "mais tarde", geralmente custa mais.

Paulo
fonte
Como isso menciona multisite, um elemento adicional a ser observado que eu não vi na resposta é que o uso $wpdb->prefix . "users"resultará em uma tabela inválida em uma instalação multisite. Isso ocorre porque ele afixará o prefixo db na tabela. No entanto, o multisite usa apenas uma tabela de usuários, pois todos os usuários são usuários da rede. Portanto, se a consulta envolver as tabelas wp_users ou wp_usermeta, você deverá usar $wpdb->usersou $wpdb->usermetarespectivamente.
butlerblog