Multisite (Netzwerk, MU, MultiUser) Suche
Inhaltsverzeichnis
SearchWP kann standortübergreifende Multisite/Netzwerk-Suchen durchführen. Es gibt eine Reihe von Dingen, die bezüglich der Implementierung erwähnt/berücksichtigt werden sollten.
Hinweis: Es gibt wichtige Einschränkungen, die Sie beachten sollten!
Abstrakt
Standortübergreifende Suchen sind in SearchWP möglich. Jede Engine von jedem Standort kann für eine standortübergreifende Suche verwendet werden.
Hinweis: Die Engines von SearchWP steuern, was auf jeder Unterseite indiziert wird. Wenn die Engine, die Sie für die Suche verwenden, andere Quellen/Attribute/Regeln hat als die Engines auf den Unterseiten, die Sie durchsuchen, sind die Ergebnisse möglicherweise nicht korrekt.
Wenn beispielsweise Beiträge zur Engine hinzugefügt wurden, die Sie für die Suche verwenden, aber eine Unterseite keine aktivierte Engine für Beiträge hat, wird diese Unterseite keine Beiträge zurückgeben.
Stellen Sie für eine umfassende standortübergreifende Suche sicher, dass alle Standorte eine ähnliche Konfiguration und eine anwendbare Engine haben.
Implementierungsdetails
In einer Multisite-Umgebung erstellt SearchWP einen umfassenden Suchindex für das gesamte Netzwerk. Standardmäßig beschränkt SearchWP die Ergebnisse auf Einträge des aktuellen Standorts.
Sie können \SearchWP\Query verwenden, um Suchen über mehrere Standorte im Netzwerk auszuführen, indem Sie den Parameter site wie folgt anpassen:
- Array von Standort-IDs (oder eine durch Kommas getrennte Zeichenkette von Standort-IDs)
'all', um alle Standorte im Netzwerk zu durchsuchen
Wichtig: Das Hauptkonzept, das Sie verstehen müssen, ist, dass die Engines von SearchWP bestimmen, welche Inhalte für alle Standorte in einem Netzwerk indiziert werden.
Dies ist bedeutsam, da \SearchWP\Query eine Engine vom aktuellen Standort verwendet, um die Suche durchzuführen. Nehmen wir an, die Standard-Engine des aktuellen Standorts (STANDORT A) hat die folgenden Quellen und nichts weiter:
- Beiträge
- Seiten
Innerhalb dieses Beispielnetzwerks gibt es einen zweiten Standort (STANDORT B), der eine Standard-Engine mit den folgenden Quellen und nichts weiter hat:
- Beiträge
Wenn Sie eine \SearchWP\Query in STANDORT A mit dessen Standard-Engine durchführen, werden Seiten von STANDORT B nicht zurückgegeben, da Seiten nicht zur Standard-Engine von STANDORT B hinzugefügt wurden.
Dies mag kontraintuitiv erscheinen, da Seiten zur Standard-Engine von STANDORT A hinzugefügt wurden, aber die Engines von STANDORT B definieren und steuern, was für diesen Standort indiziert wird.
Empfohlene Engine-Konfiguration
Unter Berücksichtigung des oben Genannten können Sie auf jedem Netzwerkstandort eine ergänzende Engine verwenden, die eine gemeinsame Konfiguration teilt.
Alternativ können Sie sicherstellen, dass Ihr Netzwerk so eingerichtet ist, dass die für eine \SearchWP\Query verwendete Engine der kleinste gemeinsame Nenner für alle Websites im Netzwerk ist.
Verarbeitung von Multisite-Suchergebnissen
\SearchWP\Query ermöglicht es Ihnen, mithilfe des Parameters fields anzugeben, wie Ergebnisse zurückgegeben werden.
Standardmäßig werden Ergebnisse als Array von Objekten zurückgegeben, die jeweils die folgenden Eigenschaften haben: 'id', 'source', 'site', 'relevance'
Dieses Format ist am nützlichsten für Multisite-Suchergebnisse, da es Ihnen die Möglichkeit gibt, switch_to_blog() zu verwenden, wenn nötig, um genaue Details für jedes Ergebnis abzurufen.
Wenn Sie sich jedoch entscheiden, ein anderes unterstütztes Format zu verwenden, enthält es möglicherweise keine wichtigen site ID-Informationen. Beachten Sie dies daher bei der Strukturierung Ihrer Multisite-Suchen.
Hinweis: Dies gilt speziell, wenn fields auf 'all' gesetzt ist, was jedes Ergebnis in seinem nativen Format zurückgibt (z. B. als \WP_Post). Alle Annahmen, die in Ihrer Ergebnis-Ausgabe getroffen werden (z. B. die Verwendung von get_permalink()), basieren auf der aktuellen Website, nicht unbedingt auf der Website, von der das Ergebnis zurückgegeben wurde!
Daher wird immer empfohlen, den Standardwert für fields zu verwenden und manuell switch_to_blog() (und anschließend restore_current_blog()) zu verwenden, wenn nötig!
Beispiele
Es gibt zwei Hauptmöglichkeiten, eine standortübergreifende Multisite-Suche zu implementieren:
- Überschreiben Sie die native/Standard-Suche auf einer Website im Netzwerk
- Richten Sie eine speziell dafür vorgesehene standortübergreifende Multisite-Suche ein
Ersteres ist wahrscheinlich üblicher, aber etwas komplexer als die Einrichtung einer direkteren, speziell dafür vorgesehenen Suche. Beide Optionen werden hier behandelt. ?
Überschreiben der Standardeinstellung
Wenn Sie das Standard-Suchverhalten einer Multisite-Website überschreiben möchten, um im gesamten Netzwerk zu suchen, können wir die nativen/Standard-Argumente überschreiben, um genau das zu tun.
Beispiel: Es gibt eine Universität mit einer „Haupt“-Website und vielen Multisite-Unterseiten für verschiedene Schulen/Abteilungen usw. und wir möchten die Suche auf der Hauptseite überschreiben, um die gesamte Multisite-Installation zu durchsuchen. Alle Standard-Engines sind im gesamten Multisite-Netzwerk gleich.
Es sind zwei Schritte erforderlich:
- Filtern Sie die an SearchWP gesendeten Argumente, um das gesamte Netzwerk zu durchsuchen
- Aktualisieren Sie die Suchergebnisvorlage, um Änderungen am Standort zu berücksichtigen
Filterargumente für die Hauptseitensuche
Da wir die native Suchergebnisseite anpassen, verwenden wir den Hook searchwp\native\args, um SearchWP mitzuteilen, dass wir im gesamten Multisite-Netzwerk suchen möchten:
All hooks should be added to your custom SearchWP Customizations Plugin.
| <?php | |
| // @link https://searchwp.com/documentation/multisite/ | |
| // Tell SearchWP to search the entire Multisite network when searching on the main site. | |
| add_filter( 'searchwp\query\args', function( $args, $query ) { | |
| // If this is not site 1, bail out. | |
| if ( 1 !== get_current_blog_id() ) { | |
| return $args; | |
| } | |
| // Search sites with ID 1, 2, 3. | |
| $args['site'] = [1,2,3]; | |
| // Retain site info in results. | |
| $args['fields'] = 'default'; | |
| return $args; | |
| }, 10, 2 ); |
Beachten Sie, dass wir SearchWP auch anweisen, default-Ergebnisse (anstelle von WP_Posts) zurückzugeben – was uns zu Schritt 2 bringt:
Aktualisieren Sie die Suchergebnisvorlage
In Schritt 1 haben wir SearchWP angewiesen, das gesamte Multisite-Netzwerk zu durchsuchen und die Ergebnisse nicht als WP_Posts zu formatieren, sondern die Ergebnisse in ihrer ursprünglichen Form zu belassen, die die Site-Informationen enthält, die wir zur Laufzeit zur Generierung korrekter Ergebnisse benötigen.
Wir müssen The Loop unserer Ausgabe in der search.php Suchergebnisvorlage unseres Themes aktualisieren, um die von SearchWP formatierten Ergebnisse zu berücksichtigen:
| <?php | |
| // @link https://searchwp.com/documentation/multisite/ | |
| global $post; | |
| $current_blog_id = get_current_blog_id(); | |
| get_header(); | |
| if ( have_posts() ) { | |
| while ( have_posts() ) { | |
| the_post(); | |
| // Search Results may be formatted as SearchWP results | |
| // because we're searching cross-site on the main site. | |
| if ( 1 === $current_blog_id ) { | |
| if ( $current_blog_id !== $post->site ) { | |
| switch_to_blog( $post->site ); | |
| $post = get_post( $post->id ); | |
| get_template_part( 'search-result' ); | |
| restore_current_blog(); | |
| } else { | |
| $post = get_post( $post->id ); | |
| get_template_part( 'search-result' ); | |
| } | |
| } else { | |
| get_template_part( 'search-result' ); | |
| } | |
| } | |
| } else { | |
| get_template_part( 'template-parts/content/content-none' ); | |
| } | |
| get_footer(); |
Beachten Sie, dass die Ergebnissvorlage immer noch auf The Loop basiert, aber wir passen das Verhalten an, wenn wir Ergebnisse auf Site 1 (der Haupt-Site) ausgeben, um potenzielle Site-Änderungen zu berücksichtigen.
Beachten Sie auch, dass ein Vorlagenteil zur Ausgabe von Ergebnissen verwendet wird, aber in dem Fall, dass ein Ergebnis von einer anderen Site zurückgegeben wird, wird die Vorlage bevor wir restore_current_blog() aufrufen, eingebunden.
Dies ist notwendig, um sicherzustellen, dass Funktionsaufrufe wie get_permalink() im richtigen Kontext ausgeführt werden, bevor wir zur Haupt-Site zurückkehren, um das nächste Ergebnis auszugeben.
Verwendung einer ergänzenden Engine
Bei der Implementierung einer speziell entwickelten Multisite-übergreifenden Suche können Sie dieselben Anweisungen befolgen, um eine ergänzende Engine zu erstellen.
Mit Ihrer eingerichteten ergänzenden Engine können wir zunächst die Ausführung der Suche anpassen, um das gesamte Multisite-Netzwerk zu durchsuchen:
| <?php | |
| // ... this overrides the \SearchWP\Query instantiation found | |
| // @link https://searchwp.com/documentation/search/supplemental-engine/ | |
| // e.g. $search_page is defined in the full snippet, this solely | |
| // replaces the query to search across sites and return 'default' results. | |
| $searchwp_query = new \SearchWP\Query( $search_query, [ | |
| 'engine' => 'supplemental', // The Engine name. | |
| 'fields' => 'default', // Retain site ID info with results. | |
| 'site' => 'all', // Search all sites. | |
| 'page' => $search_page, | |
| ] ); |
Die beiden vorgenommenen Änderungen sind:
- Definieren Sie
fields, um diedefaultFelder zurückzugeben (die Site-ID-Informationen enthalten) - Geben Sie an, dass wir
allSites durchsuchen sollen
Mit dieser Änderung an der Implementierung der ergänzenden Engine durchsucht SearchWP dann das gesamte Multisite-Netzwerk und gibt default Ergebnisse zurück. Daher müssen wir die Ausgabe der Ergebnisse aktualisieren, um jedes Ergebnis auf eine andere Site zu überprüfen:
Hinweis: Der Kürze halber aktualisiert dieser Ausschnitt nur die Ergebnisausgabe des vollständigen Beispiels der Implementierung der ergänzenden Engine.
| <?php | |
| // ... this snippet overrides the results output found | |
| // @link https://searchwp.com/documentation/search/supplemental-engine/ | |
| // so as to account for results that are from a different Multisite site. | |
| // This is not a full and complete example, it shows only the customization | |
| // to the results output to account for site changes. | |
| // Track the current blog ID. | |
| $current_blog_id = get_current_blog_id(); | |
| ?> | |
| <?php if ( ! empty( $search_query ) && ! empty( $search_results ) ) : ?> | |
| <?php foreach ( $search_results as $search_result ) : ?> | |
| <article class="page hentry search-result"> | |
| <?php | |
| // Track whether we switched sites for this result. | |
| $switched_site = false; | |
| // Do we need to switch to the proper site for this result? | |
| if ( $current_blog_id !== $search_result->site ) { | |
| switch_to_blog( $search_result->site ); | |
| $switched_site = true; | |
| } | |
| // Output the result based on SearchWP Source. | |
| switch( $search_result->source ) { | |
| // Posts and Pages. | |
| case 'post' . SEARCHWP_SEPARATOR . 'post': | |
| case 'post' . SEARCHWP_SEPARATOR . 'page': | |
| $post = get_post( $search_result->id ); | |
| ?> | |
| <header class="entry-header"><h2 class="entry-title"> | |
| <a href="<?php echo get_permalink(); ?>"><?php the_title(); ?></a> | |
| </h2></header> | |
| <div class="entry-summary"><?php the_excerpt(); ?></div> | |
| <?php | |
| wp_reset_postdata(); | |
| break; | |
| // Users. | |
| case 'user': | |
| ?> | |
| <header class="entry-header"><h2 class="entry-title"> | |
| <a href="<?php echo get_author_posts_url( $search_result->id ); ?>"> | |
| <?php echo esc_html( get_the_author_meta( 'display_name', $search_result->id ) ); ?> | |
| </a> | |
| </h2></header> | |
| <div class="entry-summary"> | |
| <?php echo wp_kses_post( get_the_author_meta( 'description', $search_result->id ) ); ?> | |
| </div> | |
| <?php | |
| break; | |
| } | |
| ?> | |
| </article> | |
| <?php | |
| // If we switched sites, switch back! | |
| if ( $switched_site ) { | |
| restore_current_blog(); | |
| } | |
| ?> | |
| <?php endforeach; ?> | |
| <?php endif; ?> |
In diesem Ausschnitt-Segment können wir sehen, dass wir nun sowohl auf das Ergebnisformat achten, das von SearchWP zurückgegeben wird (default anstelle der nativen Ergebnisobjekte), das die benötigten Informationen über die Herkunfts-Site jedes Ergebnisses enthält.
Während wir die Ergebnisse durchlaufen, rufen wir bei Bedarf switch_to_blog() auf, und wir können immer noch Ergebnisse von jeder SearchWP-Quelle ausgeben, indem wir source, site und id jedes Ergebnisses verwenden.
Beachten Sie, dass Sie alle relevanten Daten für jedes Ergebnis ausgeben sollten (und in den meisten Fällen ausgeben müssen), bevor Sie restore_current_blog() aufrufen, da viele Funktionen (z. B. get_permalink()) im richtigen Site-Kontext ausgeführt werden müssen. Daher ist das Aufrufen von restore_current_blog() (sofern zutreffend) so spät wie möglich immer die beste Wahl.

