É uma prática ruim criar uma tabela própria para um plug-in?

11

Se eu quiser salvar as configurações do meu plugin, é bem fácil e direto.

Agora eu gostaria de salvar um pouco mais no banco de dados.

Um nome de arquivo e três outros valores que se aplicam apenas a esse arquivo. E há muitos arquivos com esses valores. É possível salvar o tipo de subarrays usando métodos de banco de dados integrados? Como posso excluir e classificá-los, etc?

Badr Hari
fonte

Respostas:

13

Eu raramente discordo de usuários com conhecimento de outra forma, mas, neste caso, não posso evitar. Na minha opinião, chamar o uso de tabelas de banco de dados não essenciais como prática ruim por si só é simplesmente errado.

A escolha entre escolher as tabelas principais ou adicionar as suas próprias depende de vários fatores.

O tempo de execução de uma consulta depende do tamanho da tabela. Portanto, se você planeja armazenar quantidades significativas de dados, uma tabela separada que atenda apenas a esse tipo de conjunto de dados específico será inevitavelmente a solução mais eficiente.

Se você armazenar uma grande quantidade de mensagens regulares ou CPTs juntamente com esses conjuntos de dados específicos, wp_postsbem como wp_postmetapode crescer rapidamente.

Para mim, essa escolha depende, em última análise, de quão "caros" os dados são. Deveria apoiar um autor, comentários, revisões, trechos ou similares? Se assim for, eu vou com CPTs e / ou funcionalidade principal. Caso contrário, eu irei com tabelas separadas para o uso e a eficiência dos recursos.

Se a noção de Eugene estivesse correta, nenhum dos plugins bem escritos existentes adicionaria suas próprias tabelas, o que felizmente não é o caso.

Johannes Pille
fonte
Não posso aprovar isso. " O que você está mais à vontade " não é absolutamente uma consideração válida. Existem casos de uso válidos para o uso de tabelas separadas, mas para a grande maioria dos plug-ins, a melhor prática determina o uso de tabelas principais do WP DB.
Chip Bennett
2
Fair enuff @ChipBennett - isso não deveria fazer parte do raciocínio ou não é "raciocínio" em primeiro lugar. Editado e removido (ainda não esperando um representante positivo) não é a única motivação de qualquer maneira).
Johannes Pille
11
+1. Eu acho que é uma resposta razoável e bem pensada. :)
Chip Bennett
5

Usar as tabelas principais de banco de dados do WP é uma prática recomendada

  1. O uso de tabelas principais do banco de dados torna seus dados mais portáteis e mais fáceis de fazer backup, uma vez que serão gerenciados pelo exportador / importador principal, bem como pelos inúmeros plugins de backup
  2. O uso de tabelas principais do banco de dados torna seus dados mais fáceis e seguros de manipular , pois você terá acesso mais intuitivo às várias funções principais do WordPress relacionadas à consulta, adição, modificação, exclusão e higienização de dados do banco de dados, principalmente por meio da $wpdbclasse muito poderosa .
  3. O uso de tabelas principais do banco de dados incentiva / facilita as práticas recomendadas para classificação e armazenamento de dados , como armazenar opções de Plug-ins como uma matriz em uma única linha wp_optionse forçar o desenvolvedor de Plug-ins a considerar cuidadosamente o tipo de dados que está sendo criado / armazenado - é um CPT? é uma taxonomia? é pós meta?
  4. É menos provável que seu plug-in deixe para trás cruft ao usar tabelas de banco de dados principais.

O WordPress fornece um meio para Plugins adicionar tabelas ao seu banco de dados

No entanto, para os casos de uso em que uma tabela de banco de dados separada é necessária, use o método que o WordPress fornece para adicionar sua tabela personalizada ao banco de dados do WordPress , especialmente para que você possa tirar proveito da $wpdbclasse poderosa . Observe as informações / advertências que esta entrada do Codex lista:

  • Informações de configuração - opções do usuário inseridas quando o usuário configura seu plug-in pela primeira vez e não tendem a crescer muito além disso (por exemplo, em um plug-in relacionado a tags, as opções do usuário em relação ao formato da nuvem de tags em barra lateral). As informações de configuração geralmente serão armazenadas usando o mecanismo de opções do WordPress.

  • Dados - informações adicionadas à medida que o usuário continua a usar seu plug-in, que geralmente são informações expandidas relacionadas a postagens, categorias, uploads e outros componentes do WordPress (por exemplo, em um plug-in relacionado a estatísticas, as várias visualizações de página, referenciadores e outras estatísticas associadas a cada postagem em seu site). Os dados podem ser armazenados em uma tabela MySQL separada, que precisará ser criada. Antes de saltar com uma tabela totalmente nova, no entanto, considere se o armazenamento dos dados do seu plug-in no Post Meta do WordPress (também conhecido como Campos personalizados) funcionaria. Post Meta é o método preferido; use-o quando possível / prático.

Assim, podemos concluir o seguinte:

  1. Armazenar dados (configuração ou gerados pelo usuário) em tabelas principais do WP é uma prática recomendada
  2. Existem casos de uso válidos para criar tabelas de banco de dados personalizadas; portanto, a criação de tabelas de banco de dados personalizadas não pode ser considerada uma má prática inerente
  3. Ao criar tabelas de banco de dados personalizadas, o WordPress fornece uma implementação de práticas recomendadas
Chip Bennett
fonte
Eu posso aprovar isso. ;-) 1 para mencionar explicitamente $wpdb(não fazer uso dele indo com tabelas non-core estava implícito na minha resposta, seria quero perder essa classe)
Johannes Pille
2
Originalmente, eu assumira que "próprias tabelas de banco de dados" implicavam tabelas fora do banco de dados do WP ; assim que superei o impasse dessa suposição errada, a pergunta (e as respostas / comentários) ficou mais clara. :)
Chip Bennett
1

As tabelas de banco de dados que não são essenciais são obrigatórias se seus dados forem mais complexos que o modelo de postagem do WordPress, serão enormes e terão muitos meta-detalhes que serão pesquisados.

Formato EAV que o WordPress usa para sua meta de publicação não se presta bem à pesquisa com vários critérios.

Se você dividir sua meta em várias entradas, você terá várias entradas por postagem na tabela de meta, e a pesquisa em qualquer postagem através de metas será muito mais lenta.

Se você armazenar todas as metas serializadas em uma matriz e tiver apenas uma entrada na pós-meta, dessa vez você será forçado a fazer apenas pesquisas de texto dentro dessa meta e não poderá usar operadores de comparação diretamente na sua consulta sql.

Não é um grande problema se o seu plug-in não tiver milhares de entradas e meta associada.

Mas um grande problema se o seu plug-in for fazer algo grande.


Sua situação, um nome de arquivo como entrada independente e três entradas de metadados anexadas a essa entrada não parece tão grande. Você pode usar a tabela de postagem do wordpress e a meta tabela para isso.

MAS, se as pessoas procurarem muito essas 3 metas, ESPECIALMENTE em conjunto, recomendo que você configure tabelas separadas.

Com esse formato, apenas uma tabela com apenas uma entrada, que também contém todas as metas, seria aceitável e consultaria rapidamente.

Aliás, se você usar tabelas do WordPress e também usar cache de consultas, o usuário pesquisará seus dados em cache com o tempo e sofrerá menos carga. Mas isso não seria tão prudente quanto fazer tabelas separadas.

unity100
fonte
0

Você pode enviar seus arquivos para a biblioteca de mídia. Cada item da biblioteca de mídia é armazenado na wp_poststabela. Isso significa que cada arquivo pode ter metadados. Você pode salvar quantas informações precisar para cada arquivo da wp_postmetatabela usando a API de metadados .

É uma prática ruim criar uma tabela própria para um plug-in?

Sim, é uma prática ruim criar uma tabela própria, se você puder usar a funcionalidade principal.

Eugene Manuilov
fonte
3
Não, não é uma prática ruim. A menos que você considere consultas mais lentas e código fortemente associado, é uma boa prática.
Onetrickpony
0
class TMM {

    public static $options;

    public static function register() {
        self::$options = get_option(TMM_THEME_PREFIX . 'theme_options');
    }

    public static function get_option($option) {
        return @self::$options[$option];
    }

    public static function update_option($option, $data) {
        self::$options[$option] = $data;
        update_option($prefix . 'theme_options', self::$options);
    }

    //ajax
    public static function change_options() {

        $action_type = $_REQUEST['type'];
        $data = array();
        parse_str($_REQUEST['values'], $data);
        $data = self::db_quotes_shield($data);

        if (!empty($data)) {
            foreach ($data as $option => $newvalue) {
                if (is_array($newvalue)) {
                    self::update_option($option, $newvalue);
                } else {
                    $newvalue = stripcslashes($newvalue);
                    $newvalue = str_replace('\"', '"', $newvalue);
                    $newvalue = str_replace("\'", "'", $newvalue);
                    self::update_option($option, $newvalue);
                }
            }
        }
        _e('Options have been updated.', TMM_THEME_FOLDER_NAME);
        exit;
    }

    public static function db_quotes_shield($data) {
        if (is_array($data)) {
            foreach ($data as $key => $value) {
                if (is_array($value)) {
                    $data[$key] = self::db_quotes_shield($value);
                } else {
                    $value = stripslashes($value);
                    $value = str_replace('\"', '"', $value);
                    $value = str_replace("\'", "'", $value);
                    $data[$key] = $value;
                }
            }
        }

        return $data;
    }

}

  • O nome da classe é original, renomeie-o como desejar.
  • Nas funções php add: add_action ('init', array ('TMM', 'register'), 1);
  • E adicione para ajax: add_action ('wp_ajax_change_options', array ('TMM', 'change_options'));
  • Para obter a opção onde você precisa usar isso (por exemplo): $ logo_img = TMM :: get_option ('logo_img');
  • Use-o para salvar suas opções por métodos nativos do wordpress
realmag777
fonte