SearchWP Documentation

Visualizza la guida all'installazione, sfoglia la Knowledge Base, scopri i numerosi hook di SearchWP

Ricerca Multisite (Network, MU, MultiUser)

SearchWP è in grado di eseguire ricerche inter-sito Multisite/Network. Ci sono diverse cose da menzionare/considerare riguardo all'implementazione.

Nota: Ci sono limitazioni importanti da conoscere!

Abstract

Le ricerche inter-sito sono possibili in SearchWP. Qualsiasi motore di qualsiasi sito può essere utilizzato per una ricerca inter-sito.

Nota: I motori di SearchWP controllano cosa viene indicizzato su ciascun sottosito. Se il motore che stai utilizzando per eseguire la ricerca ha Fonti/Attributi/Regole diverse rispetto ai motori sui sottositi che stai cercando, i risultati potrebbero non essere accurati.

Ad esempio: se i Post sono stati aggiunti al motore che stai utilizzando per la ricerca, ma un sottosito non ha un motore con i Post abilitati, quel sottosito non restituirà i Post.

Per una ricerca inter-sito completa, assicurati che tutti i siti condividano una configurazione simile e un motore applicabile.

Dettagli di implementazione

In un ambiente Multisite, SearchWP costruisce un indice di ricerca completo per l'intera rete. Per impostazione predefinita, SearchWP limiterà i risultati alle Voci del sito corrente.

Puoi utilizzare \SearchWP\Query per eseguire ricerche su più siti all'interno della rete personalizzando il parametro site in modo che contenga:

  • Array di ID sito (o una stringa di ID sito separati da virgole)
  • 'all' per cercare in tutti i siti della rete

Importante: il concetto principale da capire è che i motori di SearchWP determinano quale contenuto viene indicizzato per tutti i siti all'interno di una rete.

Questo è significativo perché \SearchWP\Query utilizza un motore del sito corrente per eseguire la ricerca. Supponiamo che il motore predefinito del sito corrente (SITO A) abbia le seguenti Fonti e nient'altro:

  • Post
  • Pagine

All'interno di questa rete di esempio c'è un secondo sito (SITO B) che ha un motore predefinito con le seguenti Fonti e nient'altro:

  • Post

Se stai eseguendo una \SearchWP\Query in SITO A utilizzando il suo motore predefinito, le Pagine del SITO B non verranno restituite perché le Pagine non sono state aggiunte al motore predefinito del SITO B.

Questo potrebbe sembrare controintuitivo perché le Pagine sono aggiunte al motore predefinito del SITO A, ma i motori del SITO B definiscono e controllano ciò che viene indicizzato per quel sito.

Configurazione motore consigliata

Dato quanto sopra, puoi utilizzare un motore supplementare su ciascun sito della rete che condivida una configurazione comune.

In alternativa, puoi assicurarti che la tua rete sia configurata in modo tale che il motore utilizzato per un \SearchWP\Query sia il minimo comune denominatore per tutti i siti all'interno della rete.

Gestione dei risultati di ricerca Multisite

\SearchWP\Query ti consente di specificare come vengono restituiti i risultati utilizzando il parametro fields.

Per impostazione predefinita, i risultati vengono restituiti come un array di oggetti, ciascuno con le seguenti proprietà: 'id', 'source', 'site', 'relevance'

Questo formato è più utile per i risultati di ricerca Multisite perché ti dà la possibilità di switch_to_blog() quando necessario per recuperare dettagli accurati per ogni risultato.

Se tuttavia scegli di utilizzare un altro formato supportato, potrebbe non includere informazioni critiche sull'ID del sito, quindi tienilo presente mentre strutturi le tue ricerche Multisite.

Nota: Questo si applica specificamente quando si imposta fields su 'all', il che restituirà ciascun risultato nel suo formato nativo (ad esempio, come \WP_Post). Qualsiasi ipotesi fatta nell'output dei risultati (ad esempio, l'uso di get_permalink()) si basa sul sito corrente, non necessariamente sul sito da cui è stato restituito il risultato!

Detto questo, è sempre consigliabile utilizzare il valore predefinito per fields e chiamare manualmente switch_to_blog() (e successivamente restore_current_blog()) quando necessario!

Esempi

Ci sono due modi principali per implementare una ricerca Multisite cross-site:

  • Sovrascrivere la ricerca nativa/predefinita su un sito all'interno della rete
  • Impostare una ricerca Multisite cross-site dedicata

Il primo è probabilmente più comune, ma è leggermente più complesso rispetto all'impostazione di una ricerca dedicata più diretta. Entrambe le opzioni sono trattate qui. ?

Override del default

Se desideri sovrascrivere il comportamento di ricerca predefinito di un sito Multisite per cercare nell'intera rete, possiamo sovrascrivere gli argomenti nativi del sito per fare proprio questo.

Esempio: C'è un'università che ha un sito 'principale', con molti sotto-siti Multisite per varie scuole/dipartimenti/ecc. e vogliamo sovrascrivere la ricerca sul sito principale per cercare nell'intera installazione Multisite. Tutti i motori predefiniti sono uguali in tutta la rete Multisite.

Ci sono due passaggi da compiere:

  1. Filtrare gli argomenti inviati a SearchWP per cercare nell'intera rete
  2. Aggiornare il modello dei risultati di ricerca per tenere conto delle modifiche del sito

Filtrare gli argomenti per la ricerca sul sito principale

Poiché stiamo personalizzando la pagina dei risultati di ricerca nativa, useremo l'hook searchwp\native\args per dire a SearchWP che vogliamo cercare nell'intera rete Multisite:

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

Nota che stiamo anche dicendo a SearchWP di restituire risultati default (invece di WP_Post) — il che ci porta al passaggio 2:

Aggiornare il modello dei risultati di ricerca

Nel passaggio 1 abbiamo detto a SearchWP di cercare nell'intera rete Multisite e di *non* formattare i risultati come WP_Post, ma di mantenere i risultati nella loro forma originale, che contiene le informazioni del sito necessarie per generare risultati corretti al momento dell'esecuzione.

Dobbiamo aggiornare The Loop del nostro output nel template dei risultati di ricerca search.php del nostro tema per tenere conto dei risultati formattati da SearchWP:

<?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();
view raw search.php hosted with ❤ by GitHub

Nota che il template dei risultati è ancora basato su The Loop, ma stiamo personalizzando il comportamento se stiamo mostrando i risultati sul sito 1 (il sito principale) per tenere conto di potenziali modifiche al sito.

Nota anche che viene utilizzata una parte del template per mostrare i risultati, ma nel caso in cui un risultato provenga da un sito *diverso*, il template viene incluso *prima* di restore_current_blog().

Ciò è necessario per garantire che le chiamate di funzione come get_permalink() vengano eseguite nel contesto corretto *prima* di tornare al sito principale per mostrare il risultato successivo.

Utilizzo di un motore supplementare

Quando si implementa una ricerca inter-sito Multisite creata appositamente, è possibile seguire le stesse istruzioni per creare un Motore Supplementare.

Con il tuo Motore Supplementare configurato, possiamo prima personalizzare l'esecuzione della ricerca per cercare nell'intera rete Multisite:

<?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,
] );

Le due modifiche apportate sono:

  1. Definire fields per restituire i campi default (che contengono informazioni sull'ID del sito)
  2. Specificare che dovremmo cercare in all i siti

Con questa modifica all'implementazione del Motore Supplementare, SearchWP cercherà nell'intera rete Multisite e restituirà risultati default, quindi dovremo aggiornare l'output dei risultati per controllare ciascun risultato per un sito diverso:

Nota: Per brevità, questo snippet aggiorna *solo l'output dei risultati* dell'esempio completo di implementazione del Motore Supplementare.

<?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 questo segmento di snippet possiamo vedere che stiamo prestando attenzione sia al formato dei risultati restituito da SearchWP (default invece degli oggetti di risultati nativi) che contengono le informazioni di cui abbiamo bisogno sul sito di origine di ciascun risultato.

Mentre iteriamo sui risultati, utilizziamo switch_to_blog() quando necessario, e possiamo ancora mostrare risultati da qualsiasi Sorgente SearchWP utilizzando source, site e id di ciascun risultato.

Tieni presente che dovresti (e nella maggior parte dei casi *dovrai*) mostrare tutti i dati pertinenti per ciascun risultato *prima* di chiamare restore_current_blog() perché molte funzioni (ad es. get_permalink()) devono essere eseguite nel contesto del sito corretto, quindi chiamare restore_current_blog() (quando applicabile) il più tardi possibile è sempre la scelta migliore.

Crea Oggi Stesso una Migliore Esperienza di Ricerca WordPress

Non perdere mai più visitatori a causa di risultati di ricerca inutili. SearchWP rende la creazione della tua ricerca intelligente WordPress veloce e facile.

Get SearchWP Now
Icona di motori di ricerca multipli