कस्टम फ़ील्ड के लिए एक खोज फ़ॉर्म बनाना


12

मैंने कार डीलरशिप के लिए एक थीम बनाई है। प्रत्येक कार एक कस्टम पोस्ट प्रकार ("वाहन") है, और इसमें लगभग 12 कस्टम फ़ील्ड हैं जैसे मेक, मॉडल, माइलेज, फ्यूल मोड आदि।

इसलिए मूल रूप से होम पेज पर मैं एक खोज प्रपत्र चाहता हूं जिसमें मेक एंड मॉडल के लिए सूचियां नीचे हैं और इसमें कोई भी उपलब्ध माक्स या मॉडल शामिल हैं।

मैं यह भी चाहता हूं कि वर्ष के लिए 2 विकल्प हों, इसलिए अंतिम उपयोगकर्ता "2006" और "2012" का चयन कर सकता है और खोज परिणामों में उन दो नंबरों के बीच वर्ष के सभी वाहन शामिल हैं।

वहाँ एक प्लगइन है कि वहाँ यह कर सकता है ??

किसी भी मदद के लिए धन्यवाद ... यह मुझे घंटों के लिए पागल कर रहा है !!!!


मुझे लगता है कि आप इसका उपयोग कर सकते हैं, बेहतर वर्डप्रेस.ओप्लिंस
wp-custom-fields-search

धन्यवाद .. लेकिन यह नहीं समझाता है कि वास्तव में खोज फ़ॉर्म कैसे बनाएं। मेरा मतलब है कि मैं HTML में फ़ॉर्म को प्रोग्राम कर सकता हूं, लेकिन मैं वास्तव में इसे कैसे प्राप्त कर सकता हूं?
15:१४ बजे

जवाबों:


16

______UPDATE_______
हालांकि मैं ज्यादा से ज्यादा वोट मिल रहा है, और समाधान काम करता है, लेकिन cybmeta का जवाब वास्तव में इस सवाल का जवाब अच्छा और वर्डप्रेस 'जिस तरह से है। आपको कोशिश जरूर करनी चाहिए।

चरण 1

एक उन्नत खोज फ़ॉर्म बनाने के साथ शुरू करें, जिसके साथ आप चाहते हैं कि आपका उपयोगकर्ता वेबसाइट के साथ सहभागिता करेगा, और इसे एक नाम के साथ सहेजेगा (अर्थात मैंने इसे सहेज लिया है advanced-searchform.php- लेकिन इसे searchform.phpतब तक न सहेजें जब तक यह वर्डप्रेस के डिफ़ॉल्ट खोज फ़ॉर्म को बदल न दे ):

<form method="get" id="advanced-searchform" role="search" action="<?php echo esc_url( home_url( '/' ) ); ?>">

    <h3><?php _e( 'Advanced Search', 'textdomain' ); ?></h3>

    <!-- PASSING THIS TO TRIGGER THE ADVANCED SEARCH RESULT PAGE FROM functions.php -->
    <input type="hidden" name="search" value="advanced">

    <label for="name" class=""><?php _e( 'Name: ', 'textdomain' ); ?></label><br>
    <input type="text" value="" placeholder="<?php _e( 'Type the Car Name', 'textdomain' ); ?>" name="name" id="name" />

    <label for="model" class=""><?php _e( 'Select a Model: ', 'textdomain' ); ?></label><br>
    <select name="model" id="model">
        <option value=""><?php _e( 'Select one...', 'textdomain' ); ?></option>
        <option value="model1"><?php _e( 'Model 1', 'textdomain' ); ?></option>
        <option value="model2"><?php _e( 'Model 1', 'textdomain' ); ?></option>
    </select>

    <input type="submit" id="searchsubmit" value="Search" />

</form>

फिर फॉर्म को निम्न की तरह अपने टेम्पलेट में कॉल करें:

<?php get_template_part( 'advanced', 'searchform' ); ?>

अब आपका खोज फ़ॉर्म तैयार है, और अब आप खोज फ़ॉर्म का उपयोग कर सकते हैं और URL में उपयोगकर्ता इनपुट ले सकते हैं।

चरण 2

बस आपको क्या चाहिए: डेटाबेस को क्वेरी करें और खोज क्वेरी के अनुसार पोस्ट प्रकार और उसके कस्टम फ़ील्ड को क्वेरी करें । याद रखें कि फॉर्म सबमिट करने के बाद आपकी खोज क्वेरी अब आपके द्वारा प्राप्त किया गया URL है। अब फॉर्म जमा करने पर वर्डप्रेस को अपने कस्टम खोज परिणाम पृष्ठ को लोड करने के लिए कहें। निम्न फ़ंक्शन को अपने स्थान पर रखें functions.phpताकि वह डिफ़ॉल्ट के बजाय आपके कस्टम खोज टेम्प्लेट को सक्षम कर सके search.php:

<?php
function wpse_load_custom_search_template(){
    if( isset($_REQUEST['search']) == 'advanced' ) {
        require('advanced-search-result.php');
        die();
    }
}
add_action('init','wpse_load_custom_search_template');
?>

डब्लूएसई (मैं रूट को भूल गया) से कहीं न कहीं मैं कोड लाया, लेकिन ऊपर दिए गए कोड का उपयोग करके विवाद है। लेकिन यह वास्तव में काम करता है ( लंगड़ा बहाना बेशक )।

दूसरे तरीके की जाँच करें @GM का सुझाव दिया।

चरण 3

एक नई फ़ाइल बनाएं और इसे सहेजें advanced-search-result.php(क्योंकि हमने इस नाम का उपयोग किया था functions.php) और अब आप स्वतंत्र हैं - जाहिर है। अवधारणा है:

  • URL से डेटा को पकड़ो,
  • एक साधारण का उपयोग करें WP_Query()(यदि आपकी क्वेरी जटिल है तो $wpdbक्वेरी का उपयोग करें ),
  • क्वेरी के भीतर कमांड पास करें, db से डेटा प्राप्त करें, और
  • परिणाम दिखाएँ [s]

एक नमूना हो सकता है:

<?php
// Get data from URL into variables
$_name = $_GET['name'] != '' ? $_GET['name'] : '';
$_model = $_GET['model'] != '' ? $_GET['model'] : '';

// Start the Query
$v_args = array(
        'post_type'     =>  'vehicle', // your CPT
        's'             =>  $_name, // looks into everything with the keyword from your 'name field'
        'meta_query'    =>  array(
                                array(
                                    'key'     => 'car_model', // assumed your meta_key is 'car_model'
                                    'value'   => $_model,
                                    'compare' => 'LIKE', // finds models that matches 'model' from the select field
                                ),
                            )
    );
$vehicleSearchQuery = new WP_Query( $v_args );

// Open this line to Debug what's query WP has just run
// var_dump($vehicleSearchQuery->request);

// Show the results
if( $vehicleSearchQuery->have_posts() ) :
    while( $vehicleSearchQuery->have_posts() ) : $vehicleSearchQuery->the_post();
        the_title(); // Assumed your cars' names are stored as a CPT post title
    endwhile;
else :
    _e( 'Sorry, nothing matched your search criteria', 'textdomain' );
endif;
wp_reset_postdata();
?>

तो, यहाँ आपकी अंतिम बात है। लेकिन अभी भी कई चुनौतियाँ हैं:

  • वैकल्पिक मूल्य - सभी क्षेत्रों या किसी भी क्षेत्र के साथ एक उन्नत खोज की जा सकती है , इसलिए आपको यह सुनिश्चित करना होगा कि खोज और डेटा के अनुसार क्वेरी सभी परिणाम ले रही है। आप $wpdbजटिल खोज परिणाम के लिए कस्टम SQL क्वेरी का उपयोग कर सकते हैं और यह शुद्ध MySQL होगा - वर्डप्रेस के पास कुछ भी नहीं है।
  • स्वच्छता और मान्यता - ग्रंथ क्षेत्र और textarea बहुत कमजोर हैं जो आपकी साइट पर खराब अभ्यास का कारण बन सकते हैं। इसलिए कच्चा डेटा पास करना असुरक्षित होगा, आपको db क्वेरी में पास होने से पहले उन्हें Sanitize और Validate करना होगा। ( डेटा स्वच्छता और वर्डप्रेस के साथ मान्यता - TutsPlus )
  • डिजाइनिंग - आप page.php(या search.php) टेम्पलेट चुन सकते हैं और उसी के आधार पर इस पेज को बना सकते हैं ।

तो, आपको यह विचार मिल गया है, अब रास्ता तलाशने और खोजने की आपकी बारी है । याद रखें, हर किसी का तरीका अलग होता है। तुम्हारा बनाओ, ताकि मैं तुम्हारा अनुसरण कर सकूं। :)


समय लेने के लिए थैंक्यू, आप की तरह। क्या आप जानते हैं कि मेरे पास यह कैसे हो सकता है ताकि "मेक्स" के लिए ड्रॉप डाउन मेनू स्वचालित रूप से कोई भी बना दिखा सके जो किसी वाहन पोस्ट में दर्ज किया गया है?

खुशी होगी अगर यह आपके लिए काम करता है। :)
मयिनुल इस्लाम

क्या आप जानते हैं कि मेरे पास यह कैसे हो सकता है ताकि "मेक्स" के लिए ड्रॉप डाउन मेनू स्वचालित रूप से कोई भी बना दिखा सके जो किसी वाहन पोस्ट में दर्ज किया गया है?
१६

एक WP_Query()कस्टम फ़ील्ड पैरामीटर का उपयोग करें और परिणाम दिखाने के लिए लूप करें <option>
मयेनुल इस्लाम

मैं इस "उन्नत खोज" को pre_get_postsहुक का उपयोग करके देखना चाहता हूं न कि द्वितीयक लूप के रूप में।
साइबरमेट

23

हालांकि @ MayeenulIslam का जवाब काम कर सकता है, मुझे लगता है कि उन्नत खोज करने का सही तरीका pre_get_postsएक्शन हुक का उपयोग करना है।

चरण 1: खोज फ़ॉर्म

यह कदम अन्य जवाब में चरण 1 के बराबर है, बस बदल idके nameक्षेत्र ( <input type="text" ...>करने के लिए खोज के लिए इस्तेमाल किया "एस" , में सहेजें इस कोड को तो यह खोज क्षेत्र के रूप में के लिए सीधे इस्तेमाल किया जाएगा। advanced-searchform.phpअपने विषय फ़ोल्डर के अंतर्गत। फिर, उपयोग get_template_part( 'advanced', 'searchform' );करने के लिए इसे लोड करें जहाँ आप इसे अपने विषय में प्रदर्शित करना चाहते हैं:

<?php /**`advanced-searchform.php`*/ ?>
<form method="get" id="advanced-searchform" role="search" action="<?php echo esc_url( home_url( '/' ) ); ?>">

    <h3><?php _e( 'Advanced Search', 'textdomain' ); ?></h3>

    <!-- PASSING THIS TO TRIGGER THE ADVANCED SEARCH RESULT PAGE FROM functions.php -->
    <input type="hidden" name="search" value="advanced">

    <label for="s" class=""><?php _e( 'Name: ', 'textdomain' ); ?></label><br>
    <input type="text" value="" placeholder="<?php _e( 'Type the Car Name', 'textdomain' ); ?>" name="s" id="name" />

    <label for="model" class=""><?php _e( 'Select a Model: ', 'textdomain' ); ?></label><br>
    <select name="model" id="model">
        <option value=""><?php _e( 'Select one...', 'textdomain' ); ?></option>
        <option value="model1"><?php _e( 'Model 1', 'textdomain' ); ?></option>
        <option value="model2"><?php _e( 'Model 2', 'textdomain' ); ?></option>
    </select>

    <input type="submit" id="searchsubmit" value="Search" />

</form>

चरण 2: खोज क्वेरी में फ़िल्टर जोड़ें

add_action( 'pre_get_posts', 'advanced_search_query' );
function advanced_search_query( $query ) {

    if ( isset( $_REQUEST['search'] ) && $_REQUEST['search'] == 'advanced' && ! is_admin() && $query->is_search && $query->is_main_query() ) {

        $query->set( 'post_type', 'vehicle' );

        $_model = $_GET['model'] != '' ? $_GET['model'] : '';

        $meta_query = array(
                            array(
                                'key'     => 'car_model', // assumed your meta_key is 'car_model'
                                'value'   => $_model,
                                'compare' => 'LIKE', // finds models that matches 'model' from the select field
                            )
                        )
        );
        $query->set( 'meta_query', $meta_query );

    }
}

चरण 3: अस्थायी (वैकल्पिक)

इस पद्धति के साथ, वर्डप्रेस के डिफ़ॉल्ट खोज टेम्पलेट का उपयोग द्वितीयक क्वेरी की आवश्यकता के बिना परिणामों को फ़िल्टर करने के लिए किया जाएगा। यदि आप उन्नत खोज के लिए एक अलग टेम्पलेट का उपयोग करना चाहते हैं, तो आप template_includeफ़िल्टर का उपयोग कर सकते हैं । उदाहरण के लिए, यदि आप advanced-search-template.phpउन्नत खोज फ़ॉर्म से परिणामों के लिए फ़ाइल को टेम्पलेट के रूप में उपयोग करना चाहते हैं :

add_action('template_include', 'advanced_search_template');
function advanced_search_template( $template ) {
  if ( isset( $_REQUEST['search'] ) && $_REQUEST['search'] == 'advanced' && is_search() ) {
     $t = locate_template('advanced-search-template.php');
     if ( ! empty($t) ) {
         $template = $t;
     }
  }
  return $template;
}

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