web-dev-qa-db-fra.com

Devrais-je globaliser $ wpdb en dehors de la portée des fonctions de mon plugin?

Je sais que le conseil général aux variables globales est de ne pas les utiliser du tout. Néanmoins, lorsque vous utilisez quelque chose avec la base de données Wordpress, vous devez utiliser global $wpdb; pour accéder aux méthodes fournies par Wordpress pour interagir avec la base de données.

Maintenant, j'ai écrit un petit plugin qui introduit plusieurs fonctions qui doivent interagir avec la base de données Wordpress. Cela signifie que dans chaque fonction, j'ai écrit global $wpdb;. Après cela, je construis les noms de table nécessaires de manière dynamique: $wpdb->prefix . 'my_table_name';.

C’est beaucoup de code redondant à mon avis qui peut même produire beaucoup plus de travail. Par exemple, j'ai changé les noms de table plusieurs fois au cours du développement et je devais le changer dans toutes les fonctions de mon plugin où je fais $wpdb->prefix . 'my_table_name';.

Ma question est la suivante: est-ce une bonne idée de simplement global$wpdb en dehors de toute portée de fonction, puis d'affecter les noms de tables à des variables globales?
Ainsi, tout serait beaucoup plus flexible en ce qui concerne les noms de table (et peut-être même les performances?)

2
Sven

Un moyen pratique d'utiliser $wpdb dans les plugins, avec des tables personnalisées et des fonctions personnalisées, consiste à écrire une classe ou quelques fonctions qui récupèrent l'objet wp et à le configurer.

Un exemple:

/* 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' );
}

Après cela, où que vous soyez dans votre plugin, vous pouvez utiliser

$db = my_plugin_get_db();
$query = $db->query( "SELECT * FROM $db->my_table_1" );  
5
gmazzap

Globaliser les vars définis par WordPress n’est pas la même chose que créer vos propres variables globales. Dans le premier cas, vous n’avez pas le choix, c’est le dernier que vous pouvez choisir d’éviter. Enveloppez vos fonctions dans une classe et définissez le nom de votre table en tant que membre var. Cela vous permet de le définir à un endroit et de le garder en dehors de la portée globale.

2
Milo