Eu preciso fazer um WP_Query
com um LIKE
no post_title
.
Comecei com este regular WP_Query
:
$wp_query = new WP_Query(
array (
'post_type' => 'wp_exposants',
'posts_per_page' => '1',
'post_status' => 'publish',
'orderby' => 'title',
'order' => 'ASC',
'paged' => $paged
)
);
Mas o que eu realmente quero fazer se parece com isso no SQL:
$query = "
SELECT *
FROM $wpdb->posts
WHERE $wpdb->posts.post_title LIKE '$param2%'
AND $wpdb->posts.post_type = 'wp_exposants'
ORDER BY $wpdb->posts.post_title
";
$wpdb->get_results($query);
A saída imprime os resultados que estou esperando, mas uso o regular <?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
para exibir os resultados.
E isso não está funcionando $wpdb->get_results()
.
Como posso conseguir o que descrevi aqui?
$wpdb->prepare()
.prepare()
.$wpdb->prepare('LIKE "%s%%"', 'banana')
retornaria"LIKE ''banana'%'"
, então temos que construir a consulta nós mesmos e fazer a fuga também.prepare()
. Sim, isso é complicado e eu tive que tentar isso várias vezes, antes de contornar isso. De algo que eu só fiz:$wpdb->prepare( ' AND {$wpdb->posts}.post_title LIKE %s ', esc_sql( '%'.like_escape( trim( $term ) ).'%' ) )
. E tenho certeza de que issoesc_sql()
é desnecessário e apenas paranóico.'
(apóstrofo) dentro. Eu acho que é por causa de escapar? Eu não encontrar a solução aindaSimplificado:
fonte
Queria atualizar esse código em que vocês trabalharam para o wordpress 4.0 e superior, pois esc_sql () está obsoleto no 4.0 mais alto.
O resto das coisas é o mesmo.
Também quero salientar que você pode usar a variável s nos argumentos WP_Query para passar os termos de pesquisa, que também procurarão pelo título da postagem em que acredito.
Como isso:
fonte
search_prod_title
é? Devo mudar isso para outra coisa?esc_sql
privado? Não é.$wpdb->escape
é embora ... developer.wordpress.org/reference/functions/esc_sqlCom algumas soluções vulneráveis postadas aqui, eu venho com uma versão um pouco simplificada e higienizada.
Primeiro, criamos uma função para o
posts_where
filtro, que permite mostrar apenas postagens que correspondem a condições específicas:Agora adicionamos
cc_search_post_title
em nossos argumentos de consulta:E, finalmente, envolva o filtro em torno da consulta:
Usando get_posts ()
Certas funções que recuperam postagens não executam filtros, portanto, as funções de filtro posts_where que você anexa não modificam a consulta. Se você planeja usar
get_posts()
para consultar suas postagens, definasuppress_filters
como false na sua matriz de argumentos:Agora você pode usar
get_posts()
:E o
s
parâmetro?O
s
parâmetro está disponível:Ao adicionar seu termo de pesquisa ao
s
parâmetro work e ele pesquisará o título da postagem, ele também pesquisará o conteúdo da publicação.E o
title
parâmetro que foi adicionado com o WP 4.4?Passando um termo de pesquisa para o
title
parâmetro:É sensível a maiúsculas e
LIKE
, não%LIKE%
. Isso significa que a pesquisa porhello
não retornará post com títuloHello World
ouHello
.fonte
Com base em outras respostas diante de mim, para fornecer flexibilidade na situação em que você deseja pesquisar uma postagem que contenha uma palavra em um meta-campo OU no título da publicação, ofereço essa opção através do argumento "title_filter_relation". Nesta implementação, permito apenas entradas "OR" ou "AND" com o padrão "AND".
Aqui está um exemplo do código em ação para um tipo de postagem muito simples "faq", em que a pergunta é o próprio título da postagem:
fonte
WP_Query
poder acessá-las noposts_where
filtro.