web-dev-qa-db-fra.com

WordPress Multisite - catégories globales

Configuration d'une instance multisite WP - le client dispose d'une ontologie/d'un ensemble de catégories existant qu'il souhaite classer tout le contenu sur l'ensemble des blogs. Aussi, le souhait est que toute nouvelle catégorie soit ajoutée au niveau du "blog du réseau" et synchronisée avec les autres blogs.

Quelle est la meilleure façon de faire cela?

20
anu
function __add_global_categories( $term_id )
{
    if ( get_current_blog_id() !== BLOG_ID_CURRENT_SITE || ( !$term = get_term( $term_id, 'category' ) ) )
        return $term_id; // bail

    if ( !$term->parent || ( !$parent = get_term( $term->parent, 'category' ) ) )
        $parent = null;

    global $wpdb;

    $blogs = $wpdb->get_col( "SELECT blog_id FROM {$wpdb->blogs} WHERE site_id = '{$wpdb->siteid}'" );
    foreach ( $blogs as $blog ) {
        $wpdb->set_blog_id( $blog );

        if ( $parent && ( $_parent = get_term_by( 'slug', $parent->slug, 'category' ) ) )
            $_parent_ID = $_parent->term_id;
        else
            $_parent_ID = 0;

        wp_insert_term( $term->name, 'category',  array(
            'slug' => $term->slug,
            'parent' => $_parent_ID,
            'description' => $term->description
        ));
    }

    $wpdb->set_blog_id( BLOG_ID_CURRENT_SITE );
}
add_action( 'created_category', '__add_global_categories' );

Cela fonctionnera chaque fois qu'une catégorie est ajoutée sur le site principal. Quelques mises en garde/points à noter;

  • Si vous avez beaucoup de blogs, cette fonction peut devenir assez intensive.
  • En moyenne, nous exécutons entre 5 et 8 requêtes (éventuellement plus) par blog - en fonction de la vitesse de votre base de données, il peut être nécessaire de diviser cette fonction.
  • Seules les catégories nouvellement ajoutées sont "synchronisées". La mise à jour et la suppression de catégories ne le sont pas (le code devra être révisé).
  • Si une catégorie nouvellement ajoutée a un parent et que le parent ne peut pas être trouvé dans le blog multisite en question, la catégorie sera créée sans parent (cela ne devrait être le cas si la catégorie parent a été créée avant l'installation de cette fonction).
13
TheDeadMedic

_ {Oh, la procrastination du dimanche ...

https://github.com/maugly/Network-Terminator

  • Permet d'ajouter des termes en masse sur le réseau
  • Vous pouvez sélectionner quels sites seront affectés
  • Fonctionne avec des taxonomies personnalisées
  • Ne supprime pas
  • Ne synchronise pas

C’est quelque chose que j’ai fait au cours des dernières heures et je n’ai pas le temps de faire d’autres tests maintenant. En tout cas, ça marche pour moi! .)

Essaie. Une fonctionnalité de test a également été mise en place afin que vous puissiez vérifier le résultat avant de faire quelque chose.

Mise à jour -> Captures d'écran:

Avant l'action:

Before action

Après le test:

After test run

Le plugin lié ci-dessus ajoute une interface utilisateur, mais pratiquement tout ce qui est important se passe dans cette fonction:

        <?php function mau_add_network_terms($terms_to_add, $siteids, $testrun = false) {

        // check if this is multisite install
        if ( !is_multisite() )
            return 'This is not a multisite WordPress installation.';

        // very basic input check
        if ( empty($terms_to_add) || empty($siteids) || !is_array($terms_to_add) || !is_array($siteids) )
            return 'Nah, I eat only arrays!';

        if ($testrun) $log = '<p><em>No need to get excited. This is just a test run.</em></p>';
        else $log = '';

        // loop thru blogs
        foreach ($siteids as $blog_id) :

            switch_to_blog( absint($blog_id) );

            $log .= '<h4>'.get_blog_details(  $blog_id  )->blogname.':</h4>';
            $log .= '<ul id="ntlog">';

            // loop thru taxonomies
            foreach ( $terms_to_add as $taxonomy => $terms ) {

                // check if taxonomy exists
                if ( taxonomy_exists($taxonomy) ) {
                    // get taxonomy name
                    $tax_name = get_taxonomy($taxonomy);
                    $tax_name = $tax_name->labels->name;

                    //loop thru terms   
                    foreach ( $terms as $term ) {

                        // check if term exists
                        if ( term_exists($term, $taxonomy) ) {
                            $log .= "<li class='notice' ><em>$term already exists in the $tax_name taxonomy - not added!</em></li>";

                        } else {

                            // if it doesn't exist insert the $term to $taxonomy
                            $term = strip_tags($term);
                            $taxonomy = strip_tags($taxonomy);
                            if (!$testrun)
                                wp_insert_term( $term, $taxonomy );
                            $log .= "<li><b>$term</b> successfully added to the <b>$tax_name</b> taxonomy</li>"; 
                        }
                    }
                } else {
                    // tell our log that taxonomy doesn't exists
                    $log .= "<li class='notice'><em>The $tax_name taxonomy doesn't exist! Skipping...</em></li>"; 
                }
            }

            $log .= '</ul>';    

            // we're done here
            restore_current_blog();

        endforeach;
        if ($testrun) $log .= '<p><em>No need to get excited. This was just the test run.</em></p>';
        return $log;
    } ?>

Je reviendrai et éditer cela avec plus d'informations plus tard (si nécessaire).

Il est loin d'être parfait (lisez les problèmes connus dans la tête du plugin).
Tout commentaire apprécié!

10
Michal Mau

La réponse de TheDeadMedic semble bonne, mais j'ai fini par adopter une approche différente du problème. Au lieu de dupliquer les mêmes termes sur plusieurs sites, j'ai plutôt demandé aux autres sites d'utiliser les tables du site d'origine pour les termes.

add_action('init', 'central_taxonomies');

function central_taxonomies () {
  global $wpdb;

  $wpdb->terms = "wp_terms";
  $wpdb->term_taxonomy = "wp_term_taxonomy";
}

Ceci remplace le nom de la table wp_2_terms par wp_terms, etc. Vous devez bien sûr vérifier votre base de données pour vous assurer du nom exact des tables, ce qui pourrait être différent si vous modifiez votre préfixe.

Vous pouvez l'exécuter à partir d'un plugin ou d'un thème (bien que je recommande un plugin). Je pourrai peut-être publier un plugin pour le faire à un moment donné. Cette approche présente deux inconvénients:

  • Il n'est actif que sur les sites enfants sur lesquels le plug-in est activé. Il n'y a aucun moyen d'imposer cela à partir du site parent.
  • Cela s'applique à all les taxonomies, pas seulement celles sélectionnées.

Cette approche est flexible - elle peut être adaptée pour extraire des catégories de n'importe quel blog, pas seulement du blog central.


Mise à jour: Je l'ai transformé en un plugin, qui peut être activé à l'échelle du site si vous en avez besoin: Taxonomies centrales de MU

4
Marcus Downing

Oui c'est possible. J'ai construit un plugin comme celui-ci pour WPMU il y a bien longtemps (http://natureofmind.org/30/default-categories-for-new-blogs/ mais qui n'est plus pris en charge). Les deux plugins suivants seraient plus à jour: http://wordpress.org/extend/plugins/wpmu-new-blog-defaults/ et http://premium.wpmudev.org/project/new-blog-template

1
dwenaus