SearchWP Documentation

Consultez le guide d’installation, parcourez la base de connaissances, découvrez les nombreux hooks de SearchWP

Recherche Multisite (Réseau, MU, MultiUtilisateur)

SearchWP est capable d'effectuer des recherches Multisite/Réseau inter-sites. Il y a un certain nombre de points à mentionner/considérer concernant l'implémentation.

Note : Il y a des limitations importantes à connaître !

Résumé

Les recherches inter-sites sont possibles dans SearchWP. N'importe quel moteur d'un site quelconque peut être utilisé pour une recherche inter-sites.

Note : Les moteurs de SearchWP contrôlent ce qui est indexé sur chaque sous-site. Si le moteur que vous utilisez pour effectuer la recherche a des sources/attributs/règles différents de ceux des moteurs des sous-sites que vous recherchez, les résultats peuvent ne pas être exacts.

Par exemple : si des articles ont été ajoutés au moteur que vous utilisez pour la recherche, mais qu'un sous-site n'a pas de moteur avec les articles activés, ce sous-site ne renverra pas d'articles.

Pour une recherche inter-sites complète, assurez-vous que tous les sites partagent une configuration similaire et un moteur applicable.

Détails d'implémentation

Dans un environnement Multisite, SearchWP construit un index de recherche complet pour l'intégralité du réseau. Par défaut, SearchWP limitera les résultats aux entrées du site actuel.

Vous pouvez utiliser \SearchWP\Query pour exécuter des recherches sur plusieurs sites du réseau en personnalisant le paramètre site pour contenir soit :

  • Un tableau d'identifiants de site (ou une chaîne d'identifiants de site séparés par des virgules)
  • 'all' pour rechercher sur tous les sites du réseau

Important : le concept principal à comprendre est que les moteurs de SearchWP déterminent quel contenu est indexé pour tous les sites d'un réseau.

Ceci est significatif car \SearchWP\Query utilise un moteur du site actuel pour effectuer la recherche. Disons que le moteur par défaut du site actuel (SITE A) a les sources suivantes et rien d'autre :

  • Articles
  • Pages

Au sein de ce réseau d'exemple, il existe un second site (SITE B) qui a un moteur par défaut avec les sources suivantes et rien d'autre :

  • Articles

Si vous effectuez une \SearchWP\Query dans SITE A en utilisant son moteur par défaut, les pages de SITE B ne seront pas renvoyées car les pages n'ont pas été ajoutées au moteur par défaut de SITE B.

Cela peut sembler contre-intuitif car les pages sont ajoutées au moteur par défaut de SITE A, mais les moteurs de SITE B définissent et contrôlent ce qui est indexé pour ce site.

Configuration recommandée du moteur

Compte tenu de ce qui précède, vous pouvez utiliser un moteur supplémentaire sur chaque site du réseau qui partage une configuration commune.

Alternativement, vous pouvez vous assurer que votre réseau est configuré de telle sorte que le moteur utilisé pour une \SearchWP\Query soit le dénominateur commun le plus bas pour tous les sites du réseau.

Gestion des résultats de recherche Multisite

\SearchWP\Query vous permet de spécifier comment les résultats sont renvoyés à l'aide du paramètre fields.

Par défaut, les résultats sont renvoyés sous forme d'un tableau d'objets ayant chacun les propriétés suivantes : 'id', 'source', 'site', 'relevance'.

Ce format est le plus utile pour les résultats de recherche Multisite car il vous donne la possibilité de switch_to_blog() lorsque nécessaire afin de récupérer des détails précis pour chaque résultat.

Si toutefois vous choisissez d'utiliser un autre format pris en charge, il peut ne pas inclure les informations critiques sur l'ID du site, alors gardez cela à l'esprit lorsque vous structurez vos recherches Multisite.

Note : Ceci s'applique spécifiquement lorsque vous définissez fields sur 'all', ce qui renverra chaque résultat dans son format natif (par exemple, en tant que \WP_Post). Toutes les hypothèses faites dans la sortie de vos résultats (par exemple, l'utilisation de get_permalink()) sont basées sur le site actuel, pas nécessairement sur le site d'où le résultat a été renvoyé !

Étant donné cela, il est toujours recommandé d'utiliser la valeur par défaut pour fields et de switch_to_blog() manuellement (et ensuite restore_current_blog()) lorsque nécessaire !

Exemples

Il existe deux manières principales d'implémenter une recherche Multisite inter-sites :

  • Remplacer la recherche native/par défaut sur un site du réseau
  • Mettre en place une recherche Multisite inter-sites dédiée

La première option est probablement plus courante, mais légèrement plus complexe que la mise en place d'une recherche dédiée plus directe. Les deux options sont abordées ici. ?

Remplacement par défaut

Si vous souhaitez remplacer le comportement de recherche par défaut d'un site Multisite pour rechercher sur l'ensemble du réseau, nous pouvons remplacer les arguments natifs du site pour faire exactement cela.

Exemple : Il existe une université qui a un site « principal », avec de nombreux sous-sites Multisite pour diverses écoles/départements/etc. et nous voulons remplacer la recherche sur le site principal pour rechercher dans toute l'installation Multisite. Tous les moteurs par défaut sont identiques sur l'ensemble du réseau Multisite.

Il y a deux étapes à suivre :

  1. Filtrer les arguments envoyés à SearchWP pour rechercher sur l'ensemble du réseau
  2. Mettre à jour le modèle de résultats de recherche pour tenir compte des changements de site

Filtrer les arguments pour la recherche sur le site principal

Étant donné que nous personnalisons la page de résultats de recherche native, nous utiliserons le hook searchwp\native\args pour indiquer à SearchWP que nous voulons rechercher sur l'ensemble du réseau 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 );

Notez que nous indiquons également à SearchWP de renvoyer des résultats default (au lieu de WP_Post) — ce qui nous amène à l'étape 2 :

Mettre à jour le modèle de résultats de recherche

À l’étape 1, nous avons demandé à SearchWP de rechercher sur l’ensemble du réseau Multisite et de ne *pas* formater les résultats en tant qu’objets WP_Post, mais de conserver les résultats dans leur forme d’origine, qui contient les informations du site nécessaires pour générer des résultats appropriés au moment de l’exécution.

Nous devons mettre à jour la boucle (The Loop) de notre sortie dans le modèle de résultats de recherche search.php de notre thème pour tenir compte des résultats formatés par 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

Notez que le modèle de résultats est toujours basé sur la boucle (The Loop), mais nous personnalisons le comportement si nous affichons des résultats sur le site 1 (le site principal) pour tenir compte des changements potentiels de site.

Notez également qu’une partie du modèle est utilisée pour afficher les résultats, mais dans le cas où un résultat provient d’un site *différent*, le modèle est inclus *avant* que nous appelions restore_current_blog().

Ceci est nécessaire afin de garantir que les appels de fonction tels que get_permalink() s’exécutent dans le contexte approprié *avant* de revenir au site principal pour afficher le résultat suivant.

Utilisation d'un moteur supplémentaire

Lors de la mise en œuvre d’une recherche inter-sites Multisite spécialement conçue, vous pouvez suivre les mêmes instructions pour créer un moteur supplémentaire.

Avec votre moteur supplémentaire configuré, nous pouvons d’abord personnaliser l’exécution de la recherche pour rechercher sur l’ensemble du réseau 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,
] );

Les deux modifications apportées sont :

  1. Définir fields pour retourner les champs default (qui contiennent les informations de l’ID du site)
  2. Spécifier que nous devons rechercher sur all les sites

Avec cette modification apportée à l’implémentation du moteur supplémentaire, SearchWP recherchera alors sur l’ensemble du réseau Multisite et retournera les résultats default. Nous devrons donc mettre à jour l’affichage des résultats pour vérifier chaque résultat afin de déterminer s’il provient d’un site différent :

Note : Pour plus de concision, cet extrait met à jour *uniquement l’affichage des résultats* de l’implémentation complète de l’exemple de moteur supplémentaire.

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

Dans ce segment d’extrait, nous pouvons voir que nous prêtons maintenant attention à la fois au format des résultats retournés par SearchWP (default au lieu des objets de résultats natifs) qui contiennent les informations dont nous avons besoin sur le site d’origine de chaque résultat.

Lorsque nous parcourons les résultats, nous appelons switch_to_blog() si nécessaire, et nous pouvons toujours afficher les résultats de n’importe quelle source SearchWP en utilisant la source, le site et l’id de chaque résultat.

Gardez à l’esprit que vous devriez (et dans la plupart des cas, vous devrez) afficher toutes les données pertinentes pour chaque résultat *avant* d’appeler restore_current_blog() car de nombreuses fonctions (par exemple, get_permalink()) doivent s’exécuter dans le contexte du bon site. Ainsi, appeler restore_current_blog() (lorsque cela est applicable) le plus tard possible est toujours le meilleur choix.

Créez dès aujourd'hui une meilleure expérience de recherche WordPress

Ne perdez plus jamais de visiteurs à cause de résultats de recherche inutiles. SearchWP rend la création de votre propre recherche WordPress intelligente rapide et facile.

Get SearchWP Now
Icône de moteurs de recherche multiples