web-dev-qa-db-ja.com

データベースインタラクション OOP

データベースにデータを保存するワードプレスプラグインを開発しています。私はベストプラクティスから定型に従って私のプラグインのためのOOP方法を始めようとしました: https://github.com/DevinVinson/WordPress-Plugin-Boilerplate/tree/master/plugin-name

理解できないことは、プラグインのインストールイベントでテーブル作成メソッドを一度だけ呼び出す方法と、すべての対話を安全にする方法です。また、cronを使っていくつかのロードタスクをスケジュールしたいと思います。

最初の目標には2つの方法があることを私は考え出しました。

  • すべてのメソッドをpublic staticにして、dbローダークラスがwpdbインスタンスをラップするようにします。しかし、それは十分に安全ではありませんね。

  • プラグインが必要になるたびにdbローダーインスタンスを初期化します。 (プライベートメソッドなどで)

問題は、db loaderクラスのインスタンスを正しく初期化してすべてのテーブルを1回だけ作成し、パブリックな静的メソッドを回避する方法です。

これは定型文のコードです。

    /**
    * Core plugin class
    */
    require_once plugin_dir_path(__FILE__) . 'includes/class_my_plugin.php';


    function run_my_plugin() {
        $plugin = new my_plugin();
        $plugin->run();
    }

    run_my_plugin();

主なプラグインクラスの例です。

class my_plugin {

private
    $wpdb,
    $table_prefix,
    $charset_collate;


public function __construct() {
    global $wpdb;

    $this->wpdb = &$wpdb;
    $this->table_prefix = $this->wpdb->prefix . 'test_private_';
    $charset_collate = $this->wpdb->get_charset_collate();

}

public function run() {

    $table_name = $this->table_prefix . 'desks';


    $sql = "CREATE TABLE IF NOT EXISTS $table_name ( 
    some_id int(11) NOT NULL AUTO_INCREMENT,
    some_title VARCHAR(50) NOT NULL,
    PRIMARY KEY  (desk_id)
    ) $this->charset_collate;";

    dbDelta($sql);

}

}
1
powercat

これは潜在的にかなり複雑な質問です、それで私は私の答えで完全に厳密でないかもしれません、しかしこれはあなたにテーブルを作成して削除するときあなたに良いスタートを与えるべきです..

Class_my_plugin.phpのplugin _construct()関数に次の行を含めます。

if (is_admin()){
    //manage the the database tables when registering or deactivating
    register_activation_hook($loc, array($this, 'your_plugin_installation'));
    register_deactivation_hook($loc, array($this, 'your_plugin_unset'));
    register_uninstall_hook ($loc, 'your_plugin_uninstall');
}

クラス自体の中のclass_my_plugin.phpにこれらの関数を含めてください:

function your_plugin_installation() {
    create_data_tables();
}

function your_plugin_unset() {
    //do whatever here for users that deactivate the plugin
}

メインプラグインクラスの外側にこれらの関数を追加します。

function your_plugin_uninstall() {
    delete_db_tables();
    //add whatever else you need to do to clean up
}

function create_data_tables() {
    global $wpdb;
    require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
    $table_name = $this->table_prefix . 'desks';
    $charset_collate = $wpdb->get_charset_collate();
    if( $wpdb->get_var("SHOW TABLES LIKE '".$table_name."'") != $table_name ) {
       $sql = "CREATE TABLE IF NOT EXISTS ".$table_name;
       $sql .= " (some_id int(11) UNSIGNED NOT NULL AUTO_INCREMENT, ";
       $sql .= "some_title varchar(31) NOT NULL DEFAULT '', ";
       $sql .= "PRIMARY KEY (some_id)) ".$charset_collate;
        dbDelta( $sql );
    }
    // repeat the if {} statement for each table you want to create
}

function delete_db_tables() {
    global $wpdb;
    $table_name = $this->table_prefix . 'desks';
    $wpdb->query( "DROP TABLE IF EXISTS ".$table_name );
    //delete your tables here
}

ユーザーのアンインストール時にyour_plugin_uninstallがメインクラスの内側にあるとエラーが発生するため、通常はメインクラスの外側に配置します。

これは、ユーザーがインストールおよびアンインストールするときにテーブルを作成および削除するのに役立ちます。したがって、これは一度だけ発生し、installまたはuninstallフックが起動されない限り、機能は無視されます。

テーブルは標準のWP機能を使用して簡単にアクセスできます。

function so_get_some_title($id,) {
    global $wpdb;
    $id = (int) $id;
    $query = "SELECT some_id, some_title FROM ".$table_name." WHERE some_id = ".$id;
    $recs = $wpdb->get_results($query,ARRAY_A);
    }
    return $recs;
}

私はあなたの質問を正しく解釈したこと、そしてこれがある意味で役立つことを願っています。

1
Clinton