web-dev-qa-db-fra.com

Table partagée sur le réseau

Je suis en train de créer un plugin qui lira un fichier XML et importera les données dans 4 tables sur un multisite wordpress. les tables sont plutôt grandes, avec beaucoup de colonnes, donc la table post n'est pas adaptée à cette tâche. Chaque "blog" sur le réseau doit pouvoir accéder aux données de cette table.

J'ai essayé de créer les tables en suivant les instructions du codex ici en utilisant la fonction dbDelta: https://codex.wordpress.org/Creating_Tables_with_Plugins

mais sur un multisite, cela crée un ensemble de tables pour chaque "blog" du réseau. Ceci est redondant car les données seraient identiques pour tous les différents ensembles de tables.

J'ai cherché sur Google, mais je ne trouve pas vraiment un moyen de le faire avec WordPress.

Quelqu'un a-t-il des idées sur la meilleure façon d'y parvenir? Lorsque le plug-in est activé sur l'ensemble du réseau, il doit créer un ensemble de tables unique accessible depuis tous les blogs du réseau.

4
Malibur

Utilisez $wpdb->base_prefix . 'table_name' comme nom de table lorsque vous souhaitez créer une table pour l'ensemble du réseau ou lorsque vous souhaitez exécuter des requêtes sur celui-ci.

$wpdb->base_prefix est toujours le préfixe de la table principale du réseau actuel.

4
fuxia

Vous devez créer une table uniquement lors de l'activation, si elle n'est pas créée, existe dans la base de données. Un petit exemple de source devrait vous aider.

La source suivante crée une table, également sur des sites uniques, peut-être que le plugin sera activé en mode unique pour chaque côté du réseau.

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 );
}

Si votre plugin est uniquement destiné à l'activation réseau, ajoutez un commentaire au blog principal du plugin Network: TRUE. WP vérifie ceci et n'autorise l'activation que sur l'ensemble du réseau. Ajoutez également dans la source une vérification de multisite, telle que if (function_exists('is_multisite') && is_multisite()).

Mais maintenant, la partie importante est la valeur du $wpdb global. Pour créer une table dans l'espace de noms globals, pas pour un site spécifique, utilisez $wpdb->base_prefix, NOT $wpdb->prefix.

2
bueltge