การนำ Custom Post Type Slug ออกจาก WordPress Permalink
73 | | . | ความรู้, WordPress, แก้โค้ด WordPress แก้ไขโค้ด WordPress
โดยปกติแล้ว เมื่อเราทำการสร้างธีมของเราขึ้นมาและต้องการสร้าง Custom Post Type เพื่อใช้งานอย่างใดอย่างหนึ่งขึ้นเช่น เราสร้าง Custom Post Type ชื่อ book เพื่อทำการเก็บข้อมูลเกี่ยวกับหนังสือทั้งหมด ระบบของ WordPress จะทำการสร้างลิงก์ของเราให้เป็นลักษณะดังนี้ www.xxx.com/book/postname โดยลิงก์หรือเพอร์มาลิงก์นี้จะมีคำว่า book คั่นกลางอยู่ เพราะว่าระบบของ WordPress นั้นต้องการป้องกันความสับสนกันระหว่างลิงก์ชของ Custom Post Type และ Post/Page
วิธีการนำ Custom Post Type Slug ออกจาก Permalink
ในบางกรณีเราต้องการ Permalink ที่สั้นและกระชับ เพื่อให้ผู้อ่านสามารถจดจำได้ง่ายเป็นต้น โดยต้องการตัดคำว่า book ออกจากเพอร์มาลิงก์ของเรา ให้เหลือเพียง www.xxx.com/postname อย่างนี้ เราจะทำการแก้ไขโดยทำการเขียนฟังก์ชั่น 2 ฟังก์ชั่นดังต่อไปนี้ลงไปในไฟล์ functions.php
function themename_remove_slug( $post_link, $post, $leavename ) { if ( 'book' != $post->post_type || 'publish' != $post->post_status ) { return $post_link; } $post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link ); return $post_link; } add_filter( 'post_type_link', 'themename_remove_slug', 10, 3 ); function themename_parse_request( $query ) { if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) { return; } if ( ! empty( $query->query['name'] ) ) { $query->set( 'post_type', array( 'post', 'book', 'page' ) ); } } add_action( 'pre_get_posts', 'themename_parse_request' );
ฟังก์ชั่นแรก themename_remove_slug จะเป็นฟังก์ชั่นที่ใช้วิธีการแทนที่โดยทำการแก้ Slug ของเราในที่นี้คือ book ให้เหลือเพียงแค่ Slash ( / ) เท่านั้น ในขณะที่ฟังก์ชั่น themename_parse_request ตัวที่สองนั้น จะทำการตั้งค่า Book ของเรานั้นอยู่ในกลุ่ม Post Type เพื่อให้ WordPress รู้จักว่ามี Post Type นี้ใช้งานใน main query ด้วย หากเราใส่ฟังก์ชั่นใดฟังก์ชั่นหนึ่งเพียงตัวเดียว ลิงก์ของเราก็จะไม่สามารถเปลี่ยนได้
หากใครสนใจก็ลองใช้ดูก็ได้นะครับ