it-swarm.com.de

WordPress Multisite - globale Kategorien

Einrichten einer WP Instanz mit mehreren Standorten - Der Client verfügt über eine vorhandene Ontologie/Gruppe von Kategorien, mit denen er den gesamten Inhalt in der Gruppe von Blogs klassifizieren möchte. 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?

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

Dies wird ausgeführt, wenn eine Kategorie auf der Hauptseite hinzugefügt ist. 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) ausgeführt. pro Blog - 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).
13
TheDeadMedic

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 keine Zeit mehr 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:

Before action

Nach dem Testlauf:

After test run

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!

10
Michal Mau

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 Homepage 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_terms durch wp_terms usw. ersetzt. Sie sollten natürlich in Ihrer Datenbank nachsehen, ob der genaue Name der Tabellen korrekt ist. Dieser kann bei einer Änderung Ihres Präfixes 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 auf der ganzen Site aktiviert werden kann, wenn es benötigt wird: MU Central Taxonomies

4
Marcus Downing

Ja das ist möglich Ich habe vor langer Zeit ein solches Plugin für WPMU erstellt (http://natureofmind.org/30/default-categories-for-new-blogs/, wird aber nicht mehr unterstützt). Aktueller wären die folgenden zwei Plugins: http://wordpress.org/extend/plugins/wpmu-new-blog-defaults/ und http://premium.wpmudev.org/project/new-blog-template

1
dwenaus