WordPress Multisite - catégories globales

20

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. Nous souhaitons également que toute nouvelle catégorie soit ajoutée au niveau du "blog du réseau" et synchronisée avec les autres blogs.

Quel est le meilleur moyen de le faire?

    
posée anu 16.03.2011 - 13:09

4 réponses

13
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' );

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

  • Si vous avez de nombreux blogs, cette fonction peut devenir très intensive.
  • En moyenne, nous exécutons entre 5 et 8 requêtes (éventuellement davantage) 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 celui-ci est introuvable dans le blog multisite en question, la catégorie sera créée sans parent (ceci ne devrait être le cas que si la catégorie parent a été créée avant cette fonction). installé).
réponse donnée TheDeadMedic 18.03.2011 - 23:47
10

Oh, la procrastination du dimanche ...

enlace

  • Permet d’ajouter des termes en bloc réseau
  • Vous pouvez sélectionner quels sites seront affecté
  • Fonctionne avec les taxonomies personnalisées
  • ne supprime pas
  • ne synchronise pas

C’est quelque chose que j’ai fait ces dernières heures et je n’ai pas le temps de faire plus de tests pour le moment. En tout cas, ça marche pour moi! .)

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

Mettre à jour - > Captures d'écran:

Avant action:

Aprèsletest:

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 l'éditerai 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é!

    
réponse donnée Michal Mau 30.05.2011 - 05:19
4

La réponse de TheDeadMedic a l'air bien, 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 dans votre base de données le nom exact des tables, 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 de faire appliquer cela à partir du site parent.
  • Cela s'applique à toutes 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 plug-in, qui peut être activé à l'échelle du site si vous en avez besoin: Taxonomies centrales de MU

    
réponse donnée Marcus Downing 06.05.2011 - 12:44
1

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 sont plus à jour: < a href="http://wordpress.org/extend/plugins/wpmu-new-blog-defaults/"> enlace et enlace

    
réponse donnée dwenaus 01.06.2011 - 10:07

Lire d'autres questions sur les étiquettes