จะสร้างเส้นทาง URL ที่กำหนดเองได้อย่างไร


50

ฉันมีข้อกำหนดที่แปลกประหลาดมากหวังว่าฉันสามารถอธิบายได้โดยไม่สับสนเกินไป ฉันสร้างเทมเพลตหน้าที่ฉันแสดงรายการคุณสมบัติบางอย่างที่ฉันได้รับจากไฟล์ XML ภายนอกดังนั้นจึงไม่มีปัญหาสมมติว่า URL เป็นดังนี้:

http://www.example.com/properties/

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

http://www.example.com/properties/123

สถานที่123นั้นจะเป็นรหัสของทรัพย์สิน ดังนั้นหากฉันมี URL อย่างที่properties/some_idฉันต้องการจะสามารถโหลดไฟล์มุมมอง (เช่นsingle.phpหรือpage.phpไฟล์) แต่เฉพาะกับเงื่อนไข URL นี้

เป็นไปได้ไหม

คำตอบ:


57

เพิ่มไปยัง functions.php ธีมของคุณหรือวางไว้ในปลั๊กอิน

add_action( 'init', 'wpse26388_rewrites_init' );
function wpse26388_rewrites_init(){
    add_rewrite_rule(
        'properties/([0-9]+)/?$',
        'index.php?pagename=properties&property_id=$matches[1]',
        'top' );
}

add_filter( 'query_vars', 'wpse26388_query_vars' );
function wpse26388_query_vars( $query_vars ){
    $query_vars[] = 'property_id';
    return $query_vars;
}

นี้จะเพิ่มการเขียนกฎที่นำการร้องขอไปยัง/properties/มีการรวมกันของตัวเลขต่อไปนี้เพื่อ pagename ใด ๆpropertiesกับแบบสอบถาม var property_idชุด เพียงให้แน่ใจว่าได้เยี่ยมชมหน้าการตั้งค่า Permalinks ของคุณและบันทึกเพื่อล้างกฎการเขียนซ้ำดังนั้นกฎใหม่นี้จะรวมอยู่

ในpage-properties.phpเทมเพลตของคุณget_query_var('property_id')จะส่งคืนรหัสคุณสมบัติหากตั้งค่าไว้หากไม่แสดงหน้าคุณสมบัติเริ่มต้น


4
นี่เป็น CLOSE สำหรับการทำงานสำหรับฉัน แต่ฉันต้องการเพิ่ม: add_filter ('init', 'flushRules'); ฟังก์ชั่น flushRules () {global $ wp_rewrite; $ wp_rewrite-> flush_rules (); }
tooshel

19
@ tooshel คุณไม่ต้องการล้างกฎในทุกคำขอเป็นการดำเนินการที่มีราคาแพงและจะทำให้ไซต์ของคุณช้าลงในการรวบรวมข้อมูล คุณจะต้องล้างกฎเพียงครั้งเดียวเมื่อเปิดใช้งานปลั๊กอินหรือเพียงไปที่หน้าการตั้งค่าลิงก์ถาวร
Milo

ใช่ฉันเข้าใจแล้ว . . แต่เมื่อคุณทำการทดสอบมันดีที่มีอยู่ในนั้น!
tooshel

3
URL ที่เขียน^properties/([0-9]+)/?ซ้ำได้อย่างชาญฉลาดอาจเป็น ไม่เช่นนั้นจะจับคู่สิ่งที่ต้องการexample/properties/1
Ryan Taylor

@ RyanTaylor คุณแน่ใจหรือไม่ มันไม่จับexample/properties/1เมื่อฉันทดสอบ
Milo

9

อีกวิธีในการทำ:

add_action('init', function() {
    add_rewrite_rule( '^properties/([0-9]+)/?',
                      'index.php?pagename=properties&property_id=$matches[1]',
                      'top' );
}, 10, 0);

add_action('init', function() {
    add_rewrite_tag( '%property_id%', '([^&]+)' );
}, 10, 0);

Codex Rewrite API / เพิ่มกฎการเขียนซ้ำ

Codex Rewrite API / เพิ่มแท็กเขียนใหม่


2
คำตอบที่ยอมรับนั้นใช้ได้กับ 4.7 (และ 4.8) ไม่แน่ใจว่าทำไมคุณถึงคิดว่ามันไม่ รหัสของคุณทำสิ่งเดียวกันโดยหลักแล้วadd_rewrite_tagเพิ่มคิวรีแบบสอบถามไปยังอาร์เรย์เดียวกันกับquery_varsตัวกรอง
Milo

@Milo มันอาจไม่ได้ผลสำหรับฉัน แต่ฉันไม่มี 4.7 อีกต่อไปดังนั้นฉันจึงไม่สามารถตรวจสอบได้ ฉันจะแก้ไขคำตอบของฉัน
Christian Lescuyer

@Milo แม้ว่าฉันจะชอบเขียนแท็กใหม่โดยส่วนตัว แต่ก็ยังทดสอบคำตอบที่ยอมรับได้และใช้งานได้ เพียงแค่รสนิยมส่วนตัวบางอย่าง
Jack Johansson

1
@JackJohansson เขียนแท็กเป็นสิ่งที่จำเป็นเมื่อคุณใช้มันใน permastruct มันเป็นเพียงข้อมูลเพิ่มเติมที่ WordPress ไม่เคยใช้ในกรณีนี้
Milo

กฎทั้งสองสามารถเพิ่มไปยังวิธีการเดียวกันที่สิ้นสุดในฟังก์ชั่นที่สะอาดและมีประโยชน์มากขึ้นที่จะกลับไปมาและคิดออกทำผลงานการบำรุงรักษาถ้า
eballeste
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.