我应该在插件的任何函数范围之外全局$wpdb吗?

时间:2014-04-13 作者:Sven

我知道对全局变量的一般建议是根本不要使用它们。不过,在使用Wordpress数据库时,需要执行以下操作global $wpdb; 访问Wordpress提供的与数据库交互的方法。

现在,我编写了一个小插件,它引入了几个需要与Wordpress数据库交互的函数。也就是说,在我写的每个函数中global $wpdb;. 之后,我动态构建所需的表名:$wpdb->prefix . \'my_table_name\';.

在我看来,这是大量冗余代码,甚至可以产生更多的工作。例如,我在开发过程中更改了几次表名,在插件的每个功能中都必须更改表名$wpdb->prefix . \'my_table_name\';.

现在我的问题是:这是一个好主意global $wpdb 在任何函数范围之外,然后将表名称分配给全局变量
这样,关于表名的所有内容都会更加灵活(甚至性能?)

2 个回复
最合适的回答,由SO网友:gmazzap 整理而成

方便的使用方法$wpdb 在插件中,使用自定义表和自定义函数可以编写一个类或两个函数来获取wp对象,并对其进行配置。

例如:

/* 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\' );
}
之后,无论你的插件在哪里都可以使用

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

SO网友:Milo

全球化WordPress定义的变量与创建自己的全局变量不同。对于前者,你别无选择,后者是你可以选择避免的。将函数封装在一个类中,并将表名定义为成员变量。这允许您在一个地方定义它,并将其排除在全局范围之外。

结束

相关推荐

Right_Now_Content_TABLE_END函数不工作吗?

我最近注意到我的自定义帖子类型的自定义计数没有显示在仪表板上。Im使用此功能:right_now_content_table_end它以前工作得很好,我不确定它什么时候停止工作,但我想在更新到3.8之后?或者我是否应该在3.8中的新仪表板上使用新功能?提前谢谢。