Frage

Einrichten einer WP -Multisite -Instanz - Der Client verfügt über eine vorhandene Ontologie / ein Satz von Kategorien, die alle Inhalte über den Satz von Blogs klassifizieren möchten. Der Wunsch ist auch, dass neue Kategorien auf der Ebene "Netzwerkblog" hinzugefügt und mit den anderen Blogs synchronisiert werden.

Was ist der beste Weg, dies zu tun?

War es hilfreich?

Lösung

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, wann immer eine Kategorie ist hinzugefügt auf der Hauptseite. Ein paar Vorbehalte/Punkte erwähnenswert;

  • Wenn Sie haben viel Von Blogs kann diese Funktion ziemlich intensiv werden.
  • Im Durchschnitt laufen wir zwischen 5 und 8 Abfragen (möglicherweise mehr). pro Blog - Abhängig von der Geschwindigkeit Ihrer Datenbank muss diese Funktion möglicherweise unterteilt werden.
  • Nur neu hinzugefügte Kategorien sind "synchronisiert". Aktualisieren und Löschen von Kategorien sind nicht (Code muss überarbeitet werden).
  • Wenn eine neu hinzugefügte Kategorie über einen übergeordneten übergeordnet ist und der übergeordnete übergeordnete nicht im fraglichen Blog mit mehreren Verhältnissen gefunden werden kann, wird die Kategorie ohne übergeordneten erstellt (dies sollte nur der Fall sein, wenn die übergeordnete Kategorie erstellt wurde, bevor diese Funktion installiert wurde).

Andere Tipps

Oh, Sonntagsaufschub ...

https://github.com/maugly/network-terminator

  • Alows to Bulk hinzufügen Begriffe über das Netzwerk hinweg
  • Sie können auswählen, welche Websites betroffen sind
  • Arbeitet mit benutzerdefinierten Taxonomien
  • Löscht nicht
  • Synchronisiert nicht

Das habe ich in den letzten Stunden getan und ich habe jetzt keine Zeit für mehr Tests. Wie auch immer - es funktioniert für mich! .))

Versuche es. Es gibt auch eine "Test -Lauf" -Funktion implementiert, sodass Sie das Ergebnis überprüfen können, bevor Sie tatsächlich etwas tun.

Update -> Screenshots:

Vor der Aktion:

Before action

Nach dem Testlauf:

After test run

Das oben verknüpfte Plugin fügt die Benutzeroberfläche hinzu, aber in dieser Funktion passiert so ziemlich alles Wichtigste:

        <?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 zurückkommen und dies später mit weiteren Informationen bearbeiten (falls erforderlich).

Es ist alles andere als perfekt (lesen Sie bekannte Probleme im Plugin -Kopf).
Jedes Feedback geschätzt!

Die Antwort von Theeadmedic sieht gut aus, aber am Ende habe ich eine andere Annäherung an das Problem gewählt. Anstatt die gleichen Begriffe auf den vielen Websites zu duplizieren, habe ich stattdessen die anderen Websites die Tabellen der Heimstelle für Begriffe nutzen.

add_action('init', 'central_taxonomies');

function central_taxonomies () {
  global $wpdb;

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

Dies ersetzt den Tabellennamen wp_2_terms mit wp_terms, usw. Sie sollten sich natürlich in Ihrer Datenbank einchecken, um sicherzustellen, dass der genaue Name der Tabellen verwendet wird, was möglicherweise anders ist, wenn Sie Ihr Präfix ändern.

Sie können dies entweder aus einem Plugin oder einem Thema ausführen (obwohl ich ein Plugin empfehle). Ich kann dazu führen, dass ich ein Plugin veröffentlichen kann, um dies irgendwann zu tun. Dieser Ansatz gibt zwei Nachteile:

  • Es ist nur auf Kinderseiten aktiv, auf denen das Plugin aktiviert ist. Es gibt keine Möglichkeit, dies von der übergeordneten Website durchzusetzen.
  • Es gilt auf alle Die Taxonomien, nicht nur ausgewählte.

Dieser Ansatz ist flexibel - er kann angepasst werden, um Kategorien aus jedem Blog zu ziehen, nicht nur der zentrale.


Aktualisieren: Ich habe dies zu einem Plugin gemacht, das ortsweit aktiviert werden kann, wenn Sie es benötigen: MU zentrale Taxonomien

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit wordpress.stackexchange
scroll top