วิธีสร้างการค้นหาป้อนอัตโนมัติแบบสด


22

ขณะนี้ฉันกำลังพยายามสร้างฟังก์ชั่นการค้นหา WordPress ที่แสดงผลลัพธ์สดใต้แถบค้นหา มีตัวอย่างในเว็บไซต์World Bank (หน้าจอด้านล่าง) ฉันไม่ได้มองหาการป้อนอัตโนมัติเหมือนที่คุณจะพบใน Google ซึ่งเป็นคำที่คุณพิมพ์ แต่ฉันต้องการให้มันค้นหาโพสต์จริงในเว็บไซต์

ฉันพยายามขัดเกลาผ่าน Wordpress Answers และแหล่งข้อมูลที่คล้ายคลึงกันอื่น ๆ แต่มีเพียงการใช้การค้นหาประเภทของ Google ซึ่งไม่ใช่สิ่งที่ฉันกำลังมองหา ความช่วยเหลือหรือคะแนนในทิศทางที่ถูกต้องจะได้รับการชื่นชมอย่างมาก

ค้นหาก่อน

ค้นหาหลังจาก


คุณต้องการเกิดอะไรขึ้นเมื่อผู้ใช้คลิกคำแนะนำ เพียงกรอกช่องค้นหาด้วยหรือไม่
Rarst

นำคุณไปยังโพสต์ที่เกี่ยวข้อง ผู้ใช้ยังสามารถพิมพ์และรับผลการค้นหาได้ตามปกติเพียงคลิกที่คำแนะนำจะนำไปยังโพสต์
mmaximalist

ฉันมีวิธีแก้ปัญหาอย่างรวดเร็วในการเติม แต่เชื่อมโยงปัญหามากขึ้น ... จะคิดเกี่ยวกับมัน
Rarst

คำตอบ:


20

ข้อมูลต่อไปนี้ใช้การเติมข้อความอัตโนมัติ jQuery UI ซึ่งรวมอยู่ใน WordPress ตั้งแต่ 3.3 (ฉันยืมรูปแบบจาก@Rarst : D)

มันยังไม่ชัดเจนว่าคุณเป็นใคร แต่ให้จุดเริ่มต้นที่ดี ข้อมูลต่อไปนี้ใช้การออกแบบพื้นฐาน jQuery UI แต่คุณสามารถใช้รูปแบบที่ใช้งานได้ในปัจจุบันบน tracและเรียกสิ่งนั้นจากโฟลเดอร์ปลั๊กอินของคุณ

class AutoComplete {

    static $action = 'my_autocomplete';//Name of the action - should be unique to your plugin.

    static function load() {
        add_action( 'init', array( __CLASS__, 'init'));
    }

    static function init() {
        //Register style - you can create your own jQuery UI theme and store it in the plug-in folder
        wp_register_style('my-jquery-ui','http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css');    
        add_action( 'get_search_form', array( __CLASS__, 'get_search_form' ) );
        add_action( 'wp_print_footer_scripts', array( __CLASS__, 'print_footer_scripts' ), 11 );
        add_action( 'wp_ajax_'.self::$action, array( __CLASS__, 'autocomplete_suggestions' ) );
        add_action( 'wp_ajax_nopriv_'.self::$action, array( __CLASS__, 'autocomplete_suggestions' ) );
    }

    static function get_search_form( $form ) {
        wp_enqueue_script( 'jquery-ui-autocomplete' );
        wp_enqueue_style('my-jquery-ui');
        return $form;
    }

    static function print_footer_scripts() {
        ?>
    <script type="text/javascript">
    jQuery(document).ready(function ($){
        var ajaxurl = '<?php echo admin_url( 'admin-ajax.php' ); ?>';
        var ajaxaction = '<?php echo self::$action ?>';
        $("#secondary #searchform #s").autocomplete({
            delay: 0,
            minLength: 0,
            source: function(req, response){  
                $.getJSON(ajaxurl+'?callback=?&action='+ajaxaction, req, response);  
            },
            select: function(event, ui) {
                window.location.href=ui.item.link;
            },
        });
    });
    </script><?php
    }

    static function autocomplete_suggestions() {
        $posts = get_posts( array(
            's' => trim( esc_attr( strip_tags( $_REQUEST['term'] ) ) ),
        ) );
        $suggestions=array();

        global $post;
        foreach ($posts as $post): 
                    setup_postdata($post);
            $suggestion = array();
            $suggestion['label'] = esc_html($post->post_title);
            $suggestion['link'] = get_permalink();

            $suggestions[]= $suggestion;
        endforeach;

        $response = $_GET["callback"] . "(" . json_encode($suggestions) . ")";  
        echo $response;  
        exit;
    }
}
AutoComplete::load();

12

ตกลงนี่จะเป็นรหัสตัวอย่างพื้นฐานที่ใช้เนทิsuggest.jsฟ WP core สำหรับ Ajax และผูกกับฟอร์มการค้นหาเริ่มต้น (จากการget_search_form()โทรที่ไม่ได้แก้ไข) มันไม่ใช่สิ่งที่คุณขออย่างแน่นอน แต่การค้นหาที่เพิ่มขึ้นนั้นเป็นความเจ็บปวดที่ยิ่งใหญ่เพื่อให้สมบูรณ์ :)

class Incremental_Suggest {

    static function on_load() {

        add_action( 'init', array( __CLASS__, 'init' ) );
    }

    static function init() {

        add_action( 'wp_print_scripts', array( __CLASS__, 'wp_print_scripts' ) );
        add_action( 'get_search_form', array( __CLASS__, 'get_search_form' ) );
        add_action( 'wp_print_footer_scripts', array( __CLASS__, 'wp_print_footer_scripts' ), 11 );
        add_action( 'wp_ajax_incremental_suggest', array( __CLASS__, 'wp_ajax_incremental_suggest' ) );
        add_action( 'wp_ajax_nopriv_incremental_suggest', array( __CLASS__, 'wp_ajax_incremental_suggest' ) );
    }

    static function wp_print_scripts() {

        ?>
    <style type="text/css">
        .ac_results {
            padding: 0;
            margin: 0;
            list-style: none;
            position: absolute;
            z-index: 10000;
            display: none;
            border-width: 1px;
            border-style: solid;
        }

        .ac_results li {
            padding: 2px 5px;
            white-space: nowrap;
            text-align: left;
        }

        .ac_over {
            cursor: pointer;
        }

        .ac_match {
            text-decoration: underline;
        }
    </style>
    <?php
    }

    static function get_search_form( $form ) {

        wp_enqueue_script( 'suggest' );

        return $form;
    }

    static function wp_print_footer_scripts() {

        ?>
    <script type="text/javascript">
        jQuery(document).ready(function ($) {
            $('#s').suggest('<?php echo admin_url( 'admin-ajax.php' ); ?>' + '?action=incremental_suggest');
        });
    </script><?php
    }

    static function wp_ajax_incremental_suggest() {

        $posts = get_posts( array(
            's' => $_REQUEST['q'],
        ) );

        $titles = wp_list_pluck( $posts, 'post_title' );
        $titles = array_map( 'esc_html', $titles );
        echo implode( "\n", $titles );

        die;
    }
}

Incremental_Suggest::on_load();

0

คุณต้องทำโดยใช้ Ajax แน่นอน แต่ที่นี่มีปัญหา เนื่องจาก WordPress ใช้ MySQL คุณอาจเครียดเซิร์ฟเวอร์ของคุณด้วยการค้นหาถ้าคุณพยายามเติมคำค้นหาด้วยคำสั่งฐานข้อมูลจริงอาแจ็กซ์ แต่สิ่งที่คุณอาจทำคือพัฒนาระบบที่โพสต์ทั้งหมดจะถูกบันทึกไว้ใน "wp_options" อันยิ่งใหญ่ จากนั้นเมื่อการค้นหาเสร็จสิ้นคุณทำการค้นหาจากสิ่งนั้นแทนที่จะทำการค้นหาจริง แต่จำไว้ว่าคุณต้องอัปเดตข้อความ / ตัวแปรลำดับต่อเนื่องนี้ทุกครั้งที่คุณสร้างหรือแก้ไขโพสต์

หากคุณไม่เต็มใจที่จะใช้เวลาในการพัฒนาโซลูชันนี้ฉันไม่แนะนำให้คุณทำการ "ค้นหาสด" เช่นนี้


2
ในการใช้งานกรณีการใช้ทรัพยากรของการร้องขอ MySQL จะไม่มีนัยสำคัญอย่างสมบูรณ์เมื่อเทียบกับการกดการโหลดหลัก WP สำหรับการร้องขอ Ajax
Rarst

1
ขึ้นอยู่กับว่าคุณพยายามทำคำขอ Ajax อย่างไรในกรณีนี้คุณไม่จำเป็นต้องใช้แกน WP ทั้งหมดสำหรับคำตอบของคุณสถานการณ์กรณีที่ดีที่สุดจะเป็นการโหลด $ wpdb และค้นหาฟิลด์ของคุณ แต่ตกลงกันว่าการใช้ WP Ajax หลัก url ทั้งคู่อาจกลายเป็นปัญหาหากไม่ได้รับการจัดการที่ดี
Webord

1
ใช่ฉันแค่สังเกตว่าประสิทธิภาพของ MySQL จะไม่เป็นปัญหาคอขวด (เว้นแต่คุณจะได้รับโพสต์นับแสนรายการ) WP core นั้นช้ากว่ามาก เครือข่ายก็ช้าลงเช่นกัน
Rarst

ใช่ แต่การทำ Scalling ด้วยเครื่อง WP Core นั้นง่ายกว่าและเร็วกว่ามาก ด้วยเครื่อง MySQL จะช้าลงและหนักขึ้น แต่ในการติดตั้งปกติฉันเห็นด้วยกับคุณ
Webord
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.