Tùy chỉnh loại điểm cuối permalink


8

Tôi có một loại bài đăng tùy chỉnh được gọi là "đích" và tôi đã đặt mặt nạ EP cho loại bài đăng thành mặc định EP_PERMALINK. Tôi đã thêm một vài điểm cuối như sau:

add_filter( 'query_vars', 'add_query_vars');

function add_query_vars($vars){
    $vars[] = "tours";
    $vars[] = "activities";
    return $vars;
}

add_action('init', 'add_endpoints');

function add_endpoints(){
    global $wp_rewrite; 

    add_rewrite_endpoint('tours', EP_PERMALINK);
    add_rewrite_endpoint('activities', EP_PERMALINK);

    $wp_rewrite->flush_rules();
}

Bây giờ nếu tôi kiểm tra điều này trên một bài đăng bình thường, nó sẽ chuyển hướng đến mẫu mà tôi cần (Tôi có một chuyển hướng mẫu cho móc mẫu đơn)

I E. somesite.com/test-carget/test/activities/

Nhưng đối với loại bài đăng (được phân cấp), nó chỉ xóa điểm cuối khỏi url và nằm trên mẫu single-Destination.php

I E. somesite.com/destination/south-africa/kruger-national-park/activities/

trở thành

somesite.com/destination/south-africa/kruger-national-park/

Bất kỳ trợ giúp hoặc hướng dẫn sẽ được đánh giá rất cao. Tôi đã vật lộn với điều này trong nhiều giờ và không có kết quả :(

Cảm ơn

Câu trả lời:


25

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_endpointchă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_endpointschứ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_PAGESmặ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 requestvà 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.


1
Cảm ơn cho phản ứng tuyệt vời! Tôi đã thực hiện các sửa đổi theo bài viết và hướng dẫn của bạn. Nhưng có vẻ như wordpress đang chuyển hướng / xóa điểm cuối và bất kỳ vars nào sau khi tải url. Tôi không chắc chắn nếu nó là một chuyển hướng chính tắc hoặc những gì. Nhưng nó chỉ loại bỏ các điểm cuối đã đăng ký. Nếu tôi thêm một cái gì đó arb vào cuối url, tôi nhận được 404. Nhưng các chuyến tham quan hoặc hoạt động sẽ bị xóa hoặc chuyển hướng đến url đích duy nhất. :(
Charl Pretorius

1
Có vẻ như tôi đã tìm thấy vấn đề. Phải làm với các cài đặt permalink. Tôi đã có một cài đặt tùy chỉnh - /% danh mục% /% postname% /. Nhưng nếu tôi đặt nó thành /% postname% / nó hoạt động, không biết tại sao, nhưng sẽ có một cái nhìn. Cảm ơn \ 0 /
Charl Pretorius

1
Bạn nên thử chuyển nó trở lại /% danh mục% /% postname% / ngay bây giờ và nó có thể hoạt động trở lại. Tôi nghi ngờ lý do WP tước bỏ nội dung của bạn là vì bạn cần xóa các quy tắc viết lại. (Có thể.)
chrisguitarguy

1
Tôi đã có một thiết lập permalink tùy chỉnh là tốt. Tôi vừa truy cập Cài đặt Permalinks và nhấp vào Lưu Thay đổi mà không thay đổi bất cứ điều gì, và sau đó điểm cuối hoạt động.
yitwail

Điều này giúp tôi rất nhiều! Cảm ơn anh rất nhiều!
fdrv
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.