Xóa (các) trang phụ huynh khỏi Permalink


7

Các câu hỏi tương tự đã được hỏi trước đây, nhưng không có câu trả lời nào phù hợp.

Tôi có: site.com/parent-page/child-page và muốn có:site.com/child-page

Vì vậy, tôi muốn độc quyền có permalinks với độ sâu 1, không sử dụng menu tùy chỉnh nhưng vẫn "phân cấp" các trang của tôi trong chế độ xem tất cả các trang và với phụ huynh / thứ tự trong các thuộc tính trang.

Giải pháp cũng cần hoạt động tự động, do đó, không thay đổi permalinks trên mỗi trang với plugin "Permalinks tùy chỉnh".

Đây là những gì tôi cần, và tôi chắc chắn rằng có thể với một vài dòng mã trong functions.phpđó, tôi đã tìm thấy ở nơi khác nhưng chỉ cho các bài đăng để xóa danh mục, nhưng không hoạt động cho các trang để loại bỏ cha mẹ.

Đây là mã như vậy, mà có lẽ có thể được thay đổi để làm việc cho các trang ?

add_filter( 'post_link', 'remove_parent_cats_from_link', 10, 3 );
function remove_parent_cats_from_link( $permalink, $post, $leavename ) {
    $cats = get_the_category( $post->ID );
    if ( $cats ) {
        // Make sure we use the same start cat as the permalink generator
        usort( $cats, '_usort_terms_by_ID' ); // order by ID
        $category = $cats[0]->slug;
        if ( $parent = $cats[0]->parent ) {
            // If there are parent categories, collect them and replace them in the link
            $parentcats = get_category_parents( $parent, false, '/', true );
            // str_replace() is not the best solution if you can have duplicates:
            // example.com/luxemburg/luxemburg/ will be stripped down to example.com/
            // But if you don't expect that, it should work
            $permalink = str_replace( $parentcats, '', $permalink );
        }
    }
    return $permalink;
}

Câu trả lời:


1

một tìm kiếm nhanh cho thấy một chủ đề stackexchange khác về điều này và nó đã sử dụng mã này để dọn sạch permalink của cha mẹ / tổ tiên:

function wpse_101072_flatten_hierarchies( $post_link, $post ) {
    if ( 'page' != $post->post_type )
        return $post_link;

    $uri = '';
    foreach ( $post->ancestors as $parent ) {
        $uri = get_post( $parent )->post_name . "/" . $uri;
    }

    return str_replace( $uri, '', $post_link );
}
add_filter( 'post_type_link', 'wpse_101072_flatten_hierarchies', 10, 2 );

Bạn có thể tìm thấy cuộc thảo luận đó tại đây: Xóa sên cha khỏi URL trên loại bài đăng tùy chỉnh


Điều này thật thú vị :) Những người có cha mẹ vẫn hiển thị với cha mẹ, nhưng những người không có cha mẹ dẫn đến 404: D Và cũng nói về các loại bài đăng tùy chỉnh, và cuối cùng Sebastian cũng hỏi tôi câu hỏi như thế nào, làm thế nào để làm cho nó hoạt động cho các trang, mà chưa được trả lời. Vì vậy, tôi vẫn hy vọng nó sẽ tìm thấy một câu trả lời.
Sofian

1

tl; dr = Cài đặt plugin miễn phí " Permalinks Customizer ". Đặt "Cài đặt PostTypes" cho Trang thành ' % postname% ' và sau đó chỉnh sửa các trang để sửa đổi Permalinks tương ứng. Tôi đã thử nghiệm điều này với một kịch bản của các trang phân cấp và không phân cấp, và ivt hoạt động mà không gặp bất kỳ khó khăn nào.


Câu trả lời dài hơn
Kịch bản của OP dựa trên một trang chung và, theo quan điểm của tôi, điều này đưa ra một thách thức quan trọng, có thể là không thể, vì giải pháp phải được áp dụng ẩn danh. Đó là, không có "trình kích hoạt" hoặc "xử lý" có thể dự đoán nào có thể được sử dụng để tạo ra một bản viết lại sẽ tạo ra một yêu cầu hợp lệ. Một loại bài đăng tùy chỉnh có thể hoạt động (hoặc không), nhưng OP đã loại trừ đây là một tùy chọn này. Phương pháp đề xuất của OP cũng có nguy cơ trùng lặp các trang. Xem xét tất cả những điều này, người ta có thể đề xuất rằng phương pháp đề xuất của OP không có giá trị cũng không khôn ngoan - nhưng tôi sẽ để điều đó cho OP tự phán xét.

OP khá chính xác; câu trả lời được đề xuất bởi Nicu không hoạt động vì dòng này có tác dụng xây dựng uri từ nguồn gốc ban đầu.

$uri = get_post( $parent )->post_name . "/" . $uri;

Tôi đã ( không thành công ) làm việc trên một bộ lọc đáp ứng yêu cầu của OP. Tôi cung cấp nó ở đây chỉ trong trường hợp nó có thể hữu ích cho người khác. Đối với mục đích tham khảo, tất cả các thử nghiệm của tôi đã được thực hiện với Permalinks được đặt thành "Tên bài đăng" và mỗi lần tôi điều chỉnh bộ lọc, tôi làm mới trang Permalinks. Tôi đã tạo ra bốn trang. Tổ tiên, Cha mẹ (cha mẹ = 'Tổ tiên'), Con cái (cha mẹ = 'Cha mẹ') và Giao thông vận tải (không có cha mẹ).

Tôi thấy rằng việc tạo ra uri là phần dễ dàng, hoặc ít nhất có vẻ dễ dàng. Sự thay thế này (trong hàm.php) hoạt động:

function wpse_182006_pages_permalink( $link, $post_id) {

    // get the post_type and evaluate
    $posttype = get_post_field( 'post_type', $post_id, 'display' );
    if ($posttype !== 'page'){
        return link;
    }

    // build the uri from the slug
    $slugname = get_post_field( 'post_name', $post_id, 'display' );
    $slugname = $slugname."/";
    $link = home_url($slugname);
    return $link;

}

add_filter( 'page_link', 'wpse_182006_pages_permalink', 10, 3 );

Cả hai trang "Tổ tiên" và "Giao thông vận tải" đều mở bình thường.
Các trang "Cha mẹ" và "Trẻ em" (mỗi trang có trang 'cha mẹ) mở ra lỗi 404.
Nếu bạn xem Truy vấn yêu cầu (tham khảo bên dưới), rõ ràng 404 được tạo vì WordPress diễn giải "trang" là "bài đăng" và không có bài đăng nào như vậy tồn tại. Lưu ý rằng ID bài đăng không được sử dụng trong các truy vấn không thành công. Có lẽ đây là chìa khóa để viết lại thành công, nhưng nó vượt quá khả năng của tôi.

Để tham khảo, đây là các chi tiết "yêu cầu" cho "Tổ tiên":
Truy vấn phù hợp = 'pagename = tổ tiên & page ='
Quy tắc phù hợp = '(.?. +?) (?: / ([0-9] +))? /? $ '
Truy vấn chính = CHỌN wp_posts. * TỪ wp_posts WHERE 1 = 1 AND (wp_posts.ID =' 46 ') VÀ wp_posts.post_type =' page 'ĐẶT HÀNG THEO wp_posts.post_date DESC

Để so sánh, đây là các chi tiết "yêu cầu" cho "Trẻ em":
Truy vấn phù hợp = 'name = children & page ='
Quy tắc phù hợp = '([^ /] +) (?: / ([0-9] +))? /? $ '
Truy vấn chính = CHỌN wp_posts. * TỪ wp_posts WHERE 1 = 1 VÀ wp_posts.post_name =' cha mẹ 'VÀ wp_posts.post_type =' post 'ĐẶT HÀNG B wNG wp_posts.post_date DESC


FWIW, bằng cách đặt permalink theo cách này, permalink không thể chỉnh sửa. Trước:
nhập mô tả hình ảnh ở đây

Sau:
nhập mô tả hình ảnh ở đây

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.