खोज में कस्टम टैक्सोनॉमी शब्द शामिल करें


33

मेरे पास दो कस्टम टैक्सोनॉमी हैं जो दो कस्टम पोस्ट प्रकारों पर लागू होते हैं। साइडबार की शब्द सूची ठीक है और इससे जुड़े सभी पदों को सूचीबद्ध करेगी। हालाँकि, यदि आप विशिष्ट शब्दों में से एक को खोजते हैं, तो यह उस पद के साथ एक पद नहीं लाता है।

उदाहरण: http://dev.andrewnorcross.com/das/all-case-studies/ शब्द की खोज "PRI"

मुझे कुछ नहीं मिलता। कोई विचार? मैंने विभिन्न खोज प्लगइन्स का उपयोग करने की कोशिश की है, लेकिन वे या तो मेरे कस्टम खोज मापदंडों को तोड़ते हैं या बस काम नहीं करते हैं।


नोक्रॉस, क्या आप जनवरी द्वारा प्रस्तावित उत्तर के लिए कुछ प्रतिक्रिया जोड़ सकते हैं? क्या आप शायद एक प्लगइन की तलाश कर रहे हैं जो काम करता है?
हकेरे

मैंने योजना को समाप्त कर दिया। चूंकि मैंने 3 अलग-अलग खोज फ़ंक्शंस बनाए थे (कुछ क्षेत्रों में विभिन्न आवश्यकताओं के आधार पर), मैंने जिन सभी प्लगइन्स का परीक्षण किया था, उन्हें तोड़ दिया। अंत में, मैंने क्लाइंट को सामग्री में शर्तों को शामिल करने के लिए कहा, यदि वे इसे खोजने योग्य चाहते हैं।
नॉरक्रॉस

जवाबों:


36

मैं सर्च एवरीथिंग प्लगइन की भी सिफारिश करूंगा , लेकिन यदि आप WP के खोज फ़ंक्शन का उपयोग करके इसे लागू करना चाहते हैं, तो यहां वह कोड है जिसका उपयोग मैं अपने Atter विषय में कर रहा हूं:

// search all taxonomies, based on: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23

function atom_search_where($where){
  global $wpdb;
  if (is_search())
    $where .= "OR (t.name LIKE '%".get_search_query()."%' AND {$wpdb->posts}.post_status = 'publish')";
  return $where;
}

function atom_search_join($join){
  global $wpdb;
  if (is_search())
    $join .= "LEFT JOIN {$wpdb->term_relationships} tr ON {$wpdb->posts}.ID = tr.object_id INNER JOIN {$wpdb->term_taxonomy} tt ON tt.term_taxonomy_id=tr.term_taxonomy_id INNER JOIN {$wpdb->terms} t ON t.term_id = tt.term_id";
  return $join;
}

function atom_search_groupby($groupby){
  global $wpdb;

  // we need to group on post ID
  $groupby_id = "{$wpdb->posts}.ID";
  if(!is_search() || strpos($groupby, $groupby_id) !== false) return $groupby;

  // groupby was empty, use ours
  if(!strlen(trim($groupby))) return $groupby_id;

  // wasn't empty, append ours
  return $groupby.", ".$groupby_id;
}

add_filter('posts_where','atom_search_where');
add_filter('posts_join', 'atom_search_join');
add_filter('posts_groupby', 'atom_search_groupby');

यह टैग-खोज प्लगइन पर आधारित है: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23


1
यह महान है - खोज से वर्गीकरण आईडी की एक सरणी को बाहर करने के लिए इस कोड को कैसे संशोधित किया जा सकता है?
HandiworkNYC.com

यह ध्यान दिया जाना चाहिए कि इन हुक के लिए फ़िल्टर कॉलबैक 2 तर्क स्वीकार करते हैं; उन सभी के लिए दूसरा WP_Query उदाहरण है जिसे संदर्भ द्वारा पारित किया गया है। किसी भी चेक is_search()या अन्य WP_Query विधि कॉल ( is_search() is_home()आदि) को हमेशा क्वेरी इंस्टेंस पर कहा जाना चाहिए (जैसे $query->is_search(), उदाहरण चर का नाम $queryकॉलबैक हस्ताक्षर में है) टेम्पलेट फ़ंक्शन के बजाय जो हमेशा मुख्य क्वेरी को संदर्भित करेगा। , वह क्वेरी नहीं जिसके लिए फ़िल्टर चल रहा है।
इवान मैटसन

4
इसके अलावा, शायद एक सार्वजनिक रूप से उपलब्ध खोज स्ट्रिंग को एक SQL क्वेरी में सीधे इंजेक्ट करने के लिए एक अच्छा विचार नहीं है ... पढ़ने की सिफारिश की
इवान मैटसन

मैं बस यह जोड़ना चाहूंगा कि इसमें WPML के साथ एक संघर्ष है क्योंकि WPML alredy शामिल होने में 'T' का उपयोग करता है, इसलिए tr, tt और t के बजाय कुछ कस्टम का उपयोग करके इस समस्या को हल करता है
Bobz

7

क्या यह मानक वर्डप्रेस खोज है? क्योंकि यह खोज में वर्गीकरण (श्रेणियों और टैग की तरह भी मानक नहीं) को शामिल नहीं करता है । कोड में post_titleऔर खोज करता है post_content, लेकिन यदि आप कुछ और भी शामिल करना चाहते हैं तो आपको posts_searchफ़िल्टर में हुक लगाना चाहिए ।


5

मैंने https://wordpress.stackexchange.com/a/5404/37612 के ऊपर Onetrickpony के समाधान की कोशिश की , जो बहुत अच्छा है, लेकिन मुझे वहां एक मुद्दा मिला, जो मेरे काम नहीं आया और मैं एक छोटा संशोधन करूंगा:

  1. अगर मैंने वर्गीकरण के शीर्षक में एक स्ट्रिंग की खोज की - यह बहुत अच्छा काम करता है
  2. अगर टैक्सोनोमी में विशेष वर्ण हैं जैसे जर्मन "उमलाट्स" (ö, ü, ü) के साथ और o, ae, ue के लिए एक खोज विशेष वर्ण का उपयोग करने के लिए प्रेरित करती है - आपको खोज को टैक्सोनॉमी के स्लग में जोड़ने की आवश्यकता है - OR t.slug LIKE '%".get_search_query()."%'

  3. यदि आप खोज क्वेरी और टैक्सोनॉमी फ़िल्टर के संयोजन की खोज करते हैं - यह भी ठीक काम करता है

  4. लेकिन समस्या यह है कि, जब आप केवल टैक्सोनॉमी फ़िल्टर का उपयोग करने का प्रयास करते हैं - यदि कोई पाठ नहीं खोजा जाता है, तो खोज हुक क्वेरी के लिए एक रिक्त स्ट्रिंग को जोड़ देता है, और इस कारण से आपको परिणाम में सभी पोस्ट मिलते हैं, बजाय केवल उन से फ़िल्टर किए गए टैक्सोनॉमी। एक साधारण IF स्टेटमेंट समस्या को हल करता है। तो पूरा संशोधित कोड यह होगा (मेरे लिए पूरी तरह से ठीक काम करता है!)

फंक्शन custom_search_where ($ जहां) { 
  वैश्विक $ wpdb;
  अगर (is_search () && get_search_query ())
    $ जहां। = 'प्रकाशित') ";
  लौट $ जहां;
}

फंक्शन custom_search_join ($ join) {
  वैश्विक $ wpdb;
  अगर (is_search () && get_search_query ())
    $ शामिल हो। $ wpdb-> शर्तें} t ON t.term_id = tt.term_id ";
  वापसी $ शामिल;
}

फ़ंक्शन custom_search_groupby ($ groupby) {
  वैश्विक $ wpdb;

  // हमें पोस्ट आईडी पर समूह बनाने की आवश्यकता है
  $ groupby_id = "{$ wpdb-> पोस्ट} .ID";
  if (। is_search () || strpos ($ groupby, $ groupby_id)! == ??? ???! get_search_query ()) $ groupby लौटाएँ;

  // ग्रुपबी खाली थी, हमारा उपयोग करें
  अगर (स्ट्रेलन (ट्रिम ($ groupby))) $ groupby_id लौटें;

  // खाली नहीं था, हमारा संलग्न करें
  $ groupby लौटाएँ। "," $ groupby_id;
}

add_filter ( 'posts_where', 'custom_search_where');
add_filter ('posts_join', 'custom_search_join');
add_filter ('posts_groupby', 'custom_search_groupby');

3

मेरे पास जनवरी जैसी जानकारी का एक ही स्तर है। मुझे पता है कि प्लगइन्स के साथ ही खोज का विस्तार करना संभव है।

संभवतः सब कुछ खोजें (Wordpress Plugin) वह है जो आप ढूंढ रहे हैं। फीचर सूची के अनुसार, यह अब कस्टम टैक्सोनॉमी का समर्थन करता है।


+1 सर्च एवरीथिंग प्लगइन के लिए। यह उम्मीद के मुताबिक काम करता है और मानक वर्डप्रेस खोज की तुलना में अधिक परिणाम देता है।
पीएनएमजी

2

मुझे onetrickpony का उत्तर बहुत अच्छा लगा, लेकिन यह किसी भी खोज को एक शब्द के रूप में मानता है और उद्धरण चिह्नों के साथ संलग्न खोज वाक्यांश से भी नहीं निपटेगा। मैंने atom_search_whereइन दोनों स्थितियों से निपटने के लिए उनके कोड (विशेष रूप से, फ़ंक्शन) को थोड़ा संशोधित किया । यहाँ उनके कोड का मेरा संशोधित संस्करण है:

// search all taxonomies, based on: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23

function atom_search_where($where){ 
    global $wpdb, $wp_query;
    if (is_search()) {
        $search_terms = get_query_var( 'search_terms' );

        $where .= " OR (";
        $i = 0;
        foreach ($search_terms as $search_term) {
            $i++;
            if ($i>1) $where .= " AND";     // --- make this OR if you prefer not requiring all search terms to match taxonomies
            $where .= " (t.name LIKE '%".$search_term."%')";
        }
        $where .= " AND {$wpdb->posts}.post_status = 'publish')";
    }
  return $where;
}

function atom_search_join($join){
  global $wpdb;
  if (is_search())
    $join .= "LEFT JOIN {$wpdb->term_relationships} tr ON {$wpdb->posts}.ID = tr.object_id INNER JOIN {$wpdb->term_taxonomy} tt ON tt.term_taxonomy_id=tr.term_taxonomy_id INNER JOIN {$wpdb->terms} t ON t.term_id = tt.term_id";
  return $join;
}

function atom_search_groupby($groupby){
  global $wpdb;

  // we need to group on post ID
  $groupby_id = "{$wpdb->posts}.ID";
  if(!is_search() || strpos($groupby, $groupby_id) !== false) return $groupby;

  // groupby was empty, use ours
  if(!strlen(trim($groupby))) return $groupby_id;

  // wasn't empty, append ours
  return $groupby.", ".$groupby_id;
}

add_filter('posts_where','atom_search_where');
add_filter('posts_join', 'atom_search_join');
add_filter('posts_groupby', 'atom_search_groupby');

1

मुझे वही समस्या है जो WooCommerce कार्ट प्लगइन के साथ चल रही है .. मेरे खोज परिणाम कस्टम टैक्सोनॉमी शब्द, 'product_tag' सहित नहीं हैं, क्योंकि यह एक मानक पोस्ट टैग नहीं है। मुझे इस मामले के बारे में अन्य StackOverflow धागे में एक समाधान मिला:

https://stackoverflow.com/questions/13491828/how-to-amend-wordpress-search-so-it-queries-taxonomy-terms-and-category-terms

गाड़ी के प्लगिन के लिए हमारी जरूरतों के अनुसार उनके उदाहरण में शब्द की जगह लेते समय tkelly द्वारा कोड उदाहरण ने मेरे लिए काम किया ।authorproduct_tag

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.