É obrigatório usar $ wpdb-prefix em tabelas customizadas

13

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

Em todos os tutoriais, encontrei isto: 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 prefixo para minhas tabelas personalizadas?

    
por newbie 31.05.2015 / 10:49

2 respostas

19

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

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 seu plug-in nos dois sites com o prefixo, suas tabelas criadas serão wp_liveshoutbox para o primeiro site e wp2_liveshoutbox para o segundo site. Mas se você omitir o prefixo, ambos os sites estarão usando a mesma tabela chamada liveshoutbox e a coisa toda será quebrada.

    
por sakibmoon 31.05.2015 / 10:58
4

Considere o seguinte:

Seu plugin é usado em uma rede wordpress, que usa diferentes prefixos de tabela 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 plugin é instalado por um usuário que tenha algum conceito de segurança e alterou o prefixo da tabela para bloquear bots que tentam injetar select * from wp_users no sistema. Mesmo que eles encontrem uma nova vulnerabilidade, isso não funcionará.

Tomando atalhos como nomes de tabelas de codificação é uma boa maneira de colocar um produto em funcionamento, mas não é uma boa maneira de lançá-lo. em pouco tempo o plugin terá uma pilha de comentários "não funciona", no pior caso você irá 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ê poderá 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 );

O Wordpress está em constante mudança. O que "funciona" hoje pode não funcionar amanhã. É por isso que existem funções da API. Os desenvolvedores do Wordpress se certificarão de que o comportamento público da API seja consistente (ou eles irão depreciar a função). Se você começar a usar chamadas de método interno porque é "mais rápido assim", ele geralmente volta para te morder. Há muito poucos atalhos verdadeiros no software - eles apenas movem o trabalho necessário de agora para mais tarde, e como seu cartão de crédito "mais tarde" geralmente custa mais.

    
por paul 31.05.2015 / 15:48