web-dev-qa-db-ja.com

$ wpdbを自分のプラグインの関数スコープの外に広げるべきですか?

グローバル変数に対する一般的なアドバイスは、それらをまったく使用しないことです。それでも、Wordpressデータベースで何かをするとき、Wordpressがデータベースと対話するために提供する方法にアクセスするためにglobal $wpdb;をすることが必要です。

今私はWordpressのデータベースと対話する必要があるいくつかの機能を紹介する小さなプラグインを書きました。つまり、すべての関数にglobal $wpdb;と書いています。その後、動的に必要なテーブル名を作成します:$wpdb->prefix . 'my_table_name';

これは私の意見では冗長なコードで、もっと多くの作業を生み出すことさえできます。たとえば、開発中に数回テーブル名を変更し、$wpdb->prefix . 'my_table_name';を実行するプラグインのすべての機能でテーブル名を変更する必要がありました。

今度は私の質問です。関数のスコープの外側にglobal$wpdbを付け、それからテーブル名をグローバル変数に代入するのは良い考えでしょうか。
そうすれば、テーブル名に関してすべてがはるかに柔軟になるでしょう(そしておそらくパフォーマンスさえも)。

2
Sven

カスタムテーブルとカスタム関数を使ってプラグインの中で$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" );  
5
gmazzap

WordPressで定義された変数をグローバル化することは、独自のグローバル変数を作成することと同じではありません。前者では、あなたには選択の余地はありません、それはあなたが避けることを選ぶことができる後者です。関数をクラスにラップして、テーブル名をメンバーvarとして定義します。これにより、それを一箇所で定義し、それをグローバルな範囲外にすることができます。

2
Milo