WordPress Multisite - globale Kategorien

21

Einrichten einer WP-Instanz mit mehreren Standorten - Der Client verfügt über eine vorhandene Ontologie / Gruppe von Kategorien, die den gesamten Inhalt der Gruppe von Blogs klassifizieren sollen. Außerdem besteht der Wunsch, dass neue Kategorien auf der Ebene "Netzwerkblog" hinzugefügt und mit den anderen Blogs synchronisiert werden.

Wie geht das am besten?

anu
quelle
Ich nehme an, dass Kategorien einer globalen Variablen zugewiesen und dann bei Theme Init importiert werden.
Kaiser
4
Ich denke, diese Frage ist die gleiche wie eine Taxonomie für mehrere Blogs in 3.0 . Diese Frage erhielt jedoch keine gute Antwort. Es ist eine interessante Frage, ich werde ein Kopfgeld dafür anbieten.
Jan Fabry

Antworten:

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

Dies wird ausgeführt, wenn eine Kategorie auf der Hauptwebsite hinzugefügt wird . Einige erwähnenswerte Vorbehalte / Punkte;

  • Wenn Sie viele Blogs haben, kann diese Funktion ziemlich intensiv werden.
  • Im Durchschnitt werden zwischen 5 und 8 Abfragen (möglicherweise mehr) pro Blog ausgeführt Abhängig von der Geschwindigkeit Ihrer Datenbank muss diese Funktion möglicherweise aufgeteilt werden.
  • Nur neu hinzugefügte Kategorien werden synchronisiert. Kategorien werden nicht aktualisiert und gelöscht (Code muss überarbeitet werden).
  • Wenn eine neu hinzugefügte Kategorie ein übergeordnetes Element hat und das übergeordnete Element nicht in dem betreffenden Blog mit mehreren Sites gefunden werden kann, wird die Kategorie ohne übergeordnetes Element erstellt (dies sollte nur der Fall sein, wenn die übergeordnete Kategorie vor der Installation dieser Funktion erstellt wurde).
TheDeadMedic
quelle
1
Gibt es - oder könnte es sein - ein Plugin, das dies tut? Zusammen mit Änderungen und Löschungen? Und eine Einstellungsseite, auf der Sie auswählen können, auf welche Taxonomien und auf welche untergeordneten Websites sie angewendet werden sollen?
Marcus Downing
Würden Sie Einwände erheben, wenn ich Ihren Code als Ausgangspunkt für das Schreiben eines Plugins verwenden würde?
Marcus Downing
Kein Problem - meine Antworten fallen unter die Lizenz von Stack Exchange, das
CC
11

Oh, Sonntag Verschleppung ...

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

  • Ermöglicht das Hinzufügen von Begriffen im gesamten Netzwerk
  • Sie können auswählen, welche Websites betroffen sein sollen
  • Funktioniert mit benutzerdefinierten Taxonomien
  • Löscht nicht
  • Synchronisiert nicht

Dies ist etwas, was ich in den letzten Stunden getan habe und ich habe jetzt keine Zeit für weitere Tests. Wie auch immer - es funktioniert bei mir! .)

Versuche es. Es gibt auch eine 'Testlauf'-Funktion, mit der Sie das Ergebnis überprüfen können, bevor Sie etwas unternehmen.

Update -> Screenshots:

Vor der Aktion:

Vor der Aktion

Nach dem Testlauf:

Nach dem Testlauf

Das oben verlinkte Plugin fügt eine Benutzeroberfläche hinzu, aber in dieser Funktion passiert so ziemlich alles, was wichtig ist:

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

Ich werde wiederkommen und dies später mit weiteren Informationen bearbeiten (falls erforderlich).

Es ist alles andere als perfekt (siehe bekannte Probleme im Plugin-Kopf).
Feedback erwünscht!

Michal Mau
quelle
3
Ich mag es, wenn Leute Plugins als Antwort auf Fragen erstellen! Du verdienst das Kopfgeld!
Jan Fabry
Vielen Dank für Ihre Unterstützung @ Jan Fabry. Ich freue mich, wenn jemand neben mir dieses Ding wirklich nützlich findet.
Michal Mau
5

Die Antwort von TheDeadMedic sieht gut aus, aber am Ende bin ich anders mit dem Problem umgegangen. Anstatt die gleichen Begriffe auf den vielen Sites zu duplizieren, habe ich die anderen Sites dazu gebracht, die Tabellen der Home-Site für Begriffe zu verwenden.

add_action('init', 'central_taxonomies');

function central_taxonomies () {
  global $wpdb;

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

Dadurch wird der Tabellenname wp_2_termsdurch wp_termsusw. ersetzt. Sie sollten natürlich in Ihrer Datenbank nachsehen, ob der genaue Name der Tabellen korrekt ist. Dieser Name kann bei einer Änderung des Präfix abweichen.

Sie können dies entweder über ein Plugin oder ein Theme ausführen (obwohl ich ein Plugin empfehle). Ich werde vielleicht irgendwann ein Plugin veröffentlichen, um dies zu tun. Dieser Ansatz hat zwei Nachteile:

  • Es ist nur auf untergeordneten Sites aktiv, auf denen das Plugin aktiviert ist. Es gibt keine Möglichkeit, dies von der übergeordneten Site aus zu erzwingen.
  • Es gilt für alle Taxonomien, nicht nur für ausgewählte.

Dieser Ansatz ist flexibel - er kann so angepasst werden, dass Kategorien nicht nur aus dem zentralen Blog abgerufen werden.


Update: Ich habe daraus ein Plugin gemacht, das bei Bedarf für die gesamte Site aktiviert werden kann: MU Central Taxonomies

Marcus Downing
quelle
Bei diesem Ansatz gibt es ein großes Problem: Die Beziehungen zwischen Beiträgen und Begriffen sind möglicherweise nicht korrekt. Die Tabelle term_relationships enthält diese Relation basierend auf der Post-ID und der Term-ID. Es besteht jedoch immer die Möglichkeit, dass Posts in Unterwebsites dieselbe ID haben. Das Ändern der Begriffe für einen Beitrag kann sich unvorhersehbar auf einen anderen Beitrag in einem anderen Blog auswirken.
Anh Tran
Richtig, die term_relationshipsTabelle sollte nicht enthalten sein. Das habe ich schon vor langer Zeit im Plugin entdeckt und behoben, aber diese Antwort wurde nie aktualisiert.
Marcus Downing