การนำ Custom Post Type Slug ออกจาก WordPress Permalink

โดยปกติแล้ว เมื่อเราทำการสร้างธีมของเราขึ้นมาและต้องการสร้าง 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 ด้วย หากเราใส่ฟังก์ชั่นใดฟังก์ชั่นหนึ่งเพียงตัวเดียว ลิงก์ของเราก็จะไม่สามารถเปลี่ยนได้

หากใครสนใจก็ลองใช้ดูก็ได้นะครับ