WP_Query com "Post_Title como" algo% '"?
5 respostas
- votos
-
- 2011-05-30
Eu resolveriaisso com umfiltroem
WP_Query
.Um que detecta uma variável de consultaextrae usaisso como oprefixo dotítulo.add_filter( 'posts_where', 'wpse18703_posts_where', 10, 2 ); function wpse18703_posts_where( $where, &$wp_query ) { global $wpdb; if ( $wpse18703_title = $wp_query->get( 'wpse18703_title' ) ) { $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'' . esc_sql( $wpdb->esc_like( $wpse18703_title ) ) . '%\''; } return $where; }
Destaforma,você aindapode ligar
WP_Query
,você acabou depassar otítulo como owpse18703_title
argumento (ou alterar onomepara algomais curto).I would solve this with a filter on
WP_Query
. One that detects an extra query variable and uses that as the prefix of the title.add_filter( 'posts_where', 'wpse18703_posts_where', 10, 2 ); function wpse18703_posts_where( $where, &$wp_query ) { global $wpdb; if ( $wpse18703_title = $wp_query->get( 'wpse18703_title' ) ) { $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'' . esc_sql( $wpdb->esc_like( $wpse18703_title ) ) . '%\''; } return $where; }
This way you can still call
WP_Query
, you just pass the title as thewpse18703_title
argument (or change the name to something shorter).-
Este é de algumaformaperdendo o `$ WPDB->preparar ()`) `This one is somehow missing the `$wpdb->prepare()`.
- 1
- 2012-11-06
- kaiser
-
@KAISER: Fazmuitotempo,mas acho queissonãofoipossível com 'Prepare () `).`$ WPDB-> Preparar ('como"% s %% "',"banana ")" retornaria "" como "banana"% "" `,entãotemos que construir a consultae fugirtambém.@kaiser: It's been a long time, but I think this was not possible with `prepare()`. `$wpdb->prepare('LIKE "%s%%"', 'banana')` would return `"LIKE ''banana'%'"`, so we have to construct the query ourselves, and do the escaping too.
- 0
- 2012-11-06
- Jan Fabry
-
@Janfabyfelizem te ver agaaaaaaain!:) cairno chat algumtempo,hm?Aparadaficariafelizem vê-lo.Sobreisso "prepare ()".Sim,isso é complicadoe eutive quetentarisso várias vezes,antes de chegarporperto.De algo que acabei defazer: `$ WPDB-> Preparar ('e {$ WPDB-> Posts} .post_title como% s',ESC_SQL ('%'. Like_escape (trim)). '%'))`.Etenho certeza que o `ESC_SQL () é desnecessárioe apenasparanóico.@JanFabry Happy to see you agaaaaaaaain! :) Drop by in chat some time, hm? StopPress would be happy to see you. About that `prepare()`. Yeah, that's tricky and I had to try that several times, before I got around it. From something I just made: `$wpdb->prepare( ' AND {$wpdb->posts}.post_title LIKE %s ', esc_sql( '%'.like_escape( trim( $term ) ).'%' ) )`. And I'm pretty sure the `esc_sql()` is unnecessary and just paranoid.
- 1
- 2012-11-07
- kaiser
-
Parece que vocênãopodeprocurar uma string com `` `(apomstophe) dentro.Eu acho que épor causa deescapar?Eunãoencontrei a solução aindaIt seems that you can't search a string with `'` (apostrophe) inside. I guess it's because of escaping ? I didn't find the solution yet
- 0
- 2018-08-30
- Vincent Decaux
-
- 2013-04-19
simplificado:
function title_filter( $where, &$wp_query ) { global $wpdb; // 2. pull the custom query in here: if ( $search_term = $wp_query->get( 'search_prod_title' ) ) { $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'%' . esc_sql( like_escape( $search_term ) ) . '%\''; } return $where; } $args = array( 'post_type' => 'product', 'posts_per_page' => $page_size, 'paged' => $page, // 1. define a custom query var here to pass your term through: 'search_prod_title' => $search_term, 'post_status' => 'publish', 'orderby' => 'title', 'order' => 'ASC' ); add_filter( 'posts_where', 'title_filter', 10, 2 ); $wp_query = new WP_Query($args); remove_filter( 'posts_where', 'title_filter', 10 ); return $wp_query;
Simplified:
function title_filter( $where, &$wp_query ) { global $wpdb; // 2. pull the custom query in here: if ( $search_term = $wp_query->get( 'search_prod_title' ) ) { $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'%' . esc_sql( like_escape( $search_term ) ) . '%\''; } return $where; } $args = array( 'post_type' => 'product', 'posts_per_page' => $page_size, 'paged' => $page, // 1. define a custom query var here to pass your term through: 'search_prod_title' => $search_term, 'post_status' => 'publish', 'orderby' => 'title', 'order' => 'ASC' ); add_filter( 'posts_where', 'title_filter', 10, 2 ); $wp_query = new WP_Query($args); remove_filter( 'posts_where', 'title_filter', 10 ); return $wp_query;
-
Porfavor,inclua umaexplicaçãojunto com o seu código.Please include an explanation along with your code.
- 13
- 2013-04-19
- s_ha_dum
-
Ótima simplificaçãoGreat simplification
- 2
- 2014-11-10
- Timo Huovinen
-
Código é queeu acho queexplicou,pelomenospormim.Obrigadopor compartilhar o script completo.Code is i think self explained, atleast for me. Thanks for sharing complete script.
- 2
- 2017-08-08
- Hassan Dad Khan
-
Use '$ wpdb->esc_like ('em vez de 'esc_sql (like_escape ('Use '$wpdb->esc_like (' instead of 'esc_sql( like_escape('
- 2
- 2018-02-19
- fdrv
-
@fdrv Vocêestá certo,mas de acordo com o WP Docs $ WPDB-> Esc_Like aindaprecisa de ESC_SQL ().Entãoeu acho que o código correto seriaesc_sql ($ wpdb->esc_like ($ Search_term))@fdrv You are right but according to wp docs $wpdb->esc_like still need esc_sql(). So I think the correct code would be esc_sql( $wpdb->esc_like( $search_term ) )
- 0
- 2019-10-18
- Waqas Bukhary
-
`like_escape 'depreciado 4.0.0 use` wpdb ::esc_like``like_escape` deprecated 4.0.0 Use `wpdb::esc_like`
- 0
- 2020-03-14
- Empty Brain
-
`remove_filter só usa 3 argumentos,o últimopode ser removido.`remove_filter` only uses 3 arguments, the last one can be removed.
- 2
- 2020-06-24
- Skatox
-
- 2015-01-02
queria atualizareste código que vocêstrabalharampara o WordPress 4.0e acima como Esc_SQL () é reprovadoem 4.0maior.
function title_filter($where, &$wp_query){ global $wpdb; if($search_term = $wp_query->get( 'search_prod_title' )){ /*using the esc_like() in here instead of other esc_sql()*/ $search_term = $wpdb->esc_like($search_term); $search_term = ' \'%' . $search_term . '%\''; $where .= ' AND ' . $wpdb->posts . '.post_title LIKE '.$search_term; } return $where; }
resto domaterial é omesmo.
Também quero dizer que vocêpode usar s variável dentro de argumentos WP_Queryparapassar ostermos depesquisa,quetambémprocurarápelotítulo dapostagem queeu acredito.
assim:
$args = array( 'post_type' => 'post', 's' => $search_term, 'post_status' => 'publish', 'orderby' => 'title', 'order' => 'ASC' ); $wp_query = new WP_Query($args);
Wanted to update this code you guys worked on for the wordpress 4.0 and above as esc_sql() is deprecated in 4.0 higher.
function title_filter($where, &$wp_query){ global $wpdb; if($search_term = $wp_query->get( 'search_prod_title' )){ /*using the esc_like() in here instead of other esc_sql()*/ $search_term = $wpdb->esc_like($search_term); $search_term = ' \'%' . $search_term . '%\''; $where .= ' AND ' . $wpdb->posts . '.post_title LIKE '.$search_term; } return $where; }
Rest of the stuff is same.
Also I want to point out you can use s variable within WP_Query arguments to pass search terms, which will also search for post title i believe.
Like this:
$args = array( 'post_type' => 'post', 's' => $search_term, 'post_status' => 'publish', 'orderby' => 'title', 'order' => 'ASC' ); $wp_query = new WP_Query($args);
-
O queexatamente "search_prod_title" é?Devomudarissopara outra coisa?What exactly `search_prod_title` is? Should i change this to something else?
- 0
- 2017-03-24
- Antonios Tsimourtos
-
Desde quando é "esc_sql"privado?Não é.`$ WPDB->escape 'éembora ... https://developer.wordpress.org/reference/functions/esc_sql/Since when is `esc_sql` depricated? It's not. `$wpdb->escape` is though... https://developer.wordpress.org/reference/functions/esc_sql/
- 0
- 2018-02-02
- Jeremy
-
Observe que oparâmetro Sbusca o conteúdo doposttambém,quepodenão ser o objetivo desejado.=)Note that the s parameter searches the post content as well, which may not be the desired aim. =)
- 1
- 2018-04-19
- Christine Cooper
-
`like_escape 'depreciado` 4.0.0` Use `WPDB :: Esc_like``like_escape` deprecated `4.0.0` Use `wpdb::esc_like`
- 0
- 2020-03-14
- Empty Brain
-
- 2018-04-19
Com alguma solução vulnerávelpostada aqui,eu venho com uma versão simplificadae sanitizada.
Primeiro,criamos umafunçãopara ofiltro
posts_where
quepermitemostrar apenaspostagens correspondentes condiçõesespecíficas:function cc_post_title_filter($where, &$wp_query) { global $wpdb; if ( $search_term = $wp_query->get( 'cc_search_post_title' ) ) { $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'%' . $wpdb->esc_like( $search_term ) . '%\''; } return $where; }
Agora adicionamos
cc_search_post_title
em nossos argumentos de consulta:$args = array( 'cc_search_post_title' => $search_term, // search post title only 'post_status' => 'publish', );
e finalmenteenrole ofiltro ao redor da consulta:
add_filter( 'posts_where', 'cc_post_title_filter', 10, 2 ); $query = new WP_Query($args); remove_filter( 'posts_where', 'cc_post_title_filter', 10 );
usandoget_posts ()
Certasfunções que recuperampostsnãoexecutamfiltros,portanto,ofiltro Posts_where que você anexanãomodificará a consulta. Se vocêplaneja usar
get_posts()
para consultar suaspostagens,vocêprecisa definirsuppress_filters
parafalseem suamatriz de argumentos:$args = array( 'cc_search_post_title' => $search_term, 'suppress_filters' => FALSE, 'post_status' => 'publish', );
Agora vocêpode usar
get_posts()
:add_filter( 'posts_where', 'cc_post_title_filter', 10, 2 ); $posts = get_posts($args); remove_filter( 'posts_where', 'cc_post_title_filter', 10 );
E quanto aoparâmetro
s
?Oparâmetro
s
está disponível:$args = array( 's' => $search_term, );
Ao adicionar seutermo depesquisanotrabalho
s
parâmetroe eleiráprocurarnotítulo dapostagem,eletambém será Pesquisar o conteúdo dopost.O que acontece com oparâmetro
title
quefoi adicionado com WP 4.4?Passando umtermo depesquisanotítulo
title
parâmetro:$args = array( 'title' => $search_term, );
diferenciamaiúsculase minúsculase
LIKE
,não%LIKE%
. Estapesquisamédiaparahello
não retornarápost comtítuloHello World
ouhello
.With some vulnerable solution posted here, I come with a bit simplified and sanitized version.
First, we create a function for the
posts_where
filter which allows you to only show posts matching specific conditions:function cc_post_title_filter($where, &$wp_query) { global $wpdb; if ( $search_term = $wp_query->get( 'cc_search_post_title' ) ) { $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'%' . $wpdb->esc_like( $search_term ) . '%\''; } return $where; }
Now we add
cc_search_post_title
into our query arguments:$args = array( 'cc_search_post_title' => $search_term, // search post title only 'post_status' => 'publish', );
And finally wrap the filter around the query:
add_filter( 'posts_where', 'cc_post_title_filter', 10, 2 ); $query = new WP_Query($args); remove_filter( 'posts_where', 'cc_post_title_filter', 10 );
Using get_posts()
Certain functions which retrieve posts do not run filters, so the posts_where filter functions you attach will not modify the query. If you plan to use
get_posts()
to query your posts, you need to setsuppress_filters
to false in your argument array:$args = array( 'cc_search_post_title' => $search_term, 'suppress_filters' => FALSE, 'post_status' => 'publish', );
Now you can use
get_posts()
:add_filter( 'posts_where', 'cc_post_title_filter', 10, 2 ); $posts = get_posts($args); remove_filter( 'posts_where', 'cc_post_title_filter', 10 );
What about the
s
parameter?The
s
parameter is available:$args = array( 's' => $search_term, );
While adding your search term into the
s
parameter work and it will search the post title, it will also search the post content.What about the
title
parameter which was added with WP 4.4?Passing a search term into the
title
parameter:$args = array( 'title' => $search_term, );
Is case sensitive and
LIKE
, not%LIKE%
. This mean search forhello
will not return post with titleHello World
orHello
.-
Excelente.Euestavaprocurandopor 'post_title' comoparâmetroe,obviamente,nãoencontrounada.Excellent. I was looking for 'post_title' as a parameter and, obviously, didn't find anything.
- 0
- 2019-09-13
- MastaBaba
-
Estou recebendo umerro com a consulta WP ou recebopostagens: "Erroe_warningno arquivo» Classe-WP-Hook.php «na linha 288: Parâmetro 2para CC_Post_Title_Filter ()esperadopara ser uma referência,valorfornecidoI'm getting an error with wp query or get posts: "E_WARNING Error in file »class-wp-hook.php« at line 288: Parameter 2 to cc_post_title_filter() expected to be a reference, value given
- 0
- 2020-03-03
- Elkrat
-
@Elkrat Remover o `&`frome $ wp_query`em `cc_post_title_filter`.@Elkrat Remove the `&` from `&$wp_query` in `cc_post_title_filter`.
- 0
- 2020-05-05
- Mattimator
-
- 2015-04-28
Construindoem outras respostas antes demim,parafornecerflexibilidadena situaçãoem que você desejapesquisar umpost que contém umapalavraem um campo demeta ounotítulo dopost,eu douessa opção através do argumento "title_filter_relation". Nestaimplementação,eu sópermito "ou" ou "e"insumos com umpadrão de "e."
function title_filter($where, &$wp_query){ global $wpdb; if($search_term = $wp_query->get( 'title_filter' )){ $search_term = $wpdb->esc_like($search_term); //instead of esc_sql() $search_term = ' \'%' . $search_term . '%\''; $title_filter_relation = (strtoupper($wp_query->get( 'title_filter_relation'))=='OR' ? 'OR' : 'AND'); $where .= ' '.$title_filter_relation.' ' . $wpdb->posts . '.post_title LIKE '.$search_term; } return $where; }
Aquiestá umexemplo do códigoem açãopara umtipo depostagemmuito simples "FAQ",onde a questão é oprópriotítulo:
add_filter('posts_where','title_filter',10,2); $s1 = new WP_Query( array( 'post_type' => 'faq', 'posts_per_page' => -1, 'title_filter' => $q, 'title_filter_relation' => 'OR', 'post_status' => 'publish', 'orderby' => 'title', 'order' => 'ASC', 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'faq_answer', 'value' => $q, 'compare' => 'LIKE' ) ) )); remove_filter('posts_where','title_filter',10,2);
Building on other answers before me, to provide flexibility in the situation where you want to search a post that contains a word in a meta field OR in the title of the post, I give that option via the argument "title_filter_relation." In this implementation, I only allow for "OR" or "AND" inputs with a default of "AND."
function title_filter($where, &$wp_query){ global $wpdb; if($search_term = $wp_query->get( 'title_filter' )){ $search_term = $wpdb->esc_like($search_term); //instead of esc_sql() $search_term = ' \'%' . $search_term . '%\''; $title_filter_relation = (strtoupper($wp_query->get( 'title_filter_relation'))=='OR' ? 'OR' : 'AND'); $where .= ' '.$title_filter_relation.' ' . $wpdb->posts . '.post_title LIKE '.$search_term; } return $where; }
Here's an example of the code in action for a very simple post type "faq" where the question is the post title itself:
add_filter('posts_where','title_filter',10,2); $s1 = new WP_Query( array( 'post_type' => 'faq', 'posts_per_page' => -1, 'title_filter' => $q, 'title_filter_relation' => 'OR', 'post_status' => 'publish', 'orderby' => 'title', 'order' => 'ASC', 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'faq_answer', 'value' => $q, 'compare' => 'LIKE' ) ) )); remove_filter('posts_where','title_filter',10,2);
-
Boa visão,adicionandopersonalizado "consulta VARS"para o consulta ARGSpassoupara "WP_Query"parapoder acessá-los dentro dofiltro "Posts_where`.Good insight, adding custom "query vars" to the query args passed to `WP_Query` in order to be able to access them within the `posts_where` filter.
- 1
- 2017-02-04
- Tom Auger
Euprecisofazer um
wp_query
com umcomo
nopost_title
.Eu comecei comeste :
Mas o queeu realmente querofazerparece comissono SQL:
A saídaimprime os resultados queeuestou comexcpectando,mas uso o
& lt;?php while ($ wp_query- > heve_posts ()): $ WP_Query- >the_post ();? >
paraexibir os resultados.Eissonãoestáfuncionando com
$ wpdb- >get_results ()
.Comoposso alcançar o queeu descrevi aqui?