Beiträge von mehreren Sites in einem Netzwerk abfragen?


8

Mir ist klar, dass es einige Fragen gab, die sich um die Lösung drehen, nach der ich suche, aber ich glaube, ich suche nach etwas Bestimmtem.

Dies ist eigentlich eine zweiteilige Frage:

1) Mein Ziel ist es, WordPress im Netzwerkmodus (mit mehreren Standorten) zu betreiben, und ich versuche, einen Weg zu finden, um bestimmte Standorte im Wesentlichen zu "gruppieren". Ich kenne das Plugin "Multi-Network", frage mich aber, ob dies der beste Ansatz dafür ist. Der Schlüssel hier besteht darin, bestimmten Benutzern das Hinzufügen / Bearbeiten der Websites in ihrem eigenen Subnetzwerk zu ermöglichen.

2) Dies ist die Schlüsselfrage dieses Beitrags ... Ich würde gerne wissen, wie ich am besten Beiträge innerhalb dieses "Teilnetzwerks" von Websites abfragen kann. Wenn sich beispielsweise 10 Websites in diesem Subnetzwerk befinden und jede von ihnen Beiträge in einem benutzerdefinierten Beitragstyp namens "Nachrichten" erstellt hat, möchte ich beispielsweise die 10 zuletzt veröffentlichten Beiträge aus dieser Sammlung von 10 anzeigen Websites.

HINWEIS: Ich muss in der Lage sein, mehrere Subnetzwerke zu erstellen, was wiederum bedeutet, dass bei einer Abfrage der zuletzt veröffentlichten "Nachrichten" nur Beiträge von Personen angezeigt werden können, die zur richtigen Gruppe gehören.

Schließlich - mir ist klar, dass es Lösungen für solche Dinge gibt, aber ich suche nach dem besten Ansatz für beide Fälle, die die MINDESTEN Mengen an Datenbanklast / -abfragen erfordern. Ich würde dies auch sehr gerne über Code in meiner Datei functions.php tun, anstatt Plugins zu installieren, die zusätzliches Aufblähen verursachen.

Ich bin sehr offen für Vorschläge und freue mich über jede Antwort.

Antworten:


7

Ich weiß, dass Sie gesagt haben, Sie möchten lieber kein Plug-In installieren, aber genau das möchten Sie in dieser Situation tun. Wenn Sie den Code in die functions.phpDatei Ihres Themas einfügen möchten, müssen Sie entweder auf allen Sites im Subnetzwerk dasselbe Design verwenden oder mehrere Kopien derselben Datei verwalten. Auf der anderen Seite können Sie ein einfaches Plug-In für das Netzwerk erstellen, um die Funktionalität zu kapseln, es dann im Netzwerk zu aktivieren und die Funktionalität sofort mit nur einer zu verwaltenden Datei verfügbar zu machen. Dies würde tatsächlich weniger Aufblähen verursachen als abhängig von Ihren functions.phpDateien.

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

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

  1. Rufen Sie eine Liste aller Blog-IDs im Netzwerk / Subnetzwerk ab. Wenn Sie eine Vanille-Installation verwenden, finden Sie diese in der wp_blogsTabelle. Führen Sie einfach eine einfache SELECTAbfrage durch, um ein Array zu laden, und führen Sie dann eine Schleife durch, um jedes Blog zu Ihrer Hauptabfrage hinzuzufügen.
  2. Erstellen Sie eine Schleife, die jedes Blog zu einer großen Abfrage hinzufügt. Sie müssen JOINTabellen zusammenstellen und nach blog_id(von wp_blogs), post_id(von wp_BLOG_posts) und der benutzerdefinierten Taxonomie suchen .

Wie gesagt, es ist keine einfache Lösung (die SQL-Anweisung wird sehr kompliziert sein und ich habe im Moment keine Zeit, sie durchzuhacken), aber es wird eine einzelne Anweisung sein, die die ganze Arbeit erledigt.

Alternative ...

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

Bei der alternativen Methode müssen Sie für jedes Blog im Netzwerk eine separate Abfrage ausführen. Wenn Ihr Netzwerk aus 10 bis 20 Standorten besteht, ist dies kein allzu großes Problem. Wenn Ihr Netzwerk aus 200 bis 500 Standorten besteht, treten einige Leistungsprobleme auf.

Außerdem sollten Sie die Ergebnisse Ihrer Abfrage nach Möglichkeit zwischenspeichern. Wenn es beim Laden mehrerer Seiten ausgeführt wird (z. B. für ein im Netzwerk freigegebenes Seitenleisten-Widget), möchten Sie die Abfrage nur ausführen, wenn neue Daten abgerufen werden müssen. Andernfalls stellen Sie die zwischengespeicherten Ergebnisse bereit, damit Sie das Netzwerk nicht verlangsamen.


Vielen Dank für Ihre Antwort. Ich mag Ihre Idee, dies über eine benutzerdefinierte SQL-Abfrage zu tun, da ich davon ausgehe, dass dies weniger Last verursachen würde. Ich hoffe, dass Sie mir zeigen können, welche Plugins Sie zum Erstellen dieser Subnetzwerke verwenden würden, mit denen Websites verknüpft sein können, und hoffentlich, wenn Sie Zeit haben, die SQL-Abfrage, die Sie verwenden müssten, um alle Beiträge innerhalb automatisch abzufragen dass Sites Subnetz zugewiesen. Ich schätze Ihre Zeit sehr
NetConstructor.com

3
Wenn möglich bitte aktualisieren
NetConstructor.com

1

Ich hatte ein ähnliches Problem. Ich musste eine Liste der Beiträge auf allen Netzwerkseiten nach Kommentaren sortieren (um die beliebtesten Beiträge anzuzeigen). Dies ist die Funktion, die ich verwendet habe.

Die Basis ist, dass zuerst eine Liste aller Blog-IDs in Ihrem Netzwerk abgerufen wird. Anschließend wird eine große einzelne Abfrage erstellt (mit UNION werden alle Zeilen kombiniert, ohne dass hässliche JOINs erforderlich sind), die ein Ergebnis mit den Spalten blog_id, ID und comment_count liefert. Auf diese Weise verwende ich dann get_blog_post (), um detaillierte Informationen zu jedem Beitrag zu erhalten.

Es gibt einige Debug-Zeilen, 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;

}}


-1

Sie benötigen auf jeden Fall ein Netzwerk-Plugin für mehrere Standorte. Derzeit stehen drei zur Auswahl: zwei bezahlte, eine kostenlose.

Von dort aus können Sie so etwas wie das Sitewide-Tags-Plugin verwenden, um Beiträge zum Hauptblog in jedem Netzwerk abzurufen.

Beides konnte (oder sollte) nicht über die Funktionsdatei eines Themas erfolgen.


Was sind die bezahlten, auf die Sie sich beziehen?
NetConstructor.com


1
und bezahlt: (meins) wpebooks.com/networks
andrea_r

-3

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

Betten Sie es in Ihre Website ein


@mirelle - aber das ist trotzig nicht die Antwort, die ich gesucht habe
NetConstructor.com
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.