Multisito di WordPress - categorie globali


21

Impostazione di un'istanza multisito WP: il client dispone di un'ontologia / set di categorie esistente che desidera classificare tutto il contenuto nel set di blog. Inoltre, il desiderio è che eventuali nuove categorie vengano aggiunte a livello di "blog di rete" e sincronizzate con gli altri blog.

Qual è il modo migliore per farlo?


suppongo di fare le categorie assegnate a una variabile globale e quindi importare su init tema.
Kaiser

4
Penso che questa domanda sia la stessa di Condividi una tassonomia su più blog in 3.0 . Tuttavia, questa domanda non ha ottenuto una buona risposta. È una domanda interessante, offrirò una taglia per questo.
Jan Fabry,

Risposte:


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

Questo verrà eseguito ogni volta che una categoria viene aggiunta sul sito principale. Alcuni avvertimenti / punti degni di nota;

  • Se hai molti blog, questa funzione potrebbe diventare piuttosto intensa.
  • In media, eseguiamo da 5 a 8 query (probabilmente più) per blog , a seconda della velocità del database, potrebbe essere necessario bloccare questa funzione.
  • Solo le nuove categorie aggiunte vengono "sincronizzate". L'aggiornamento e l'eliminazione delle categorie non lo sono (il codice dovrà essere rivisto).
  • Se una categoria appena aggiunta ha un genitore e il genitore non può essere trovato nel blog multisito in questione, la categoria verrà creata senza genitore (ciò dovrebbe avvenire solo se la categoria genitore è stata creata prima dell'installazione di questa funzione).

1
C'è - o potrebbe esserci - un plugin che fa questo? Insieme a modifiche ed eliminazioni? E una pagina delle impostazioni per scegliere a quali tassonomie e su quali siti figlio applicarla?
Marcus Downing,

In effetti, obietteresti se usassi il tuo codice come punto di partenza per scrivere un plugin?
Marcus Downing,

Nessun problema - le mie risposte rientrano nella licenza di scambio di stack, il cc-wiki con attribuzione obbligatoria :)
TheDeadMedic

11

Oh, domenica procrastinazione ...

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

  • Consente di aggiungere in blocco termini attraverso la rete
  • Puoi selezionare quali siti saranno interessati
  • Funziona con tassonomie personalizzate
  • Non cancella
  • Non si sincronizza

Questo è qualcosa che ho fatto nelle ultime ore e non ho tempo per ulteriori test ora. Comunque - funziona per me! .)

Provaci. C'è anche una funzione di "test run" implementata in modo da poter controllare il risultato prima di fare qualcosa.

Aggiornamento -> Schermate:

Prima dell'azione:

Prima dell'azione

Dopo l'esecuzione del test:

Dopo l'esecuzione del test

Il plug-in sopra collegato aggiunge l'interfaccia utente ma praticamente tutto ciò che è importante accade in questa funzione:

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

Tornerò e lo modificherò con ulteriori informazioni in seguito (se necessario).

È tutt'altro che perfetto (leggi i problemi noti nella testa del plugin).
Qualsiasi feedback apprezzato!


3
Mi piace quando le persone creano plugin in risposta alle domande! Ti meriti la generosità!
Jan Fabry,

Grazie per il tuo supporto @ Jan Fabry. Sarò felice se qualcuno accanto a me troverà davvero utile questa cosa.
Michal Mau,


5

La risposta di TheDeadMedic sembra buona, ma alla fine ho adottato un approccio diverso al problema. Invece di duplicare gli stessi termini su molti siti, ho invece fatto utilizzare gli altri siti alle tabelle del sito principale per i termini.

add_action('init', 'central_taxonomies');

function central_taxonomies () {
  global $wpdb;

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

Questo sostituisce il nome della tabella wp_2_termscon wp_terms, ecc. Dovresti ovviamente controllare nel tuo database per accertarti del nome esatto delle tabelle, che potrebbe essere diverso se cambi il prefisso.

Puoi eseguirlo da un plug-in o da un tema (anche se consiglio un plug-in). Potrei iniziare a pubblicare un plugin per farlo ad un certo punto. Ci sono due aspetti negativi di questo approccio:

  • È attivo solo su siti secondari in cui è attivato il plug-in. Non c'è modo di imporlo dal sito padre.
  • Si applica a tutte le tassonomie, non solo a quelle selezionate.

Questo approccio è flessibile: può essere adattato per estrarre le categorie da qualsiasi blog, non solo quello centrale.


Aggiornamento: l' ho trasformato in un plugin, che può essere attivato a livello di sito se ne hai bisogno: MU Central Taxonomies


C'è un grosso problema con questo approccio: le relazioni tra post e termini potrebbero non essere corrette. La tabella term_relationships contiene questa relazione in base all'ID post e all'ID termine. Ma c'è sempre la possibilità che i post nei siti secondari abbiano lo stesso ID. La modifica dei termini per 1 post potrebbe influire in modo imprevedibile su un altro post in un altro blog.
Anh Tran,

Corretto, la term_relationshipstabella non dovrebbe essere inclusa. Ho notato e risolto molto tempo fa nel plug-in, ma non ho mai aggiornato questa risposta in modo che corrispondesse.
Marcus Downing,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.