Multisite (Rede, MU, MultiUser) Search
Sumário
O SearchWP é capaz de realizar pesquisas Multisite/Rede entre sites. Há uma série de coisas a mencionar/considerar em relação à implementação.
Observação: Existem limitações importantes a serem observadas!
Resumo
Pesquisas entre sites são possíveis no SearchWP. Qualquer Motor de qualquer site pode ser usado para uma pesquisa entre sites.
Observação: Os Motores do SearchWP controlam o que é indexado em cada sub-site. Se o Motor que você está usando para realizar a pesquisa tiver Fontes/Atributos/Regras diferentes dos Motores nos sub-sites que você está pesquisando, os resultados podem não ser precisos.
Por exemplo: se Posts foram adicionados ao Motor que você está usando para a pesquisa, mas um sub-site não tem um Motor com Posts habilitados, esse sub-site não retornará Posts.
Para uma pesquisa abrangente entre sites, certifique-se de que todos os sites compartilhem uma configuração semelhante e um Motor aplicável.
Detalhes de Implementação
Em um ambiente Multisite, o SearchWP constrói um índice de pesquisa abrangente para a totalidade da rede. Por padrão, o SearchWP limitará os resultados às Entradas do site atual.
Você pode utilizar \SearchWP\Query para executar pesquisas em vários sites dentro da rede, personalizando o parâmetro site para conter:
- Array de IDs de site (ou uma string de IDs de site separados por vírgula)
'all'para pesquisar todos os sites na rede
Importante: o conceito principal a entender é que os Motores do SearchWP determinam qual conteúdo é indexado para todos os sites dentro de uma rede.
Isso é significativo porque \SearchWP\Query usa um Motor do site atual para realizar a pesquisa. Vamos supor que o Motor Padrão do site atual (SITE A) tenha as seguintes Fontes e nada mais:
- Posts
- Páginas
Dentro desta rede de exemplo, há um segundo site (SITE B) que tem um Motor Padrão com as seguintes Fontes e nada mais:
- Posts
Se você estiver realizando uma \SearchWP\Query no SITE A usando seu Motor Padrão, Páginas do SITE B não serão retornadas porque Páginas não foram adicionadas ao Motor Padrão do SITE B.
Isso pode parecer contraintuitivo porque Páginas são adicionadas ao Motor Padrão do SITE A, mas os Motores do SITE B definem e controlam o que é indexado para esse site.
Configuração Recomendada do Motor
Dado o exposto, você pode utilizar um Motor Suplementar em cada site da rede que compartilhe uma configuração comum.
Alternativamente, você pode garantir que sua rede esteja configurada de forma que o Engine usado para um \SearchWP\Query seja o denominador comum mínimo para todos os sites da rede.
Tratamento de resultados de pesquisa Multisite
\SearchWP\Query permite que você especifique como os resultados são retornados usando o parâmetro fields.
Por padrão, os resultados são retornados como uma matriz de objetos, cada um com as seguintes propriedades: 'id', 'source', 'site', 'relevance'
Este formato é mais útil para resultados de pesquisa do Multisite, pois lhe dá a capacidade de switch_to_blog() quando necessário, a fim de recuperar detalhes precisos para cada resultado.
Se, no entanto, você optar por usar outro formato suportado, ele pode não incluir informações críticas de site ID, portanto, tenha isso em mente ao estruturar suas pesquisas do Multisite.
Nota: Isso se aplica especificamente ao definir fields como 'all', o que retornará cada resultado em seu formato nativo (por exemplo, como \WP_Post). Quaisquer suposições feitas na saída de seus resultados (por exemplo, uso de get_permalink()) são baseadas no site atual, não necessariamente no site de onde o resultado foi retornado!
Dado isso, é sempre recomendado usar o valor padrão para fields e manualmente switch_to_blog() (e subsequentemente restore_current_blog()) quando necessário!
Exemplos
Existem duas maneiras principais de implementar uma pesquisa Multisite entre sites:
- Substituir a pesquisa nativa/padrão em um site dentro da rede
- Configurar uma pesquisa Multisite dedicada entre sites
A primeira opção é provavelmente mais comum, mas é um pouco mais complexa do que configurar uma pesquisa dedicada e mais direta. Ambas as opções são abordadas aqui. ?
Substituindo o Padrão
Se você deseja substituir o comportamento de pesquisa padrão de um site Multisite para pesquisar em toda a rede, podemos substituir os argumentos nativos do site para fazer exatamente isso.
Exemplo: Existe uma universidade que tem um site 'principal', com muitos sub-sites Multisite para várias escolas/departamentos/etc. e queremos substituir a pesquisa no site principal para pesquisar toda a instalação Multisite. Todos os Engines Padrão são os mesmos em toda a rede Multisite.
Existem duas etapas a serem seguidas:
- Filtrar os argumentos enviados ao SearchWP para pesquisar toda a rede
- Atualizar o template de resultados da pesquisa para contabilizar as alterações de site
Filtrar argumentos para a pesquisa do site principal
Como estamos personalizando a página de resultados de pesquisa nativa, usaremos o hook searchwp\native\args para dizer ao SearchWP que queremos pesquisar em toda a rede 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 ); |
Observe que também estamos dizendo ao SearchWP para retornar resultados default (em vez de WP_Posts) — o que nos leva à etapa 2:
Atualizar o template de resultados da pesquisa
Na etapa 1, instruímos o SearchWP a pesquisar toda a rede Multisite e a não formatar os resultados como WP_Posts, mas sim a manter os resultados em sua forma original, que contém as informações do site necessárias para gerar resultados adequados em tempo de execução.
Precisamos atualizar The Loop da nossa saída no template de Resultados de Pesquisa search.php do nosso tema para acomodar os resultados formatados pelo 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(); |
Observe que o template de resultados ainda é baseado em The Loop, mas estamos personalizando o comportamento se estivermos exibindo resultados no site 1 (o site principal) para acomodar possíveis alterações no site.
Observe também que uma parte do template é usada para exibir os resultados, mas no caso em que um resultado é retornado de um site diferente, o template é incluído antes de chamarmos restore_current_blog().
Isso é necessário para garantir que chamadas de função como get_permalink() sejam executadas no contexto apropriado antes de voltarmos para o site principal para exibir o próximo resultado.
Usando um Motor Suplementar
Ao implementar uma pesquisa inter-site Multisite criada para um propósito específico, você pode seguir as mesmas instruções para criar um Motor Suplementar.
Com seu Motor Suplementar configurado, podemos primeiro personalizar a execução da pesquisa para pesquisar toda a rede 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, | |
| ] ); |
As duas edições feitas são:
- Defina
fieldspara retornar os camposdefault(que contêm informações de ID do site) - Especifique que devemos pesquisar
allsites
Com essa alteração feita na implementação do Motor Suplementar, o SearchWP pesquisará em toda a rede Multisite e retornará resultados default, portanto, precisaremos atualizar a saída dos resultados para verificar cada resultado em busca de um site diferente:
Observação: Para fins de brevidade, este trecho atualiza apenas a saída dos resultados do exemplo completo de implementação do Motor Suplementar.
| <?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; ?> |
Neste segmento de trecho, podemos ver que agora estamos prestando atenção tanto ao formato dos resultados retornado pelo SearchWP (default em vez dos objetos de resultados nativos), que contêm as informações de que precisamos sobre o site de origem de cada resultado.
À medida que iteramos sobre os resultados, chamamos switch_to_blog() quando necessário, e ainda podemos exibir resultados de qualquer Fonte do SearchWP utilizando o source, site e id de cada resultado.
Tenha em mente que você deve (e na maioria dos casos precisará) exibir todos os dados relevantes para cada resultado antes de chamar restore_current_blog(), pois muitas funções (por exemplo, get_permalink()) precisam ser executadas no contexto correto do site, portanto, chamar restore_current_blog() (quando aplicável) o mais tarde possível é sempre a melhor escolha.

