Hiểu add_rewrite_rule


11

Tôi đang cố gắng để add_rewrite_rulelàm việc để trích xuất một param từ url và chuyển nó đến yêu cầu. Nhìn thấy một số bài viết về điều này, nhưng dường như không thể làm cho nó hoạt động.

Nếu một url bắt đầu bằng một chuỗi nhất định, tôi muốn xóa nó khỏi url và chuyển nó dưới dạng một tham số truy vấn.

Ví dụ url yêu cầu:

http://domain.com/foo/my_page

Điều này sẽ được chuyển đổi thành

http://domain.com/my_page?param=foo

Nếu 'foo' không có mặt, nó chỉ nên được thực hiện như một yêu cầu bình thường. Logic này nên áp dụng cho bất kỳ url trang hoặc url loại bài đăng tùy chỉnh trên trang web của tôi (về cơ bản là foo / *). Nghĩ rằng nó sẽ hoạt động như một thông qua, nếu url có 'foo' loại bỏ nó và sau đó chuyển qua Wordpress đến điều bình thường.

Tôi đã có 'param' trong dạng truy vấn được phép.

Tổng cộng, nó sẽ cần phải làm việc như sau:

  • / foo / my_page (Trang)
  • / foo / my_folder / my_page (Trang phụ)
  • / foo / example_type (Lưu trữ bài đăng tùy chỉnh)
  • / foo / example_type / example_post (Bài đăng tùy chỉnh)

bất kỳ URL, có nghĩa là bài viết, danh mục, thẻ, vv, không chỉ pageloại bài đăng, hoặc bất kỳ trang nào? Điều gì về các trang cha / con trong hệ thống phân cấp?
Milo

@Milo Tôi đã làm rõ điều này cho bạn. Tôi chỉ sử dụng các trang và loại bài đăng tùy chỉnh (lưu trữ và các trang duy nhất).
Louis W

Câu trả lời:


8

Một quy tắc cơ bản sẽ hoạt động cho ví dụ của bạn:

function wpd_foo_rewrite_rule() {
    add_rewrite_rule(
        '^foo/([^/]*)/?',
        'index.php?pagename=$matches[1]&param=foo',
        'top'
    );
}
add_action( 'init', 'wpd_foo_rewrite_rule' );

Điều này nhận bất cứ điều gì đến sau foo/và đặt điều đó như pagenamecho truy vấn, và sau đó paramnhận giá trị tĩnh foo. Nếu bạn cần các mẫu URL khác nhau, bạn sẽ cần các quy tắc bổ sung cho từng mẫu duy nhất. Tham khảo WP_Querytài liệu cho các lọ truy vấn khác nhau có thể được đặt trong các quy tắc viết lại. Đừng quên xóa quy tắc viết lại sau khi thêm quy tắc mới. Điều này có thể được thực hiện bằng cách truy cập trang Cài đặt Permalinks.

Bây giờ truy cập URL ví dụ của bạn:

http://domain.com/foo/my_page

sẽ tải đúng trang, nhưng nó sẽ không hoạt động chính xác như truy cập:

http://domain.com/my_page?param=foo

bởi vì khi sử dụng viết lại nội bộ, paramđược đặt trong $wp_queryđối tượng truy vấn, không phải siêu lớp $_GET. Nếu bạn cần làm việc với mã đang tìm kiếm một giá trị $_GET, bạn sẽ cần thêm một bước để đặt giá trị đó:

function wpd_foo_get_param() {
    if( false !== get_query_var( 'param' ) ){
        $_GET['param'] = get_query_var( 'param' );
    }
}
add_action( 'parse_query', 'wpd_foo_get_param' );

Một phương pháp khác để xem xét là sử dụng điểm cuối, do đó, /foo/sẽ là phần cuối của URL chứ không phải là tiền tố. Ưu điểm của việc này là API add_rewrite_endpointđơn giản hóa việc thêm tất cả các quy tắc bạn cần, bao gồm cả việc kích hoạt phân trang.


Cảm ơn đã giải thích thông qua. Có vẻ gần, hoạt động cho các trang nhưng cho tôi một lỗi 404 để lưu trữ bài đăng tùy chỉnh và các url đơn.
Louis W

vâng, như tôi đã nói, bạn cần thêm các quy tắc bổ sung phù hợp với từng mẫu đó. Tôi không biết những URL đó trông như thế nào trên thiết lập của bạn.
Milo

Tôi có một loại trang tùy chỉnh có tên 'dự án' có một kho lưu trữ và các trang đơn. Bạn có thể đưa ra một ví dụ cho điều đó, và tôi có thể làm cho tất cả những người khác.
Louis W

Ngoài ra, nó không xuất hiện để làm việc cho các trang phụ.
Louis W

1
Chỉnh sửa câu hỏi của bạn để thêm ví dụ về từng mẫu URL cần quy tắc. Tôi không thực sự lo lắng về câu trả lời của mình được chấp nhận, đôi khi tôi có thể lừa mọi người trả lời câu hỏi của họ bằng cách cho họ một cái gì đó để bắt đầu.
Milo

6

Ok, tôi đã nhận được các ví dụ hoạt động cho cả 3 loại yêu cầu. Phải mất rất nhiều thử nghiệm và làm rối tung để làm cho chúng hoạt động. Tôi đoán Milo rất giỏi trong việc thúc đẩy mọi người trả lời câu hỏi của chính họ.

Sau vô số thay đổi và làm mới các permalinks, tôi nhận ra rằng việc tìm ra các url bên ngoài add_rewrite_url sẽ dễ dàng hơn nhiều và một khi chúng hoạt động thì xác định viết lại. Ví dụ là index.php?param=foo&post_type=example_type.

Một điều hiển nhiên khác, nhưng thêm nó vào đây để nó có thể giúp đỡ người khác. Bạn phải xác định quy tắc loại bài đăng add_rewrite_rule tùy chỉnh TRƯỚC KHI bạn xác định quy tắc ký tự đại diện trang / trang phụ của mình. Tôi đã lãng phí khá nhiều thời gian với cái đó và nghĩ rằng đó là điều chính khiến tôi không hiểu tại sao các quy tắc không hoạt động.

Dưới đây là 3 quy tắc đáp ứng mọi nhu cầu của tôi. Quy tắc Trang / Trang phụ được kết hợp thành một.

// Custom Post Archive
add_rewrite_rule(
    '^foo/example_type/?$',
    'index.php?param=foo&post_type=example_type',
    'top'
    );

// Custom Post Individual
add_rewrite_rule(
    '^foo/example_type/([^/]*)/?$',
    'index.php?param=foo&example_type=$matches[1]',
    'top'
    );

// Pages, Top-Level and Sub-Pages
// This MUST be placed in the code AFTER custom post add_rewrite_rule
add_rewrite_rule(
    '^foo/(.+)/?$',    
    'index.php?param=foo&pagename=$matches[1]',
    'top'
    );

Ngoài ra, những gì tôi đã làm là thiết lập một vòng lặp để thêm nhiều quy tắc loại bài đăng tùy chỉnh. Hãy nhớ rằng, bạn phải xác định loại quy tắc add_rewrite_rule tùy chỉnh TRƯỚC KHI bạn xác định quy tắc ký tự đại diện trang / trang phụ của mình.

$custom_types = array('example_type', 'projects', 'people');

foreach($custom_types as $type) {

    // Custom Post Archive
    add_rewrite_rule(
        '^foo/'.$type.'/?$',
        'index.php?param=foo&post_type='.$type,
        'top'
        );

    // Custom Post Individual
    add_rewrite_rule(
        '^foo/'.$type.'/([^/]*)/?$',
        'index.php?param=foo&'.$type.'=$matches[1]',
        'top'
        );

}

Trình phân tích Rewrite mà Milo chuyển qua khá hữu ích khi cố gắng hiểu rõ hơn cách truy vấn Wordpress cho các trang / bài đăng.


Đến chương trình muộn, nhưng tôi có thể ping bạn cho một ví dụ khác không? Nhắc bạn, tôi hoàn toàn không hiểu tham số thẻ $ của add_rewrite_rule. Không có ý nghĩa gì. Tôi cũng không hiểu ví dụ sử dụng pagename = $ khớp [1] '. HUH??? Tôi có một URL như domain.com/detail?id=2&it=3. Tôi muốn trang là domain.com/detail/2-3/. Bạn có sẵn sàng?
Debbie Kurth
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.