Frage

Mir ist klar, dass es einige Fragen gab, die um die Lösung tanzen, die ich suchte, aber ich glaube, ich suche nach etwas Spezifisch.

Dies ist eigentlich eine zweiteilige Frage:

1) Mein Ziel ist es, WordPress im Netzwerkmodus (Multi-Site) zu betreiben, und ich versuche, einen Weg zur gemeinsamen "Gruppen" -Specise zusammenzuführen. Ich bin mir des "Multi-Network" -Plugins bewusst, aber ich frage mich, ob dies der beste Ansatz dafür ist. Der Schlüssel hier ist, dass bestimmte Benutzer die Websites innerhalb ihrer eigenen Unternetze hinzufügen/bearbeiten können.

2) Dies ist die Schlüsselfrage dieses Beitrags ... Ich würde gerne den besten Ansatz wissen, der es mir ermöglichen würde, im Wesentlichen Beiträge innerhalb dieses "Unterwerks" von Websites abzufragen. Wenn es beispielsweise 10 Websites in diesem Unter-Netzwerk gibt und jeder von ihnen Beiträge in einem benutzerdefinierten Beitragstyp mit dem Namen "News" erstellt hat, möchte ich die Möglichkeit haben, beispielsweise die 10 zuletzt veröffentlichten Beiträge aus dieser Sammlung von 10 anzuzeigen Standorte.

HINWEIS: Ich brauche die Möglichkeit, in der Lage zu sein, Multiply-Unternetzwerke zu erstellen, was wiederum bedeutet, dass eine Abfrage der neuesten veröffentlichten "Nachrichten" nur Beiträge von denen der richtigen Gruppe anzeigen kann.

Schließlich - ich erkenne, dass es Lösungen gibt, die für solche Dinge zu tun haben, aber ich suche nach dem besten Ansatz in beiden Fällen, bei denen die geringste Menge an Datenbanklast/Abfragen erforderlich ist. Ich würde dies auch sehr gerne durch Code in meiner Datei functions.php machen, anstatt Plugins zu installieren, die zusätzliche Aufblähschaften erzeugen.

Ich bin sehr offen für Vorschläge und schätze jede Antwort.

War es hilfreich?

Lösung

Ich weiß, dass Sie gesagt haben, Sie möchten lieber kein Plug-In installieren, aber genau das möchten Sie in dieser Situation tun. Platzieren Sie den Code in das Thema Ihres Themas functions.php Die Datei erfordert, dass Sie dasselbe Thema über alle Websites im Unter-Network verwenden oder mehrere Kopien derselben Datei verwalten. Andererseits können Sie ein einfaches Plug-In für das Netzwerk erstellen, um die Funktionalität zu verkapulieren Aktivieren Sie es im Netzwerk, und haben sofort die Funktionalität mit nur einer Datei zur Wartung zur Verfügung. Dies würde tatsächlich erzeugen weniger aufblähen als je nach deinem functions.php Dateien.

Beachten Sie hier, dass Sie entweder jede Site im Netzwerk durchlaufen müssen, um Ihre Beiträge zu finden oder eine benutzerdefinierte Abfrage auszuführen. Ich würde mich für die zweite Routine entscheiden, weil es, obwohl es etwas komplizierter ist, eher eine einzige Abfrage als eine andere Abfrage für jeden Blog ist.

Grundsätzlich ... Sie müssen Folgendes tun:

  1. Holen Sie sich eine Liste aller Blog-IDs im Netzwerk/im Unterhandwerk. Wenn Sie eine Vanilleinstallation verwenden, finden Sie dies in der wp_blogs Tisch. Mach einfach ein einfaches SELECT Fragen Sie zum Laden eines Arrays ab, und dann können Sie durchlaufen, um jeden Blog zu Ihrer Hauptabfrage hinzuzufügen.
  2. Erstellen Sie eine Schleife, die jeden Blog zu einer großen Abfrage hinzufügt. Du musst sein JOINTische zusammen und suche basierend auf blog_id (aus wp_blogs), post_id (aus wp_BLOG_posts) und die kundenspezifische Taxonomie.

Wie ich bereits sagte, ist es keine einfache Lösung (die SQL -Aussage wird sein sehr kompliziert und ich habe im Moment keine Zeit, es durchzuhacken), aber es wird eine einzige Aussage sein, die die ganze Arbeit erledigt.

Alternative ...

  1. Holen Sie sich eine Liste der Blog -IDs und speichern Sie sie in einem Array.
  2. Iteren Sie durch Ihr Array, in dem Sie jedes Blog im Netzwerk abfragen und Ihre Übereinstimmungen (Beiträge mit einer bestimmten Taxonomie) an ein separates Array anhängen.

Mit der alternativen Methode müssen Sie eine separate Abfrage für jeden Blog im Netzwerk ausführen. Wenn Ihr Netzwerk 10-20 Websites ist, ist dies kein allzu großes Problem. Wenn Ihr Netzwerk 200-500 Websites beträgt, erwarten Sie, dass einige Leistungsprobleme auftreten.

Außerdem sollten Sie die Ergebnisse Ihrer Abfrage durchschnittlich zwischenspeichern. Wenn es auf mehreren Seitenladungen ausgeführt wird (dh für ein im Netzwerk gemeinsam genutzter Seitenleisten -Widget), möchten Sie die Abfrage nur ausführen, wenn neue Daten erhalten werden. Andernfalls servieren Sie die zwischengespeicherten Ergebnisse, damit Sie das Netzwerk nicht verlangsamen.

Andere Tipps

Ich hatte ein ähnliches Problem. Ich musste eine Liste von Beiträgen in allen Netzwerkseiten erhalten, die nach Kommentaren sortiert sind (um die beliebtesten Beiträge anzuzeigen). Dies ist die Funktion, die ich verwendet habe.

Die Grundlage ist, dass es zuerst eine Liste aller Blog -IDs in Ihrem Netzwerk erhält. Anschließend erstellt es eine große einzelne Abfrage (mithilfe von Union, um alle Zeilen zu kombinieren und keine hässlichen Verbindungen zu erfordern), die ein Ergebnis mit den Spalten blog_id, id und comment_count erhält. Mit diesem verwende ich dann get_blog_post (), um alle Beiträge detaillierte Informationen zu erhalten.

Es gibt einige Debug -Linien, die Sie an verschiedenen Stellen verwenden können, um zu sehen, was passiert.

function txx_top_posts_mu( $howMany = 10 ) {
global $wpdb;
global $table_prefix;

// get an array of the table names that our posts will be in
// we do this by first getting all of our blog ids and then forming the name of the 
// table and putting it into an array
$rows = $wpdb->get_results( "SELECT blog_id from $wpdb->blogs WHERE
    public = '1' AND archived = '0' AND mature = '0' AND spam = '0' AND deleted = '0';" );
if ( $rows ) :
    $blogPostTableNames = array();
    foreach ( $rows as $row ) :
        $blogPostTableNames[$row->blog_id] = $wpdb->get_blog_prefix( $row->blog_id ) . 'posts';
    endforeach;
    //print_r($blogPostTableNames);

    // now we need to do a query to get all the posts from all our blogs
    // ordered by the number of comments and with limits applied
    if ( count( $blogPostTableNames ) > 0 ) :
        $query = '';
        $i = 0;
        foreach ( $blogPostTableNames as $blogId => $tableName ) :
            if ( $i > 0 ) :
                $query.= ' UNION ';
            endif;
            $query.= " SELECT ID, comment_count, $blogId as `blog_id` FROM $tableName ";
            $i++;
        endforeach;
        $query.= " ORDER BY comment_count DESC LIMIT 0,$howMany;";
        //echo $query;
        $rows = $wpdb->get_results( $query );

        // now we need to get each of our posts into an array and return them
        if ( $rows ) :
            $posts = array();
            foreach ( $rows as $row ) :
                $posts[] = get_blog_post( $row->blog_id, $row->ID );
            endforeach;
            //print_r($posts);
            return $posts;
        endif;
    endif;
endif;
return false;

}

Sie benötigen definitiv ein Multisite -Netzwerk -Plugins. Derzeit stehen drei zur Auswahl: zwei bezahlte, eine kostenlos.

Von dort aus können Sie so etwas wie das SiteWide Tags -Plugin verwenden, um den Beitrag zum Hauptblog in jedem Netzwerk zu ziehen.

Keiner von beiden könnte aus der Funktionsdatei eines Themas aus (oder sein sollte).

Erstellen Sie eine benutzerdefinierte Google -Suchmaschine Google.com/cse Geben Sie alle Websites an, die Sie suchen möchten

Betten Sie es in Ihre Website ein

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