Điểm cuối động


8

Tôi có một bảng cơ sở dữ liệu bên ngoài WordPress mà tôi cần để tạo điểm cuối cho. Tôi đã tạo một trang /cars/nơi tôi dự định sử dụng một mẫu trang để tạo liên kết. Tôi muốn cho url trông giống như /cars/camaro/( /cars/%model%/). Ban đầu tôi nghĩ rằng tôi có thể làm điều đó với các điểm cuối nhưng không chắc chắn làm thế nào để làm cho chúng động dựa trên con sên được kéo từ Bảng mô hình. Tôi cũng không chắc liệu việc sử dụng thẻ Permalink Architecture có dễ dàng hơn hay tốt hơn.

Tôi thậm chí không hoàn toàn chắc chắn bắt đầu từ đâu, tôi đã tạo các điểm cuối "tĩnh" trước đây để tôi có cơ sở để nhảy ra nhưng khi tôi vào requestbộ lọc, tôi không biết phải làm gì.

/**
 * Add endpoint to handle models
 */
function theme_endpoints() {
    add_rewrite_endpoint( 'cars', 'EP_PAGES' );     // Since cars is our base
}
add_action( 'init', 'theme_endpoints' );

/**
 * Filter request variables
 * @param array $vars
 * @return array $vars
 */
function theme_perma_requests( $vars ) {

    if( isset( $vars['model'] ) ) {
        $vars['model_template'] = true;
    }

    return $vars;
}
add_filter( 'request', 'theme_perma_requests' );

Ý tôi là, điều này cho phép tôi vào template_include của tôi (đó là lý do tại sao tôi đã thêm model_templatebiến) nhưng nó không thực sự viết lại URL. Vì vậy, sau đó tôi bắt đầu chơi vớiadd_rewrite_rule()

/**
 * Theme rewrite rules
 */
function theme_rewrite_rules() {
    add_rewrite_rule( '^cars/([^/]*)/?$', 'index.php?page_id=8&model=$matches[0]', 'top' );
}
add_action( 'init', 'theme_rewrite_rules' );

Tôi đã xóa các permalinks của mình nhưng việc viết lại dường như không có hiệu lực, tôi chỉ có thể cho rằng có gì đó không đúng với cách viết quy tắc.


Tôi có cần cả quy tắc điểm cuối và quy tắc viết lại hay chỉ một trong hai? Tôi đang đi về tất cả sai? Làm thế nào tôi có thể đạt được cấu trúc permalink của /cars/camaro/?


Tôi không có nhiều kinh nghiệm với điều này nhưng tôi nghĩ đó add_rewrite_tag()là một điểm khởi đầu tốt.
Sisir

Câu trả lời:


6

10up kỹ thuật thực hành tốt nhất như một ví dụ tuyệt vời về cách đạt được điều đó. Về cơ bản, bạn thêm thẻ viết lại mới và quy tắc viết lại mới và sau đó sử dụng hành động template_redirect mà bạn trả lại hành động tùy chỉnh của mình.

Đây là mã:

add_action( 'init', function() {
  add_rewrite_tag( '%model%', '([^/]+)' );
  add_rewrite_rule( 'cars/([^/]+)/?', 'index.php?model=$matches[1]', 'top' );
} );

add_action( 'template_redirect', function() {
  global $wp_query;

  $model = $wp_query->get( 'model' );

  if ( ! empty( $model ) ) {
    // Return stuff here
  }
} );

Đừng quên xả permalinks trước khi thử điểm cuối mới của bạn! Sử dụng wp-cli:

wp rewrite flush

Hoặc sử dụng UI quản trị viên: http: //example.local/wp-admin/options-permalink.php và nhấp vào lưu.


Tôi quên rằng câu hỏi này tồn tại và chạy qua nó một lần nữa để tìm kiếm một giải pháp. Có vẻ như điều này hoàn toàn hoạt động - sạch sẽ, đơn giản và đơn giản đáng ngạc nhiên. 10up có một hướng dẫn về điều này bạn có thể liên kết đến? Cảm ơn rất nhiều!
Howdy_McGee


Cảm ơn bạn đã giải quyết. Nó tuyệt đối những gì tôi đang tìm kiếm. Nhưng tôi cần thêm một chút trợ giúp với chủ đề của mình. Ngay bây giờ quy tắc này gửi người dùng đến index.php của tôi, trong khi tôi muốn người dùng hạ cánh trên trang cụ thể và chỉ cần sử dụng tham số chuỗi truy vấn. Ví dụ: mywebsite.com/parentpage/childpage/somevalue/ để thực sự truy cập: mywebsite.com/parentpage/childpage/ và "somevalue" sẽ được sử dụng làm biến trong trang này. Điều này có thể đạt được bằng cách sử dụng phương pháp này? Cảm ơn!
Shir Gans
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.