サポート » プラグイン » この違いはなんでしょうか・・・

  • function plugin_activate() {
    setup_table(‘send_data’);
    }

    add_action(‘admin_menu’, ‘plugin_activate’);

    function table_name_with_prefix($table_name) {
    global $wpdb;
    return $wpdb->prefix . $table_name;
    }

    function sql_create_send_data() {
    return “CREATE TABLE ” . table_name_with_prefix(‘send_data’) . “(
    send_id INT NOT NULL AUTO_INCREMENT,
    send_begin DATE NOT NULL,
    send_end DATE NOT NULL,
    send_title VARCHAR(255) NOT NULL,
    send_desc TEXT NOT NULL,
    send_added TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (send_id)
    );”;
    }

    function setup_table($table_name) {
    global $wpdb;
    if ($wpdb->get_var(“show tables like'” . table_name_with_prefix($table_name) . “‘”) != table_name_with_prefix($table_name)) {
    require_once(ABSPATH . ‘wp-admin/includes/upgrade.php’);
    $sql_create_func = “sql_create_$table_name”;
    $sql = $sql_create_func();
    dbDelta($sql);
    }
    }
    こちらのソースコードと
    function plugin_activate() {
    setup_table(‘send_data’);
    }
    add_action(‘admin_menu’, ‘plugin_activate’);

    function setup_table($table_name) {
    global $wpdb;
    if ($wpdb->get_var(“show tables like'” . table_name_with_prefix($table_name) . “‘”) != table_name_with_prefix($table_name)) {
    require_once(ABSPATH . ‘wp-admin/includes/upgrade.php’);
    $sql_create_func = “sql_create_$table_name”;
    $sql = $sql_create_func();
    dbDelta($sql);
    }
    }
    function table_name_with_prefix($table_name) {
    global $wpdb;
    return $wpdb->prefix . $table_name;
    }
    function sql_create_send_data() {
    return “CREATE TABLE ” . table_name_with_prefix(‘send_data’) . “(
    send_id INT NOT NULL AUTO_INCREMENT,
    send_begin DATE NOT NULL,
    send_end DATE NOT NULL,
    send_title VARCHAR(255) NOT NULL,
    send_desc TEXT NOT NULL,
    send_added TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (send_id)
    );”;
    }
    の2つですがプラグインを有効化すると同じようにテーブルが作成されますが違いは何でしょうか?dbDelta関数が一体どういった操作をしているかもいまいち把握できていなのでこの点をしっかり抑えたいと思い質問させていただきます。どなたか良いお答えをよろしくお願い致します。

1件の返信を表示中 - 1 - 1件目 (全1件中)
  • 「良いお答え」かどうかはわかりませんが… プラグインを書いていらっしゃるのでしょうか。もしそうなら、Codex と呼ばれるドキュメントが役立ちます。チュートリアルや HOWTO であると同時に、API リファレンス、関数リファレンスでもあって、WordPress で何かしようというときには必ず役立つ文書です。

    お示しになったコードですが、同じ内容なので、違いはなくて、同じテーブルができるのは正常な動作だと思います(テーブル作成関数はプラグインの有効化にフックした方がいいと思いますが)。

    dbDelta() 関数は、CREATE クエリを渡すと、データベースを調べて、次のようにふるまいます。

    1. 同名のテーブルが存在しないなら、定義に従って新たに作る
    2. 同名のテーブルが存在し、フィールドの定義が同じなら、何もしない
    3. 同名のテーブルが存在し、フィールドの定義が異なれば、ALTER TABLE クエリを発行してスキーマを変更する

    バージョンが変わるたびに自ら ALTER TABLE クエリを発行して、フィールド定義を変更するプラグインも多く存在しますが、WordPress 的には、dbDelta() を使うのが由緒正しい使い方、ということになるようです。Codex では、’sticky’ (「融通がきかない」) と形容されているとおり、ちゃんと書法を守らないと動作してくれない関数ではありますが、正しい使い方をすればちゃんと動いてくれます。

    蛇足ですが、dbDelta() 関数の仕様からすると、

    if ($wpdb->get_var("show tables like '" . table_name_with_prefix($table_name) . "'") != table_name_with_prefix($table_name))

    のチェックは、dbDelta() がやってくれるので、必要ありません。むしろ、このままだと、同じ名前のテーブルが存在すると、dbDelta($sql) が実行されず、フィールドの定義を変更したいと思っても、意図したとおりの結果にならないのではないでしょうか。この if 文と同じような例が日本語版 Codex Creating Tables with Plugins に掲載されていますが、翻訳元の英語版には存在しません。翻訳途中なのかもしれませんね。

1件の返信を表示中 - 1 - 1件目 (全1件中)
  • トピック「この違いはなんでしょうか・・・」には新たに返信することはできません。