Một vài điều. Đầu tiên, tên hàm của bạn cần được thêm tiền tố vào một cái gì đó duy nhất. WordPress là một hệ sinh thái lớn và có lẽ ai đó đã sử dụng tất cả các tên hàm chung mà bạn có thể nghĩ ra.
Thứ hai, add_rewrite_endpoint
chăm sóc thêm các biến truy vấn cho bạn. Vì vậy, bạn không cần điều này:
add_filter( 'query_vars', 'add_query_vars');
function add_query_vars($vars){
$vars[] = "tours";
$vars[] = "activities";
return $vars;
}
Xóa các quy tắc viết lại trên mỗi tải không phải là một ý tưởng tốt. Điều này chỉ cần được thực hiện một lần sau khi quy tắc của bạn đã được thêm vào. Giống như kích hoạt plugin. Vì vậy, add_endpoints
chức năng của bạn có thể được rút ngắn thành điều này (với tên hàm tốt hơn cho mỗi điểm ở trên).
<?php
add_action('init', 'wpse42279_add_endpoints');
function wpse42279_add_endpoints()
{
add_rewrite_endpoint('tours', EP_PERMALINK);
add_rewrite_endpoint('activities', EP_PERMALINK);
}
Mà hoạt động tốt cho bài viết. Nếu bạn muốn nó hoạt động trên các trang hoặc bất kỳ loại bài đăng phân cấp nào khác, bạn sẽ phải sử dụng EP_PAGES
mặt nạ điểm cuối.
<?php
add_action('init', 'wpse42279_add_endpoints');
function wpse42279_add_endpoints()
{
add_rewrite_endpoint('tours', EP_PAGES);
add_rewrite_endpoint('activities', EP_PAGES);
}
Nhưng điều đó vẫn không làm việc như mong đợi cho bạn. Điểm cuối đặt biến truy vấn của họ bằng với bất cứ điều gì đến sau nó. Vì vậy, nếu URL của bạn là ...
yoursite.com/some-country/some-city/activities/asdf
các hoạt động biến truy vấn sẽ là asdf. Nếu không có gì tiếp theo activities
, var truy vấn của bạn sẽ trống (nhưng được đặt), vì vậy nó sẽ luôn đánh giá là sai khi bạn cố bắt nó ...
<?php
add_action( 'template_redirect', 'wpse42279_catch_vars' );
function wpse42279_catch_vars()
{
if( get_query_var( 'tours' ) )
{
// do stuff!
exit();
}
}
Bạn có thể khắc phục điều này bằng cách lọc request
và thay đổi giá trị của các biến tham quan và hoạt động của bạn thành đúng nếu chúng được đặt.
<?php
add_filter( 'request', 'wpse42279_filter_request' );
function wpse42279_filter_request( $vars )
{
if( isset( $vars['tours'] ) ) $vars['tours'] = true;
if( isset( $vars['activities'] ) ) $vars['activities'] = true;
return $vars;
}
Bạn nên xem hướng dẫn này về API Rewrite tôi đã viết. Tuy nhiên, các phần có liên quan cho câu hỏi của bạn được tóm tắt ở trên.