เพิ่มส่วนขยาย. html (dot HTML) ให้กับประเภทโพสต์ที่กำหนดเอง


10

มีวิธีใดที่จะเพิ่ม.htmlส่วนขยายไปยังประเภทโพสต์ที่กำหนดเองโดยไม่ต้องปลั๊กอิน ?

สำหรับโพสต์ฉันสามารถใช้/%postname.htmlกับการตั้งค่าลิงก์ถาวร

สำหรับหน้าฉันสามารถใช้:

add_action('init', 'change_page_permalink', -1);
function change_page_permalink() {
    global $wp_rewrite;
    if ( strstr($wp_rewrite->get_page_permastruct(), '.html') != '.html' ) 
        $wp_rewrite->page_structure = $wp_rewrite->page_structure . '.html';
}

สำหรับประเภทโพสต์ที่กำหนดเอง ???

มีชิ้นส่วนของรหัสใด ๆ ที่คล้ายกับโค้ดด้านบนที่อนุญาตให้ฉันเปลี่ยนหรือเพิ่ม.htmlใน url ประเภทโพสต์ที่กำหนดเองได้หรือไม่


5
แค่สงสัยว่าคุณต้องการเพิ่ม. html ด้วยเหตุผลอะไร
Vince Pettit

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

@kaiser คือเพียงเพื่อทราบว่าฉันจะใช้การตั้งค่าลิงก์แบบเดียวกันกับประเภทโพสต์ที่กำหนดเองได้อย่างไร หากฉันตั้งค่า/$postname.htmlสำหรับโพสต์ฉันจะใช้วิธีเดียวกันกับประเภทโพสต์ที่กำหนดเองได้อย่างไร
user983248

คุณไม่ได้อ่านบรรทัดเดียวที่ฉันเขียนในความคิดเห็นใช่ไหม? โปรดแก้ไขรหัสของคุณ ยัง-ใช้งานไม่ได้ในชื่อฟังก์ชั่น ...
kaiser

@kaiser ใช่ฉันทำ แต่ฉันไม่ใช่ Flash และฉันมีปัญหาเกี่ยวกับมือดังนั้นฉันจึงพิมพ์ไม่ได้ตามที่ฉันคิดหรือพูด
user983248

คำตอบ:


8

ดูเหมือนว่าจะใช้งานได้:

สร้างกฎการเขียนpost-type/post-name.htmlซ้ำเช่น คุณสามารถใช้อาร์เรย์เพื่อสร้างกฎสำหรับชุดโพสต์บางประเภทแทนที่จะทำตามกฎสำหรับโพสต์ทั้งหมด

add_action( 'rewrite_rules_array', 'rewrite_rules' );
function rewrite_rules( $rules ) {
    $new_rules = array();
    foreach ( get_post_types() as $t )
        $new_rules[ $t . '/([^/]+)\.html$' ] = 'index.php?post_type=' . $t . '&name=$matches[1]';
    return $new_rules + $rules;
}

จัดรูปแบบโครงสร้างลิงก์ใหม่สำหรับประเภทโพสต์เหล่านี้

add_filter( 'post_type_link', 'custom_post_permalink' ); // for cpt post_type_link (rather than post_link)
function custom_post_permalink ( $post_link ) {
    global $post;
    $type = get_post_type( $post->ID );
    return home_url( $type . '/' . $post->post_name . '.html' );
}

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

add_filter( 'redirect_canonical', '__return_false' );

ขณะที่คนอื่น ๆ ว่ารอบที่นี่หลังจากที่ทำข้างต้นคุณจะต้องล้างกฎและที่เป็นไปได้โดยไปที่หน้าผู้ดูแลระบบในoptions-permalink.phpDashboard -> Settings -> Permalinks


6
Oi Vinicius แนวทางปฏิบัติในการตอบคำถามที่ดีคือนำหน้าชื่อฟังก์ชันทั้งหมดด้วยwpse_59024_ (รหัสคำถาม)เพื่อหลีกเลี่ยงความขัดแย้งของการคัดลอก / พาสต้า;) . . และมีประโยชน์เพิ่มเติมจากการรู้คำตอบว่ารหัสนั้นเป็นของห้องสมุดตัวอย่างของเราหรือไม่ . . . . +1 ทันที!
brasofilo

รหัสนี้จะเขียนทับตัวกรองอื่น ๆ ที่ใช้post_type_linkตัวกรอง
Tom J Nowell

4

คุณสามารถเพิ่มกฎการเขียนซ้ำสำหรับสิ่งนี้ที่แทนที่ Permalinks ในตัวเช่นสำหรับประเภทโพสต์ที่กำหนดเอง "ผลิตภัณฑ์" ...

add_action('init', 'add_html_ext_to_custom_post_types');
function add_html_ext_to_custom_post_types() {
    add_rewrite_rule('^product/([^/]+)\.html', 'index.php?product=$matches[1]', 'top');
}

(อย่าลืมล้างกฎของคุณด้วยการบันทึกลิงก์ถาวรใหม่หรือใช้flush_rulesตามวิธีที่ @toscho บันทึกด้านบน)

คำเตือน

  • ฉันไม่คิดว่าฟังก์ชั่นthe_permalink()จะใช้สิ่งนี้ดังนั้นคุณอาจต้องเพิ่มตัวกรองpost_linkเพื่อจับลิงก์เหล่านั้น คุณสามารถเพิ่มredirect_canonicalตัวกรองเพื่อเปลี่ยนเส้นทางลิงก์ค่าเริ่มต้นดังนั้น / product / foo และ / product / foo / redirect ไปยัง /product/foo.html
  • คุณจะต้องเพิ่มการเขียนซ้ำเพิ่มเติมสำหรับ URL อื่น ๆ ที่เว็บไซต์ของคุณใช้เช่น URL ฟีดหน้าต่อมา trackbacks ฯลฯ โค้ดด้านบนจะใช้งานได้กับหน้าประเภทโพสต์หลักที่กำหนดเอง

2

หากคุณต้องการปลั๊กอิน WordPress เพื่อจัดการกับงานของคุณให้ตรวจสอบ ประเภทโพสต์ที่กำหนดเอง Permalinksในที่เก็บปลั๊กอิน WordPress ทดสอบกับ WordPress 3.4.1 แล้วมันทำงานได้อย่างสมบูรณ์

หลังจากเปิดใช้งานปลั๊กอินเพียงไปที่แดชบอร์ด -> การตั้งค่า -> Permalinks คุณสามารถเพิ่มการเขียนซ้ำเฉพาะสำหรับแต่ละประเภทโพสต์ที่กำหนดเองที่ลงทะเบียน


3
อย่าล้างกฎการเขียนซ้ำในการโหลดหน้าเว็บทุกครั้ง
fuxia

รหัสนั้นใช้งานไม่ได้และถ้าคุณเพียงแค่คัดลอกและวางรหัสจากxplus3.net/2010/05/20/wp3-custom-post-type-permalinksตรวจสอบให้แน่ใจว่าใช้งานได้ตามที่คาดไว้ -1 สำหรับการไม่ทดสอบ
user983248

@toscho คุณคิดว่าจะทำเช่นนั้นหรือหยุดมันอย่างไร?
user983248

1
flush_rules()ควรถูกเรียกใช้เมื่อ de / เปิดใช้งานเพียงเพราะมันช้ามาก คุณสามารถตรวจสอบ$GLOBALS['wp_rewrite']->rulesเพื่อดูว่ากฎเป็นที่รู้จักอยู่แล้ว
fuxia

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