web-dev-qa-db-ja.com

ネットワーク上の共有テーブル

Imは現在xmlファイルを読み込み、ワードプレスマルチサイトの4つのテーブルにデータをインポートするプラグインを作成しています。テーブルはかなり大きく、ALOTの列があるため、postテーブルはこのタスクには適していません。ネットワーク上のすべての「ブログ」は、このテーブルのデータにアクセスできる必要があります。

ここではdbDelta関数を使用してコーデックスの指示に従ってテーブルを作成してみました。 https://codex.wordpress.org/Creating_Tables_with_Plugins

しかし、マルチサイトでは、これはネットワーク内の各「ブログ」に対して一連のテーブルを作成します。データはすべての異なるテーブルセットにわたって同一であるため、これは冗長です。

私はあちこち歩き回っていますが、実際にこれを行うWordPressの方法を見つけることができません。

誰がこれをどのように達成するのが一番かというアイディアを持っていますか?プラグインがネットワーク全体で有効化されると、ネットワーク内のすべてのブログからアクセスするための単一のテーブルセットを作成する必要があります。

4
Malibur

ネットワーク全体のテーブルを作成したい場合、またはそれに対してクエリを実行したい場合は、テーブル名として$wpdb->base_prefix . 'table_name'を使用してください。

$wpdb->base_prefixは常に現在のネットワークのメインテーブルのプレフィックスです。

4
fuxia

アクティブ化時にのみテーブルを作成する必要があります。作成されていない場合は、データベースに存在します。小さな情報源の例が役に立ちます。

フォローソースはまた、単一サイトでテーブルを作成し、多分プラグインはネットワークの各サイドのためにシングルモードでアクティブになります。

register_activation_hook( __FILE__, 'on_activate' );
function on_activate() {

    create_table();
}

function create_table() {
    global $wpdb;

    $table_name = $wpdb->prefix . 'your_table_name';

    // Check, if exists
    if ( $wpdb->get_var( "show tables like '{$table_name}'" ) == $table_name ) {
        return NULL;
    }

    $sql = "CREATE TABLE " . $table_name . " (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        col VARCHAR(100) NOT NULL,
        PRIMARY KEY  (id)
    );";

    // // make dbDelta() available
    require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
    dbDelta( $sql );
}

プラグインがネットワークアクティベーション専用の場合は、プラグインのヘッドブログNetwork: TRUEにコメントを追加します。 WPはこれをチェックし、ネットワーク全体でのみアクティベーションを許可します。また、if (function_exists('is_multisite') && is_multisite())のように、Multisiteのチェックをソースに追加してください。

しかし今重要なのは、グローバル$wpdbの価値です。特定のサイトではなく、globals名前空間にテーブルを作成するには、$wpdb->base_prefix、NOT $wpdb->prefixを使用します。

2
bueltge