การสร้างแบบฟอร์มการค้นหาสำหรับฟิลด์ที่กำหนดเอง


11

ฉันสร้างธีมสำหรับตัวแทนจำหน่ายรถยนต์ รถแต่ละคันเป็นประเภทโพสต์ที่กำหนดเอง ("ยานพาหนะ") และมีประมาณ 12 ช่องที่กำหนดเองพร้อมสิ่งต่าง ๆ เช่นสร้าง, รุ่น, ระยะทาง, ประเภทของเชื้อเพลิง ฯลฯ

ดังนั้นโดยทั่วไปในหน้าแรกฉันต้องการแบบฟอร์มการค้นหาที่มีรายการแบบหล่นลงสำหรับยี่ห้อและรุ่นและมี Makes หรือ Models ที่มีอยู่

ฉันต้องการให้มี 2 ตัวเลือกสำหรับปีเพื่อให้ผู้ใช้สามารถเลือก "2006" และ "2012" และผลการค้นหามียานพาหนะทั้งหมดที่มีปีระหว่างตัวเลขสองตัวนั้น

มีปลั๊กอินที่สามารถทำได้หรือไม่?

ขอบคุณสำหรับความช่วยเหลือใด ๆ .. มันทำให้ฉันบ้าไปหลายชั่วโมง !!!!


ฉันคิดว่าคุณสามารถใช้ปลั๊กอินนี้เพื่อช่วยให้คุณดีกว่าwordpress.org/plugins/wp-custom-fields-search
DINESH BHIMANI

ขอบคุณ .. แต่นั่นไม่ได้อธิบายถึงวิธีการสร้างแบบฟอร์มการค้นหาจริง ฉันหมายถึงฉันสามารถเขียนโปรแกรมในรูปแบบ HTML แต่ฉันจะให้มันทำงานจริงได้อย่างไร!
absdigital

คำตอบ:


16

______UPDATE_______
แม้ว่าฉันจะได้รับคะแนนเสียงมากขึ้นเรื่อย ๆ และการแก้ปัญหาก็ใช้งานได้ แต่คำตอบของ cybmetaนั้นเป็นคำตอบที่ดีและเป็นวิธีของ WordPress คุณควรลองสิ่งนั้นอย่างแน่นอน

ขั้นตอนที่ 1

เริ่มต้นด้วยการสร้างแบบฟอร์มการค้นหาขั้นสูงที่คุณต้องการให้ผู้ใช้ของคุณจะโต้ตอบกับเว็บไซต์และบันทึกด้วยชื่อ (เช่นฉันบันทึกไว้เป็นadvanced-searchform.php- แต่อย่าบันทึกไว้ด้วยsearchform.phpแล้วมันจะแทนที่แบบฟอร์มการค้นหาเริ่มต้นของ WordPress ):

<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 ที่คุณได้รับหลังจากส่งแบบฟอร์ม ตอนนี้ขอให้ WordPress โหลดหน้าผลการค้นหาที่คุณกำหนดเองเมื่อส่งแบบฟอร์ม วางฟังก์ชั่นต่อไปนี้ไว้ในของคุณ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');
?>

ฉันนำรหัสมาจาก WPSE (ฉันลืมราก) แต่มีข้อโต้แย้งในการใช้รหัสด้านบน แต่ใช้งานได้จริง ( แก้ตัวไม่ได้แน่นอน )

ตรวจสอบวิธีอื่นที่ @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 - WordPress ไม่มีอะไรที่นั่น
  • การฆ่าเชื้อและการตรวจสอบความถูกต้อง - ฟิลด์ข้อความและ textarea นั้นมีความเสี่ยงสูงที่อาจทำให้เกิดการปฏิบัติที่เลวร้ายต่อเว็บไซต์ของคุณ ดังนั้นการส่งข้อมูลดิบจะไม่ปลอดภัยคุณจะต้อง Sanitize และตรวจสอบความถูกต้องก่อนส่งผ่านแบบสอบถาม db ( การฆ่าเชื้อและการตรวจสอบข้อมูลด้วย WordPress - TutsPlus )
  • การออกแบบ - คุณสามารถเลือกเทมเพลตpage.php(หรือsearch.php) และทำให้หน้านี้เป็นพื้นฐานของสิ่งนั้น

ดังนั้นคุณมีความคิดตอนนี้ก็ถึงตาของคุณไปสำรวจและค้นพบวิธี โปรดจำไว้ว่าวิธีของทุกคนแตกต่างกัน ทำให้เป็นของคุณเพื่อที่ฉันจะได้ตามคุณไป :)


ขอบคุณมากที่สละเวลาคุณใจดีมาก คุณรู้หรือไม่ว่าฉันจะมีมันได้อย่างไรเมนูแบบเลื่อนลงของ "Makes" จะแสดงยี่ห้อใด ๆ ที่เข้ามาในโพสต์ของยานพาหนะโดยอัตโนมัติหรือไม่
absdigital

จะดีใจถ้ามันเหมาะกับคุณ :)
Mayeenul Islam

คุณรู้หรือไม่ว่าฉันจะมีมันได้อย่างไรเมนูแบบเลื่อนลงของ "Makes" จะแสดงยี่ห้อใด ๆ ที่เข้ามาในโพสต์ของยานพาหนะโดยอัตโนมัติหรือไม่
absdigital

ใช้WP_Query()พารามิเตอร์ฟิลด์ที่กำหนดเองโดยใช้และวนผลลัพธ์เพื่อแสดง<option>s
Mayeenul Islam

ฉันต้องการจะดู "การค้นหาขั้นสูง" นี้ทำได้โดยใช้pre_get_postshook ไม่ใช่ห่วงที่สอง
cybmeta

23

แม้ว่าคำตอบของ @ MayeenulIslam สามารถใช้ได้ แต่ฉันคิดว่าวิธีที่ถูกต้องในการค้นหาขั้นสูงคือการใช้pre_get_postsแอคชั่นฮุค

ขั้นตอนที่ 1: แบบฟอร์มการค้นหา

ขั้นตอนนี้เท่ากับขั้นตอนที่ 1 ในคำตอบอื่น ๆ เพียงแค่การเปลี่ยนแปลงidของnameสนาม ( <input type="text" ...>ใช้สำหรับการค้นหา"S"จึงจะนำมาใช้โดยตรงสำหรับช่องค้นหา. บันทึกรหัสนี้ใน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: Templating (ไม่บังคับ)

ด้วยวิธีนี้เทมเพลตการค้นหาเริ่มต้นของ WordPress จะถูกใช้เพื่อกรองผลลัพธ์โดยไม่จำเป็นต้องมีคิวรีรอง หากคุณต้องการใช้เทมเพลตอื่นสำหรับการค้นหาขั้นสูงคุณสามารถใช้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
ขอบคุณมากสำหรับวิธีการของ WordPress เพิ่งทำงานกับอันนี้และมันยอดเยี่ยม :)
Mayeenul Islam
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.