2015-12-18 22 views
7

Sto utilizzando this code per cercare prodotti da un sito Web Wordpress/WooCommerce.
Il mio requirment è URL come "http://localhost/wp/?s=D34&post_type=product" Mentre s=D34 è una stringa di ricerca.Errore nella ricerca della colonna post_type del modulo post_type specifico utilizzando la ricerca prodotto WooCommerce

Quando l'utente cerca una stringa. I dati verranno ricercati da Tutti i campi predefiniti + custom filed del prodotto. Il lavoro codice qui sotto bene con http://localhost/wp/?s=D34 ma quando è concatenato con url allora dire enter image description here

codice è il seguente

function cf_search_where($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); 
     $where .= " AND ($wpdb->posts.post_type = 'product') "; 
    } 

    return $where; 
} 
add_filter('posts_where', 'cf_search_where'); 

Questo per evitare che i valori distinti

function cf_search_distinct($where) { 
     global $wpdb; 
if (is_search()) { 
    return "DISTINCT"; //to prevent duplicates 
} 

return $where; 

} 
add_filter('posts_distinct', 'cf_search_distinct'); 

Quindi quale modifica è richiesta?

URLhttp://localhost/wp/?orderby=price&post_type=product funzionano bene

ma ciò che è sbagliato con http://localhost/wp/?s=D34&post_type=product

+0

Sono solo curioso (dato che mi è successo un po '); prova ad aggiungere un widget carrello o uno qualsiasi dei widget woocommerce (come le categorie) da qualche parte (temporaneamente) sulla pagina in cui si trova il campo di ricerca, quindi prova a cercare con la seconda stringa (con 's = d34'). Ho voluto fare una ricerca dettagliata per woocommerce e ha funzionato solo quando avevo alcuni altri widget woocommerce presenti nella pagina con il campo di ricerca. Potrebbe essere un problema woocommerce ... –

+0

Posso suggerire solo qui, provare a utilizzare l'URL specificato, potrebbe essere il tuo problema relativo alla codifica url dei caratteri D34, http: // localhost/wp /? Post_type = product & s = D34, it può dare un'idea del tuo problema stampando la clausola where come sotto la risposta suggerisce – Abhishek

+0

@dingo_d Penso anche al suo problema di woo-commerce, o potrebbe essere quando post_type = 'product' incluso inizia a cercare in una cartella specifica come puoi vedere nella figura "Home/Shop/", beh, proverò con quello che hai suggerito. –

risposta

4

provare questo

function cf_search_where($where) { 
    global $pagenow, $wpdb; 

    // a little debugging will help you.. 
    //print_r ($where); 
    //die(); 

    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); 
     $where .= " AND ($wpdb->posts.post_type = 'product') "; 
    } 

    return $where; 
} 
add_filter('posts_where', 'cf_search_where'); 

In base alla tua domanda aggiornato.

se solo hai utilizzato print_r ($where); per verificare che valore ha $where contiene, si vedrà qualcosa come questi ...

con http://localhost/wp/?s=D34

AND (((wp1_posts.post_title LIKE '%D34%') OR (wp1_postmeta.meta_value LIKE '%D34%') OR (wp1_posts.post_content LIKE '%D34%'))) 
AND (wp1_posts.post_password = '') 
AND wp1_posts.post_type IN ('post', 'page', 'attachment', 'product') 
AND (wp1_posts.post_status = 'publish') 

con http://localhost/wp/?s=D34&post_type=product

AND (((wp1_posts.post_title LIKE '%D34%') OR (wp1_postmeta.meta_value LIKE '%D34%') OR (wp1_posts.post_content LIKE '%D34%'))) 
AND (wp1_posts.post_password = '') 
AND ((wp1_postmeta.meta_key = '_visibility' AND CAST(wp1_postmeta.meta_value AS CHAR) IN ('visible','search'))) 
AND wp1_posts.post_type = 'product' 
AND (wp1_posts.post_status = 'publish') 

prendi nota di wp1_posts.post_type e ottieni un suggerimento .. sii flessibile su te stesso e prova a eseguire il debug. sopra sono risultati senza il $where .= " AND ($wpdb->posts.post_type = 'product') "; però.

+0

Ho modificato la domanda, ora è più chiaro per favore guarda ora.Sto votando, accetto se modifichi la risposta –

+0

dovrebbe funzionare ... se non lo fa, allora è un altro problema .. che non può essere visto sulla domanda data ... prova a disattivare i plugin ... o prova a cambiare i temi .. – Reigel

+0

non c'è nessun plugin attivo ma solo woocommerce. –