Cerca che guarderà nel campo personalizzato, nel titolo del post e nel contenuto del post
1 risposta
- voti
-
- 2013-05-17
Innanzitutto,non utilizzare
query_posts
.Secondo,puoipassare unparametro
s
per ottenere lamaggiorparte delpercorso.$program_search='test'; $ args=array ( 'post_type'=> 'programma', 's'=> $program_search, 'meta_query'=> Vettore( Vettore( "key"=> "parole chiave", "value"=> $program_search, "compare"=> 'PIACE' ), ) ); $t=nuovo WP_Query ($ args); var_dump ($t- > richiesta);
Questoparametro
s
mette in attoi normalimeccanismi di ricercae iltitoloe il contenuto vengono ricercati. Seguardi la querygenerata vedrai ...SELEZIONA SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON (wp_posts.ID=wp_postmeta.post_id) DOVE 1=1 AND (((wp_posts.post_title LIKE '%test%') OR (wp_posts.post_content LIKE '%test%'))) AND (wp_posts.post_password='') AND wp_posts.post_type="programma" AND (wp_posts.post_status='pubblica') AND ((wp_postmeta.meta_key='keywords' AND CAST (wp_postmeta.meta_value AS CHAR) LIKE '%test%')) GROUP BY wp_posts.ID ORDINA PER wp_posts.post_date DESC LIMITE 0,5 È lamaggiorparte di ciò che desideri. Il
LIMIT
senon diversamente specificato èil limiteimpostatoin wp-admin-> Settings-> General. Tuttavia,c'è unproblema.AND ((wp_postmeta.meta_key='keywords' AND CAST (wp_postmeta.meta_value AS CHAR) LIKE '%test%'))
Sono abbastanza sicuro chetu voglia che sia
OR ((wp_postmeta.meta_key ...
e lo vuoi davvero conpost_title
epost_content
anche. Qualcosa di simile:AND ( ( (wp_posts.post_title MI PIACE '%test%') O (wp_posts.post_content LIKE '%test%') O (wp_postmeta.meta_key='parole chiave' E CAST (wp_postmeta.meta_value AS CHAR) COME '%test%') ) )
WP_Query
non lofarà quindi dobbiamofarlo con alcunifiltri. Prova di concetto:funzione add_join_wpse_99849 ($join) { global $ wpdb; return $ si unisce. "INNER JOIN {$ wpdb- >postmeta} ON ({$ wpdb- >posts} .ID={$ wpdb- >postmeta} .post_id)"; } funzione alter_search_wpse_99849 ($ search,$ qry) { global $ wpdb; $ add=$ wpdb- >prepare ("({$ wpdb- >postmeta} .meta_key='keywords' AND CAST ({$ wpdb- >postmeta} .meta_value AS CHAR) LIKE '%%% s %% ') ",$ qry- >get (' s ')); $pat='| \ (\ ((. +) \) \)|'; $ ricerca=preg_replace ($pat,'(($ 1 OR'. $ add. '))',$ ricerca); return $ ricerca; } $program_search='test'; $ args=array ( 'post_type'=> 'programma', 's'=> $ ricerca_programma ); add_filter ('posts_join','add_join_wpse_99849'); add_filter ('posts_search','alter_search_wpse_99849',1,2); $t=nuovo WP_Query ($ args); remove_filter ('posts_join','add_join_wpse_99849'); remove_filter ('posts_search','alter_search_wpse_99849',1,2); //scarica alcuni dati var_dump ($t- > richiesta); var_dump ($t- >posts);
Sinoti che hotralasciato completamente la
meta_query
e ho ampiamente duplicato lafunzionalità. Questoperimpedire lagenerazione di queifastidiosiAND
.Stai applicandoe rimuovendoimmediatamente queifiltriin modo chenoninterferiscano con altre query. Esistono altrimodipertenereilfiltrofuorimano o altre query. Uno di questimetodi è descritto qui . Puoi anche aggiungere
remove_filter
al callbackadd_filter
perfarein modo che si rimuovano automaticamente da soli.First, don't use
query_posts
.Second, you can pass an
s
parameter to get most of the way there.$program_search = 'test'; $args = array( 'post_type' => 'program', 's' => $program_search, 'meta_query' => array( array( 'key' => 'keywords', 'value' => $program_search, 'compare' => 'LIKE' ), ) ); $t = new WP_Query($args); var_dump($t->request);
That
s
parameter kicks the ordinary search mechanisms into place and the title and the content gets searched. If you look at that generated query you will see...SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) WHERE 1=1 AND (((wp_posts.post_title LIKE '%test%') OR (wp_posts.post_content LIKE '%test%'))) AND (wp_posts.post_password = '') AND wp_posts.post_type = 'program' AND (wp_posts.post_status = 'publish') AND ((wp_postmeta.meta_key = 'keywords' AND CAST(wp_postmeta.meta_value AS CHAR) LIKE '%test%')) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 5
That is most of what you want. The
LIMIT
unless otherwise specified is the limit set at wp-admin->Settings->General. There is a problem though.AND ((wp_postmeta.meta_key = 'keywords' AND CAST(wp_postmeta.meta_value AS CHAR) LIKE '%test%'))
I am pretty sure you want that to be
OR ((wp_postmeta.meta_key ...
and you really want it up with thepost_title
and thepost_content
too. Something like this:AND ( ( (wp_posts.post_title LIKE '%test%') OR (wp_posts.post_content LIKE '%test%') OR (wp_postmeta.meta_key = 'keywords' AND CAST(wp_postmeta.meta_value AS CHAR) LIKE '%test%') ) )
WP_Query
won't do that so we have to make it with some filters. Proof of concept:function add_join_wpse_99849($joins) { global $wpdb; return $joins . " INNER JOIN {$wpdb->postmeta} ON ({$wpdb->posts}.ID = {$wpdb->postmeta}.post_id)"; } function alter_search_wpse_99849($search,$qry) { global $wpdb; $add = $wpdb->prepare("({$wpdb->postmeta}.meta_key = 'keywords' AND CAST({$wpdb->postmeta}.meta_value AS CHAR) LIKE '%%%s%%')",$qry->get('s')); $pat = '|\(\((.+)\)\)|'; $search = preg_replace($pat,'(($1 OR '.$add.'))',$search); return $search; } $program_search = 'test'; $args = array( 'post_type' => 'program', 's' => $program_search ); add_filter('posts_join','add_join_wpse_99849'); add_filter('posts_search','alter_search_wpse_99849',1,2); $t = new WP_Query($args); remove_filter('posts_join','add_join_wpse_99849'); remove_filter('posts_search','alter_search_wpse_99849',1,2); // dump some data var_dump($t->request); var_dump($t->posts);
Notice that I left out the
meta_query
altogether and largely duplicated the functionality. That is to keep that troublesomeAND
from being generated.You are applying and immediately removing those filters so they do not interfere with any other queries. There are other ways to keep the filter out of the way or other queries. One such method is outlined here. You can also add the
remove_filter
to theadd_filter
callback to have them automatically remover themselves.-
Puoi spiegareperché NON usare query_posts?Can you explain why NOT to use query_posts?
- 0
- 2018-10-12
- Lee
Sto cercando unmodopereseguire una ricercae,durante la ricerca,controlla un campopersonalizzato denominato "parole chiave",iltitolo delposte il contenuto delpost. Se uno di questi campi ha risultati simili a ciò che l'utente cerca,visualizzeràiltipo dipostpersonalizzato (programmi)nellapagina dei risultati.
Non hobisogno di aiuto conil risultato di visualizzazionefinale (attualmentefa quello che voglio),ma devofarein modo che quandoesegue la ricerca controllituttie trei campi (titolo delpost,contenuto delposte campopersonalizzatoparole chiave)e se qualcuno di loro ha un risultato simile a quello che è stato cercato,visualizzai risultati. Questo èil codice che hofinora. Attualmente sta solo cercandonel campopersonalizzato delleparole chiave: