การค้นหาผู้ดูแลระบบ WordPress: การขยายผลลัพธ์

เผยแพร่แล้ว: 2021-01-20

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

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

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

ขยายคำค้นหาในการค้นหาหน้าจอผู้ดูแลระบบ

ในตัวอย่างการทำงานของเราเกี่ยวกับฟิลด์ที่กำหนดเอง เราได้สร้างฟิลด์ที่กำหนดเองชื่อ 'แหล่งที่มา' ในหนึ่งในโพสต์ของเราและใส่ค่า URL

หากคุณไปที่ตารางรายการโพสต์และใช้ค่า 'แหล่งที่มา' ค่าใดค่าหนึ่งเหล่านี้ในแถบค้นหา คุณจะไม่ได้รับผลลัพธ์ใดๆ เนื่องจาก WordPress ไม่ได้ดูฟิลด์ที่กำหนดเองเมื่อค้นหาโดยค่าเริ่มต้น

ในการเปลี่ยนแปลงนี้ เราจำเป็นต้องขยาย hook ดั้งเดิมที่ WordPress มีให้สำหรับคุณลักษณะการค้นหา เบ็ดที่เราต้องขยายคือ pre_get_posts ที่รวมอยู่ใน wp-includes/class-wp-query.php รอบบรรทัด 1779 ภายในฟังก์ชัน get_posts

แบบสอบถาม WordPress

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

มาสร้างมุมมองชั่วคราวของเอาต์พุตคุณสมบัติของคิวรีกัน เพื่อทำความเข้าใจว่าการเปลี่ยนแปลงใดเกิดขึ้นในออบเจกต์ WP_Query ในทุกกรณี

ในการดูแบบสอบถามก่อนที่จะดำเนินการ เราจะผนวกการพิมพ์ในเบ็ดการดำเนินการ pre_get_posts ตัวกรอง pre_get_posts หลังจากสร้างออบเจ็กต์ตัวแปรการสืบค้น แต่ก่อนที่จะเรียกใช้การสืบค้นจริง

ในไฟล์ functions.php ของธีมที่ใช้งานอยู่ ให้ใส่โค้ดนี้:

 add_action( 'pre_get_posts', 'print_query' ); function print_query( ) { print_r ( $GLOBALS['wp_query']->query ); echo "<hr>"; print_r ( $GLOBALS['wp_query']->query_vars ); echo "<hr>"; }

ตอนนี้ ถ้าคุณไปที่หน้าจอผู้ดูแลระบบ Posts ผลลัพธ์ของ query และ query_var จะถูกพิมพ์ที่ด้านบน

ในการดูโค้ดได้ง่ายขึ้น คุณสามารถคัดลอกและวางลงใน PHP beautifier ออนไลน์ฟรี

$GLOBALS['wp_query']->query array (ออกก่อน) จะมีลักษณะดังนี้:

 Array ( [order] => [orderby] => [post_type] => post [posts_per_page] => 20 [post_status] => [perm] => )

ในกรณีของการค้นหาในหน้าจอผู้ดูแลระบบของ Posts ตัวอย่างเช่น ผลลัพธ์ของอาร์เรย์จะเปลี่ยนไปรวมถึงสตริงการค้นหา หากเราค้นหาคำว่า 'wordpress.org' จะมีลักษณะดังนี้:

 Array ( [m] => 0 [cat] => 0 [s] => wordpress.org [paged] => 1 [order] => [orderby] => [post_type] => post [posts_per_page] => 20 [post_status] => [perm] => )

ประกอบรหัส

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

 add_action( 'pre_get_posts', 'extend_admin_search' ); function extend_admin_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( ! is_admin() ) return; if ( $query->query['post_type'] != $post_type ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

ขั้นตอนต่อไปคือการเปลี่ยนตัวแปร $post_type และ $custom_fields เป็นค่าที่ใช้กับความต้องการของคุณ มาดูกันว่าเราทำอะไรได้บ้างในโค้ด

  • $post_type = 'post'; – ที่นี่เรากำหนดประเภทโพสต์ที่เราต้องการค้นหา
  • $custom_fields = array("source",); – ที่นี่เรากำหนดฟิลด์ที่กำหนดเองที่เราต้องการค้นหา

เนื่องจากเรากำลังทำงานกับ hook pre_get_posts สิ่งสำคัญคือต้องแน่ใจว่าในโค้ดของเราเราใช้ส่วนขยายการค้นหาที่กำหนดเองในขณะที่เราอยู่ในหน้าที่ถูกต้อง Τo บอกให้ WordPress แสดงโค้ดของเราภายใต้เงื่อนไขเฉพาะ เราใช้แท็กแบบมีเงื่อนไข

  • if ( ! is_admin() ) return; เงื่อนไขช่วยให้มั่นใจว่าหากเราไม่ได้อยู่ในพื้นที่ผู้ดูแลระบบ โค้ดของเราจะไม่ทำงาน
  • if ( $query->query['post_type'] != $post_type ) ตรวจสอบว่าเราทำงานกับประเภทโพสต์ที่เรากำหนดไว้ในตัวแปร $post_type หรือไม่ ในกรณีของเรา post .
  • $search_term = $query->query_vars['s']; เป็นที่ที่เราเก็บสตริงการค้นหาไว้ในตัวแปรจากนั้นเราตั้งค่าให้ว่างอีกครั้ง $query->query_vars['s'] = ''; มิฉะนั้นจะไม่พบสิ่งใด

ด้วยการอัปเดตเหล่านี้ หากคุณรีเฟรชการค้นหาครั้งล่าสุด คุณจะได้ผลลัพธ์ที่ถูกต้อง ในกรณีของเรา เราจะเห็นโพสต์ 'โพสต์ 1' ในผลลัพธ์ซึ่งรวมถึงรายการฟิลด์ที่กำหนดเอง 'แหล่งที่มา': 'https://dev. wordpress.org /reference/functions/add_post_meta/'

ปรับปรุงการค้นหาผู้ดูแลระบบ wordpress

ขยายคำค้นหาในการค้นหามุมมองด้านหน้า

ตอนนี้เราได้ 'แก้ไข' การค้นหาของผู้ดูแลระบบแล้ว เราสามารถดำเนินการปรับปรุงฟังก์ชันการค้นหาส่วนหน้า เพื่อให้ผู้ใช้เว็บไซต์ของเราสามารถค้นหาฟิลด์ที่กำหนดเองได้

เช่นเดียวกับที่ก่อนหน้านี้การค้นหาของผู้ดูแลระบบจะไม่ให้ผลลัพธ์สำหรับฟิลด์ที่กำหนดเอง การค้นหาส่วนหน้าก็ล้มเหลวในการส่งคืนผลลัพธ์ใดๆ สำหรับฟิลด์ที่กำหนดเอง

เราต้องการให้ผู้ใช้สามารถค้นหาฟิลด์เหล่านี้ได้ ในตัวอย่างนี้ เรามีฟิลด์ 'แหล่งที่มา' ที่กำหนดเองในโพสต์ของเราที่มี URL 'https://dev.wordpress.org/reference/functions/add_post_meta/' หากผู้ใช้ค้นหาคำว่า 'wordpress.org' โพสต์นี้ควรปรากฏในผลลัพธ์ เรามาดูวิธีการทำกัน

รหัสที่จำเป็น

ไปที่ไฟล์ functions.php ของคุณอีกครั้งและคัดลอกโค้ดที่คุณวางก่อนหน้านี้ ตอนนี้ วางโค้ดนี้ไว้ใต้โค้ดนั้นโดยตรง (เพื่อให้คุณมีโค้ดนี้สองชุดใน functions.php ) ตอนนี้ เปลี่ยนชื่อของฟังก์ชันในโค้ดล็อตที่สองนี้เป็นแบบ extend_front_search ควรมีลักษณะดังนี้:

 add_action( 'pre_get_posts', 'extend_admin_search' ); function extend_admin_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( ! is_admin() ) return; if ( $query->query['post_type'] != $post_type ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

ต่อไป เราต้องลบ if ( $query->query['post_type'] != $post_type ) return; สภาพ.

 add_action( 'pre_get_posts', 'extend_front_search' ); function extend_front_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( is_admin() ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

เราเพียงแค่ต้องรักษาเงื่อนไข if( is_admin() ) return; เพื่อให้แน่ใจว่ารหัสจะใช้ได้เฉพาะในส่วนหน้าและเราพร้อมแล้ว

กลยุทธ์ทางเลือก

อีกวิธีหนึ่งในการขยายการค้นหา WordPress เพื่อรวมฟิลด์ที่กำหนดเองคือโดยการแก้ไขแบบสอบถาม SQL

คลาส WP_Query ช่วยคุณได้ โดยแบ่งออกเป็นส่วนๆ ตามที่อธิบายไว้ในบรรทัดที่ 2897 ของ wp-includes/class-wp-query.php

 $clauses = (array) apply_filters_ref_array( 'posts_clauses_request', array( compact( $pieces ), &$this ) ); $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; $groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : ''; $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; $orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : ''; $distinct = isset( $clauses['distinct'] ) ? $clauses['distinct'] : ''; $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; $limits = isset( $clauses['limits'] ) ? $clauses['limits'] : '';

ดังที่เราได้กล่าวไปแล้วในบทความเกี่ยวกับฟิลด์ที่กำหนดเอง ข้อมูลฟิลด์ที่กำหนดเองทั้งหมดจะถูกเก็บไว้ในฐานข้อมูลในตาราง 'postmeta' ซึ่งไม่รวมอยู่ในการค้นหาของ WordPress โดยค่าเริ่มต้น ขั้นตอนแรกของเราคือการ เข้าร่วมสองตารางนี้ โดยใช้รหัสด้านล่าง:

 function join_meta_table( $join ) { global $wpdb; if ( is_search() ) { $join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '..post_id '; } return $join; } add_filter('posts_join', 'join_meta_table' );

เราใช้ posts_join แน่นอนเนื่องจากกรองส่วนคำสั่ง JOIN ของแบบสอบถาม

ต่อไป เราจะใช้ hook ของ posts_where เพื่อแก้ไขส่วน WHERE ของข้อความค้นหาเพื่อให้ตรงกับความต้องการของเรา

 function modify_where_clause( $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 ); } return $where; } add_filter( 'posts_where', 'modify_where_clause' );

สุดท้ายแต่ไม่ท้ายสุด เราต้องป้องกันการทำซ้ำ เพื่อให้บรรลุสิ่งนี้ เราใช้ posts_distinct hook ซึ่งกรองส่วนคำสั่ง DISTINCT ของแบบสอบถาม

 function prevent_duplicates( $where ) { global $wpdb; if ( is_search() ) { return "DISTINCT"; } return $where; } add_filter( 'posts_distinct', 'prevent_duplicates' );

ตอนนี้เรามาดูกันว่าจะเกิดอะไรขึ้นในส่วนหน้าหากเราค้นหาสตริง “wordpress.org”

ค้นหา wordpress ที่ส่วนหน้า

ตามคาด คราวนี้ผลลัพธ์ถูกต้อง การค้นหา WordPress พบ "โพสต์ 1" เนื่องจากมีฟิลด์ 'แหล่งที่มา' ที่มีค่า 'https://dev. wordpress.org /reference/functions/add_post_meta/

ประเภทโพสต์ที่กำหนดเองในผลการค้นหา WordPress

อีกสิ่งหนึ่งที่คุณอาจต้องการทำคือทำให้ค้นหาประเภทโพสต์ที่กำหนดเองได้ (หากคุณไม่แน่ใจว่าจะสร้างประเภทโพสต์ที่กำหนดเองได้อย่างไร ตรวจสอบให้แน่ใจว่าคุณได้อ่านบทความของเราเกี่ยวกับเรื่องนี้ที่นี่)

สมมติว่าเราได้สร้างประเภทโพสต์ที่กำหนดเองชื่อ 'books' และเราต้องการให้โพสต์ประเภทนี้ปรากฏในผลการค้นหา ครั้งนี้เราไม่ต้องสร้างแบบสอบถาม SQL ขึ้นใหม่ แต่ให้กำหนดประเภทโพสต์ใหม่ใน hook pre_get_posts ดังที่แสดงด้านล่างเท่านั้น ต้องวางรหัสอีกครั้งในไฟล์ functions.php

 function tg_include_custom_post_types_in_search_results( $query ) { if ( $query->is_main_query() && $query->is_search() && ! is_admin() ) { $query->set( 'post_type', array( 'post', 'books' ) ); } } add_action( 'pre_get_posts', 'tg_include_custom_post_types_in_search_results' );

สิ่งที่เราทำที่นี่คือการเพิ่มประเภทโพสต์ที่ต้องการเพื่อรวมไว้ในผลการค้นหาเป็นอาร์กิวเมนต์ของ hook post_type

หากคุณต้องการแยกประเภทออก ให้ลบออกจากอาร์เรย์

บทสรุป

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