Devo usar o $ wpdb global fora do escopo de funções do meu plugin?

2

Eu sei que o conselho geral para variáveis globais é não usá-las. Ainda assim, ao fazer algo com o banco de dados Wordpress, é necessário fazer global $wpdb; para acessar os métodos que o Wordpress fornece para interagir com o banco de dados.

Agora eu escrevi um pequeno plugin que introduz várias funções que precisam interagir com o banco de dados Wordpress. Isso significa que, em todas as funções, escrevi global $wpdb; . Depois disso, eu construo os nomes das tabelas necessárias dinamicamente: $wpdb->prefix . 'my_table_name'; .

Isso é um monte de código redundante, na minha opinião, que até pode produzir muito mais trabalho. Por exemplo, eu mudei os nomes das tabelas algumas vezes durante o desenvolvimento e tive que mudá-lo em todas as funções do meu plugin, onde eu faço $wpdb->prefix . 'my_table_name'; .

Agora, minha pergunta é: É uma boa ideia apenas global $wpdb fora de qualquer escopo de função e, em seguida, atribuir os nomes de tabelas a variáveis globais?
Dessa forma, tudo seria muito mais flexível em relação aos nomes das tabelas (e talvez até ao desempenho?)

    
por Sven 13.04.2014 / 19:28

2 respostas

5

Uma maneira conveniente de usar $wpdb em plug-ins, com tabelas customizadas e funções customizadas, é escrever uma classe ou algumas funções que obtêm o objeto wp e as configuram.

Um exemplo:

/* Return global wpdb aready setup with custom tables */
my_plugin_get_db( wpdb $wpdb = NULL ) {
  static $db;
  if ( is_null($db) || ! is_null( $wpdb ) ) {
    $db = is_null($wpdb) ? $GLOBALS['wpdb'] : $wpdb;
  }
  return $db;
}

/* Setup database saving $wpdb custom table names insie wpdb object */
my_plugin_set_db() {
  global $wpdb;
  /* define here your custom table names */
  $my_tables = array(
    'my_table_1', 'my_table_1', 'my_table_1'
  );
  foreach ( $my_tables as $table ) {
     $wpdb->$table = $wpdb->prefix . $table;
  }
  my_plugin_get_db( $wpdb );
}

add_action( 'plugins_loaded', 'my_plugin_set_db' );

/* Multisite compatibility? */
if ( is_multisite() ) {
    add_action( 'switch_blog', 'my_plugin_set_db' );
}

Depois disso, em qualquer lugar do seu plug-in, você pode usar

$db = my_plugin_get_db();
$query = $db->query( "SELECT * FROM $db->my_table_1" );  
    
por gmazzap 13.04.2014 / 20:03
2

A globalização de variantes definidas pelo WordPress não é o mesmo que criar suas próprias variáveis globais. No primeiro, você não tem escolha, é o último que você pode escolher evitar. Envolva suas funções em uma classe e defina o nome da sua tabela como um membro var. Isso permite defini-lo em um único lugar e o mantém fora do escopo global.

    
por Milo 13.04.2014 / 19:46