Pesquisa de administrador do WordPress: estendendo os resultados

Publicados: 2021-01-20

Às vezes, encontrar conteúdo em um site pode ser difícil. Como administrador do WordPress, quanto mais fácil for encontrar o conteúdo que você procura, melhor. Felizmente, o WordPress fornece uma função de pesquisa na maioria das telas de administração que você usará (por exemplo, a tela de postagens). Embora essa função de pesquisa seja boa, ela é limitada de várias maneiras.

Por exemplo, se você pesquisar uma postagem na tela de administração de postagens, a função de pesquisa, por padrão, procurará o texto da consulta de pesquisa no título da postagem, no trecho da postagem e no conteúdo da postagem e retornará esses resultados. Mas e se você quiser pesquisar com palavras-chave relacionadas a um campo personalizado? Essas informações não estão incluídas nos resultados de pesquisa da tabela de lista de postagens do administrador, o que pode ser frustrante.

Em um artigo anterior, aprendemos como adicionar um campo personalizado em nossos tipos de postagem. Vamos dar uma olhada em como podemos incluir um campo personalizado nos resultados da pesquisa também.

Estender a consulta de pesquisa na pesquisa da tela do administrador

Em nosso exemplo trabalhado em campos personalizados, criamos um campo personalizado chamado 'source' em uma de nossas postagens e inserimos um valor de URL.

Se você for na tabela da lista de postagens e usar um desses valores de 'fonte' na barra de pesquisa, não obterá nenhum resultado, pois o WordPress simplesmente não analisa os campos personalizados ao pesquisar por padrão.

Para mudar isso, precisaremos estender o gancho original que o WordPress fornece para o recurso de pesquisa. O gancho que temos que estender é o pre_get_posts que está incluído no arquivo wp-includes/class-wp-query.php em torno da linha 1779 dentro da função get_posts .

A consulta do WordPress

Toda vez que você visita uma página, seja na visualização frontal ou na área de administração, uma cadeia de scripts de código é executada para criar o objeto WP_Query correspondente à sua solicitação, juntamente com suas propriedades.

Vamos criar uma visão temporária de algumas das saídas das propriedades da consulta para entender quais mudanças ocorrem no objeto WP_Query em cada caso.

Para visualizar a consulta antes de ser executada, anexaremos a impressão no gancho de ação pre_get_posts . O filtro pre_get_posts acionado após a criação do objeto de variável de consulta, mas antes da execução da consulta real.

No arquivo functions.php do seu tema ativo insira este pedaço de código:

 add_action( 'pre_get_posts', 'print_query' ); function print_query( ) { print_r ( $GLOBALS['wp_query']->query ); echo "<hr>"; print_r ( $GLOBALS['wp_query']->query_vars ); echo "<hr>"; }

Agora, se você visitar a tela de administração de Posts, as saídas query e query_var s serão impressas na parte superior.

Para visualizar o código mais facilmente, você pode copiá-lo e colá-lo em um embelezador PHP online gratuito.

O array $GLOBALS['wp_query']->query (first out) ficará assim:

 Array ( [order] => [orderby] => [post_type] => post [posts_per_page] => 20 [post_status] => [perm] => )

No caso de uma pesquisa na tela de administração de Posts, por exemplo, a saída da matriz será alterada, incluindo a string de pesquisa. Se pesquisarmos por 'wordpress.org' por exemplo, ficará assim:

 Array ( [m] => 0 [cat] => 0 [s] => wordpress.org [paged] => 1 [order] => [orderby] => [post_type] => post [posts_per_page] => 20 [post_status] => [perm] => )

Monte o código

Com as informações acima em mente, inseriremos o código correto para obter a função de pesquisa necessária. Para fazer isso, volte para o functions.php do seu tema ativo e exclua o código que você inseriu alguns momentos atrás na etapa anterior. Em seguida, insira o código abaixo:

 add_action( 'pre_get_posts', 'extend_admin_search' ); function extend_admin_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( ! is_admin() ) return; if ( $query->query['post_type'] != $post_type ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

O próximo passo é alterar as $post_type e $custom_fields para valores que se aplicam aos seus requisitos. Vamos ver o que fizemos no código.

  • $post_type = 'post'; – Aqui definimos o tipo de postagem que queremos pesquisar.
  • $custom_fields = array("source",); – Aqui definimos o(s) campo(s) personalizado(s) que queremos pesquisar.

Como estamos trabalhando com o gancho pre_get_posts , é importante garantir em nosso código que aplicamos nossa extensão de pesquisa personalizada enquanto estamos na página correta. Para dizer ao WordPress para exibir nosso código sob condições específicas, usamos algumas tags condicionais.

  • O if ( ! is_admin() ) return; condição garante que, se não estivermos na área de administração, nenhum de nosso código será executado.
  • O if ( $query->query['post_type'] != $post_type ) verifica se trabalhamos no tipo de postagem que definimos na variável $post_type . No nosso caso, post .
  • O $search_term = $query->query_vars['s']; é onde mantemos a string de busca em uma variável e então a definimos como vazia novamente $query->query_vars['s'] = ''; caso contrário, não encontrará nada.

Agora, com essas atualizações em vigor, se você atualizar a última pesquisa, obterá os resultados corretos. No nosso caso, vemos a postagem 'Post 1' nos resultados que inclui uma entrada de campo personalizado 'source': 'https://dev. wordpress.org /reference/functions/add_post_meta/'.

melhorar a pesquisa de administração do wordpress

Estender a consulta de pesquisa na pesquisa do Front View

Agora que 'consertamos' nossa pesquisa de administrador, podemos avançar para melhorar nossa função de pesquisa de front-end para que os usuários de nosso site também possam pesquisar campos personalizados.

Da mesma forma que anteriormente a pesquisa de administrador não produzia resultados para campos personalizados, a pesquisa de front-end também não retorna nenhum resultado para campos personalizados.

Idealmente, queremos que os usuários possam pesquisar esses campos. Neste exemplo, temos um campo 'source' personalizado em uma de nossas postagens que atualmente contém a url 'https://dev.wordpress.org/reference/functions/add_post_meta/'. Se um usuário pesquisar por 'wordpress.org', esta postagem deve aparecer nos resultados. Vamos descobrir como fazer isso.

O código necessário

Vá para o seu arquivo functions.php novamente e copie o código que você colou anteriormente. Agora, cole isso diretamente abaixo desse código (para que você tenha duas cópias desse código em functions.php ) Agora, altere o nome da função neste segundo lote de código para algo como extend_front_search . Deve ficar assim:

 add_action( 'pre_get_posts', 'extend_admin_search' ); function extend_admin_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( ! is_admin() ) return; if ( $query->query['post_type'] != $post_type ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

Em seguida, precisamos remover o if ( $query->query['post_type'] != $post_type ) return; doença.

 add_action( 'pre_get_posts', 'extend_front_search' ); function extend_front_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( is_admin() ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

Só precisamos manter a condição if( is_admin() ) return; para garantir que o código seja aplicado apenas no front-end e estamos prontos para ir.

Uma estratégia alternativa

Outra maneira de estender a pesquisa do WordPress para incluir campos personalizados é alterando a consulta SQL.

A classe WP_Query ajuda você com isso dividindo-a em pedaços conforme descrito na linha 2897 do arquivo wp-includes/class-wp-query.php .

 $clauses = (array) apply_filters_ref_array( 'posts_clauses_request', array( compact( $pieces ), &$this ) ); $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; $groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : ''; $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; $orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : ''; $distinct = isset( $clauses['distinct'] ) ? $clauses['distinct'] : ''; $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; $limits = isset( $clauses['limits'] ) ? $clauses['limits'] : '';

Como mencionamos anteriormente nos artigos de campos personalizados, todos os dados de campos personalizados são armazenados no banco de dados na tabela 'postmeta' que não está incluída na pesquisa do WordPress por padrão. Então nosso primeiro passo é unir essas duas tabelas usando o código abaixo:

 function join_meta_table( $join ) { global $wpdb; if ( is_search() ) { $join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '..post_id '; } return $join; } add_filter('posts_join', 'join_meta_table' );

Nós usamos o hook posts_join , é claro, pois ele filtra a cláusula JOIN da consulta.

Em seguida, usaremos o gancho posts_where para alterar a parte WHERE da consulta para atender às nossas necessidades.

 function modify_where_clause( $where ) { global $pagenow, $wpdb; if ( is_search() ) { $where = preg_replace( "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/", "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where ); } return $where; } add_filter( 'posts_where', 'modify_where_clause' );

Por último, mas não menos importante, precisamos evitar duplicatas. Para conseguir isso, usamos o gancho posts_distinct que filtra a cláusula DISTINCT da consulta.

 function prevent_duplicates( $where ) { global $wpdb; if ( is_search() ) { return "DISTINCT"; } return $where; } add_filter( 'posts_distinct', 'prevent_duplicates' );

Agora vamos ver o que acontece no frontend se procurarmos pela string “wordpress.org”.

pesquisa wordpress no front end

Como esperado, os resultados estão corretos desta vez. A pesquisa do WordPress encontrou “post 1” como resultado, pois contém o campo 'source' com o valor 'https://dev. wordpress.org /reference/functions/add_post_meta/

Tipos de postagem personalizados nos resultados de pesquisa do WordPress

Outra coisa que você pode querer fazer é tornar os tipos de postagem personalizados pesquisáveis ​​(se você não tiver certeza de como criar um tipo de postagem personalizado, verifique nossos artigos sobre isso aqui).

Vamos imaginar que criamos um tipo de postagem personalizado chamado 'livros' e queremos que esse tipo de postagem apareça nos resultados da pesquisa. Desta vez, não precisamos recriar a consulta SQL, mas apenas redefinir os tipos de postagem no gancho pre_get_posts , conforme descrito abaixo. O código deve ser colocado novamente no arquivo functions.php .

 function tg_include_custom_post_types_in_search_results( $query ) { if ( $query->is_main_query() && $query->is_search() && ! is_admin() ) { $query->set( 'post_type', array( 'post', 'books' ) ); } } add_action( 'pre_get_posts', 'tg_include_custom_post_types_in_search_results' );

O que fizemos aqui foi adicionar os tipos de postagem desejados para serem incluídos nos resultados da pesquisa como argumentos para o gancho post_type .

Se você deseja excluir um tipo, basta removê-lo do array.

Conclusão

Melhorar a pesquisa em seu site WordPress pode ser muito útil e uma grande economia de tempo. Para o seu usuário final, também é importante que ele possa pesquisar por tipos de postagem personalizados e também por campos personalizados. Espero que as instruções acima tenham lhe dado uma visão de como conseguir isso em seu próprio site.