Làm cách nào để tạo các tuyến URL tùy chỉnh?


50

Tôi có một yêu cầu rất đặc biệt, hy vọng, tôi có thể giải thích nó mà không quá khó hiểu. Tôi đã tạo một mẫu trang nơi tôi liệt kê một số thuộc tính tôi nhận được từ tệp XML bên ngoài, cho đến nay không có vấn đề gì, giả sử URL giống như sau:

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

Mỗi thuộc tính có một liên kết sẽ chuyển hướng người dùng đến trang "Tài sản duy nhất" hiển thị thêm thông tin về nó. Tôi đã tự hỏi nếu có một cách để tạo liên kết như thế này:

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

Trường hợp 123sẽ là id của tài sản. Vì vậy, nếu tôi có URL như properties/some_idtôi muốn có thể tải tệp xem (như single.phphoặc page.phptệp) nhưng cụ thể cho điều kiện URL này.

Điều này có thể không?

Câu trả lời:


57

Thêm phần này vào hàm.php của chủ đề hoặc đặt nó vào một plugin .

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;
}

Điều này thêm một quy tắc viết lại, điều hướng các yêu cầu đến /properties/với bất kỳ tổ hợp số nào theo sau pagename properties, với bộ var truy vấn property_id. Chỉ cần chắc chắn truy cập trang cài đặt permalinks của bạn và lưu để xóa các quy tắc viết lại, vì vậy quy tắc mới này sẽ được bao gồm.

Trong page-properties.phpmẫu của bạn , get_query_var('property_id')sẽ trả về id thuộc tính nếu nó được đặt, nếu nó không hiển thị trang thuộc tính mặc định.


4
Đây là ĐÓNG để làm việc cho tôi nhưng tôi cần thêm: add_filter ('init', 'flushRules'); hàm flushRules () {toàn cầu $ wp_rewrite; $ wp_rewrite-> flush_rules (); }
tooshel

19
@tooshel bạn chắc chắn không muốn xóa các quy tắc trên mỗi yêu cầu, đó là một hoạt động đắt tiền và sẽ làm chậm trang web của bạn để thu thập dữ liệu. bạn chỉ cần xóa quy tắc một lần, khi kích hoạt plugin hoặc chỉ bằng cách truy cập trang cài đặt permalinks.
Milo

Vâng, tôi hiểu điều đó. . . Nhưng khi bạn đang thử nghiệm thì thật tuyệt khi nó ở đó!
tooshel

3
Một regrec url viết lại thông minh hơn có thể được ^properties/([0-9]+)/?. Nếu không, nó sẽ khớp với một cái gì đó nhưexample/properties/1
Ryan Taylor

@RyanTaylor bạn có chắc về điều đó không? Nó không chụp example/properties/1khi tôi kiểm tra nó.
Milo

9

Một cách khác để làm điều đó:

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 / thêm quy tắc viết lại

Codex Rewrite API / thêm thẻ viết lại


2
Câu trả lời được chấp nhận hoạt động với 4.7 (và 4.8), không chắc tại sao bạn nghĩ nó không. Mã của bạn về cơ bản đang làm điều tương tự, add_rewrite_tagthêm var truy vấn vào cùng một mảng với query_varsbộ lọc.
Milo

@Milo có thể nó không hoạt động với tôi, nhưng tôi không có tiện ích 4.7 nữa nên tôi không thể kiểm tra. Tôi sẽ chỉnh sửa câu trả lời của tôi.
Christian Lescuyer

@Milo Mặc dù cá nhân tôi thích viết lại thẻ, nhưng vẫn kiểm tra câu trả lời được chấp nhận và nó hoạt động. Chỉ là một số thị hiếu cá nhân, mặc dù.
Jack Johansson

1
Thẻ viết lại @JackJohansson là cần thiết khi bạn đang sử dụng nó trong một hoán vị . Đó chỉ là một chút dữ liệu mà WordPress không bao giờ sử dụng trong trường hợp này.
Milo

cả hai quy tắc có thể được thêm vào cùng một phương thức, kết thúc bằng chức năng sạch hơn và hữu ích hơn để quay lại và tìm hiểu nếu thực hiện công việc bảo trì
eballeste
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.