Filtro e Seletor para categoria em resultado de busca - Wordpress
Olá pessoal.
O site do meu cliente tinha um problema nas buscas, como mostra a imagem:
Na barra lateral, essa busca era filtrada pelo plugin Search & Filter com a opção de selecionar as categorias de Custom Post Types criadas com o ACF e CPT UI.
A questão é que mesmo havendo vários posts com a palavra chave relacionada "olfato", somente uma publicação aparecia.
Aparentemente, um conflito entre os plugins gerou a falha e consegui corrigir usando o ACF: Better Search.
Só que nessa, ainda não mostrava também os resultados para publicações que constavam a palavra-chave somente em campos personalizados e perdemos a filtragem e o seletor (feito pelo Search & Filter).
Consegui resolver a busca. O post "Teste para busca" tem a palavra-chave somente no campo personalizado.
Mostrar as categorias de publicações do CPT UI, consegui resolver com o o Plugin Custom Post Types Widget.
Agora, preciso filtrar a amostragem dessas categorias de acordo com os resultados de busca e ter um seletor, para que o usuário possa selecionar um ou mais categorias e mostrar apenas os posts relacionados a elas.
Eu encontrei esse código que aprimora os resultados da busca nativa do wordpress, mas não encontro o arquivo onde eu devo colocar esse código. Quando eu fiz as alterações tanto no arquivo seach.php quanto functions.php, o site quebrou. Não faço ideia se errei os parâmetros, argumentos ou o que fiz de errado. (novato)
Essa é a página onde aparecem os resultados:
[https://geroprodev.dbai.com.br/?s=olfato&post_type[]=post&post_type[]=page&post_type[]=acervo&post_type[]=produtos&post_type[]=projetos&post_type[]=evento&fs=1](https://geroprodev.dbai.com.br/?s=olfato&post_type%5B%5D=post&post_type%5B%5D=page&post_type%5B%5D=acervo&post_type%5B%5D=produtos&post_type%5B%5D=projetos&post_type%5B%5D=evento&fs=1)
Essa é a página de busca:
https://geroprodev.dbai.com.br/busca-teste/
Esse é o link código que encontrei no Github para extender a pesquisa nativa com o Search & Filter que eu quero usar como referência (que eu não encontrei onde vou incluir esse código):
https://support.searchandfilter.com/forums/topic/compatibility-with-acf-better-search/
https://gist.github.com/fiskhandlarn/f6f86c99e59f62d72ac2ce10be12dc1a/
☼ IMPORTANTE ☼
O tema utilizado é o Avada.
Mesmo com vários plugins sendo indicados para resolver esse problema, neste caso, nenhum deles resolveu.
A solução mais simples que encontrei foi usar a "Search CPT" e o plugin ACF: Better Search.
O que eu não encontrei em nenhuma pasta do CPT foi o arquivo search.php ou relacionado.
E esse é o código:
<?php
/*
##############################
########### Search ###########
##############################
Included are steps to help make this script easier for other to follow
All you have to do is add custom ACF post types into Step 1 and custom taxonomies into Step 10
I also updated this work to include XSS and SQL injection projection
[list_searcheable_acf list all the custom fields we want to include in our search query]
@return [array] [list of custom fields]
*/
// Define list of ACF fields you want to search through - do NOT include taxonomies here
function list_searcheable_acf(){
$list_searcheable_acf = array( "your",
"acf",
"non-repeater",
"field-names",
"here",
"repeater" => array( "repeater-sub-field1",
"repeater-sub-field2" )
);
return $list_searcheable_acf;
}
/*
* [advanced_custom_search search that encompasses ACF/advanced custom fields and taxonomies and split expression before request]
* @param [query-part/string] $search [the initial "where" part of the search query]
* @param [object] $wp_query []
* @return [query-part/string] $search [the "where" part of the search query as we customized]
* modified from gist: https://gist.github.com/FutureMedia/9581381/73afa809f38527d57f4213581eeae6a8e5a1340a
* see https://vzurczak.wordpress.com/2013/06/15/extend-the-default-wordpress-search/
* credits to Vincent Zurczak for the base query structure/spliting tags section and Sjouw for comment cleanup*/
function advanced_custom_search( $search, $wp_query ) {
global $wpdb;
if ( empty( $search )) {
return $search;
}
// 1- get search expression
$terms_raw = $wp_query->query_vars[ 's' ];
// 2- check search term for XSS attacks
$terms_xss_cleared = strip_tags($terms_raw);
// 3- do another check for SQL injection, use WP esc_sql
$terms = esc_sql($terms_xss_cleared);
// 4- explode search expression to get search terms
$exploded = explode( ' ', $terms );
if( $exploded === FALSE || count( $exploded ) == 0 ) {
$exploded = array( 0 => $terms );
}
// 5- setup search variable as a string
$search = '';
// 6- get searcheable_acf, a list of advanced custom fields you want to search content in
$list_searcheable_acf = list_searcheable_acf();
// 7- get custom table prefixes, thanks to Brian Douglas @bmdinteractive on github for this improvement
$table_prefix = $wpdb->prefix;
// 8- search through tags, inject each into SQL query
foreach( $exploded as $tag ) {
$search .= "
AND (
(".$table_prefix."posts.post_title LIKE '%$tag%')
OR (".$table_prefix."posts.post_excerpt LIKE '%$tag%')
OR (".$table_prefix."posts.post_content LIKE '%$tag%')
".
// 9- Adds to $search DB data from custom post types
"OR EXISTS (
SELECT * FROM ".$table_prefix."postmeta
WHERE post_id = ".$table_prefix."posts.ID
AND (";
// 9b - reads through $list_searcheable_acf array to see which custom post types you want to include in the search string
$metaStatements = array();
foreach ($list_searcheable_acf as $key => $searcheable_acf) {
if ( is_array( $searcheable_acf ) ) {
foreach ( $searcheable_acf as $repeater_acf ) {
array_push( $metaStatements, "(meta_key LIKE '" . $key . "_%_" . $repeater_acf . "' AND meta_value LIKE '%$tag%')" );
}
}
else {
array_push( $metaStatements, "(meta_key = '" . $searcheable_acf . "' AND meta_value LIKE '%$tag%')" );
}
}
$search .= join( $metaStatements, "\n OR " );
$search .= ")
)".
// 10- Adds to $search DB data from comments
"OR EXISTS (
SELECT * FROM ".$table_prefix."comments
WHERE comment_post_ID = ".$table_prefix."posts.ID
AND comment_content LIKE '%$tag%'
)".
// 11 - Adds to $search DB data from taxonomies
"OR EXISTS (
SELECT * FROM ".$table_prefix."terms
INNER JOIN ".$table_prefix."term_taxonomy
ON ".$table_prefix."term_taxonomy.term_id = ".$table_prefix."terms.term_id
INNER JOIN ".$table_prefix."term_relationships
ON ".$table_prefix."term_relationships.term_taxonomy_id = ".$table_prefix."term_taxonomy.term_taxonomy_id".
// 11b- Add custom taxonomies here
" WHERE (
taxonomy = 'your'
OR taxonomy = 'custom'
OR taxonomy = 'taxonomies'
OR taxonomy = 'here'
)
AND object_id = ".$table_prefix."posts.ID
AND ".$table_prefix."terms.name LIKE '%$tag%'
)".
")"; // closes $search
} // closes foreach
return $search;
} // closes function advanced_custom_search
// 12- use add_filter to put advanced_custom_search into the posts_search results
add_filter( 'posts_search', 'advanced_custom_search', 500, 2 );
Preciso entender como modificar esses argumentos e onde é que vou inserir as categorias/subcategorias dos Custom Post Types e como filtrar nessa aba lateral.
É possível fazer isso usando o próprio Custom Post Type Widget? Faço pela busca nativa ou pela busca do CPT?
Obrigado desde já!Discussão (0)
Carregando comentários...