¿Debería global $ wpdb fuera del alcance de cualquiera de las funciones de mi complemento?

2

Sé que el consejo general para las variables globales es no usarlas en absoluto. Aun así, cuando se hace algo con la base de datos de Wordpress, se requiere hacer global $wpdb; para acceder a los métodos que Wordpress proporciona para interactuar con la base de datos.

Ahora he escrito un pequeño complemento que presenta varias funciones que necesitan interactuar con la base de datos de Wordpress. Eso significa, en cada función que he escrito global $wpdb; . Después de eso, construyo dinámicamente los nombres de tabla necesarios: $wpdb->prefix . 'my_table_name'; .

Este es un código redundante en mi opinión que incluso puede producir mucho más trabajo. Por ejemplo, cambié los nombres de la tabla varias veces durante el desarrollo y tuve que cambiarlo en cada función de mi complemento donde hago $wpdb->prefix . 'my_table_name'; .

Ahora mi pregunta es: ¿es una buena idea simplemente global $wpdb fuera del alcance de cualquier función y luego asignar los nombres de las tablas a las variables globales?
De esa manera, todo sería mucho más flexible con respecto a los nombres de las tablas (¿y tal vez incluso el rendimiento?)

    
pregunta Sven 13.04.2014 - 19:28

2 respuestas

5

Una forma conveniente de usar $wpdb en complementos, con tablas personalizadas y funciones personalizadas es escribir una clase o un par de funciones que obtengan el objeto wp, y configurarlo.

Un ejemplo:

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

Después de eso, en cualquier lugar de tu complemento puedes usar

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

Globalizar vars definidos por WordPress no es lo mismo que crear tus propias variables globales. En el primero, no tiene opción, es el último que puede evitar. Envuelva sus funciones en una clase y defina el nombre de su tabla como miembro var. Esto le permite definirlo en un solo lugar y lo mantiene fuera del alcance global.

    
respondido por el Milo 13.04.2014 - 19:46

Lea otras preguntas en las etiquetas