Xóa sên khỏi URL bài đăng loại tùy chỉnh


48

Dường như tất cả các tài nguyên web dựa trên chủ đề loại bỏ một loại sên bài tùy chỉnh tức là

yourdomain.com/CPT-SLUG/post-name 

Hiện nay các giải pháp rất lỗi thời thường tham khảo các bản cài đặt WP phiên bản 3.5. Một phổ biến là:

'rewrite'   => array( 'slug' => false, 'with_front' => false ),  

trong hàm register_post_type của bạn. Điều này không còn hoạt động và là sai lệch. Vì vậy, tôi hỏi cộng đồng vào quý 3 năm 2018 bên bờ vực WordPress 5 ...

Các cách hiện đại và hiệu quả để loại bỏ Slug Loại bài khỏi URL của bài đăng Loại bài tùy chỉnh từ trong đối số viết lại hoặc bất kỳ nơi nào khác là gì?

CẬP NHẬT: Dường như có một số cách để buộc nó hoạt động với regex. Cụ thể câu trả lời từ Jan Beck, bạn nên luôn sẵn sàng giám sát việc tạo nội dung để đảm bảo không có tên trang / bài đăng xung đột nào được tạo ra .... Tuy nhiên tôi tin rằng đây là một điểm yếu lớn trong lõi WP, nơi nó nên được xử lý cho chúng tôi . Cả hai dưới dạng tùy chọn / hook khi tạo CPT hoặc bộ tùy chọn nâng cao cho permalinks. Xin hãy ủng hộ vé theo dõi.

Chú thích: Vui lòng ủng hộ vé trac này bằng cách xem / quảng cáo nó: https://core.trac.wordpress.org/ticket/34136#ticket


Tôi đoán tôi đang gãi đầu về lý do tại sao bạn muốn làm điều đó? Bối rối.
Michael Ecklund

3
@MichaelEcklund vì bất kỳ CPT nào được sử dụng để tạo các trang web đối mặt công khai đều có tên sên bắt buộc trong URL. Thực sự có rất nhiều nhà phát triển wp đang tìm cách loại bỏ sên một cách an toàn.
Ben Racicot

Câu trả lời:


60

Đoạn mã sau sẽ hoạt động, nhưng bạn chỉ cần lưu ý rằng xung đột có thể dễ dàng xảy ra nếu sên cho loại bài đăng tùy chỉnh của bạn giống như sên của trang hoặc bài ...

Đầu tiên, chúng tôi sẽ loại bỏ sên khỏi permalink:

function na_remove_slug( $post_link, $post, $leavename ) {

    if ( 'events' != $post->post_type || 'publish' != $post->post_status ) {
        return $post_link;
    }

    $post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );

    return $post_link;
}
add_filter( 'post_type_link', 'na_remove_slug', 10, 3 );

Chỉ cần loại bỏ sên là không đủ. Ngay bây giờ, bạn sẽ nhận được một trang 404 vì WordPress chỉ mong các bài đăng và trang hoạt động theo cách này. Bạn cũng cần thêm vào như sau:

function na_parse_request( $query ) {

    if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
        return;
    }

    if ( ! empty( $query->query['name'] ) ) {
        $query->set( 'post_type', array( 'post', 'events', 'page' ) );
    }
}
add_action( 'pre_get_posts', 'na_parse_request' );

Chỉ cần thay đổi "sự kiện" thành loại bài đăng tùy chỉnh của bạn và bạn sẽ ổn. Bạn có thể cần phải làm mới permalinks của bạn.


cảm ơn. Bạn có nghĩ rằng điều này là tốt hơn so với việc viết lại bằng tay? Tôi đã thấy giải pháp đó và nó có thể giữ những xung đột mà bạn đề cập đến không?
Ben Racicot

1
Nó thất bại với nginx vì điều kiện 2 != count( $query->query ). Với nginx, bạn có thể có $ query-> truy vấn dưới dạng array('page' => '', 'name' => '...', 'q' => '...'). Vậy @Nate ALLen, ý nghĩa của điều kiện đó là gì?
Fabio Montefuscolo

3
Chúng tôi cần một cái gì đó tốt hơn thế này. Hỗ trợ để loại bỏ sên được tích hợp để chúng ta không thể tạo các URL xung đột sau này. Cách bài viết và trang thông thường tạo URL của họ.
Ben Racicot

3
Có phải chỉ tôi hoặc điều này phá vỡ một số thẻ điều kiện wordpress như is_single () và is_singular ()?
rob-gordon

1
Giải pháp này không may gây ra một số liên kết bị hỏng và blog của tôi đã ngừng hiển thị các bài đăng và chỉ là một trang bình thường. Xem một giải pháp tốt hơn dưới đây của Matt Keys.
Radley Sustaire

20

Viết mã sau vào đăng ký phân loại.

'rewrite' => [
  'slug' => '/',
  'with_front' => false
]

Điều quan trọng nhất mà bạn phải làm sau khi thay đổi mã

Sau khi bạn đã thay đổi tài liệu phân loại loại bài đăng tùy chỉnh của mình, hãy thử truy cập Cài đặt> Permalinkslưu lại cài đặt của bạn , nếu không bạn sẽ nhận được trang 404 không tìm thấy.

Kiểm tra ở đây để có giải pháp tốt nhất: http://www.krazzycodes.com/how-to-remove-custom-post-type-taxonomy-base-from-url-in-wordpress/


Điều này thực sự hoạt động, tôi không biết làm thế nào không ai nhận thấy điều này trước đây. Tất nhiên điều này có thể can thiệp vào các trang khác nếu chúng có cùng permalink, nhưng nếu không thì đây là một giải pháp tuyệt vời.
Aleksandar Đorđević

4
Đã thử điều này. Nó mang lại kết quả mong muốn cho các liên kết loại bài tùy chỉnh của tôi. Tuy nhiên, nó 'bắt' tất cả các sên loại bài đăng POST hoặc PAGE và cố gắng giải quyết chúng dưới dạng URL cho loại bài đăng tùy chỉnh của tôi, sau đó là 404s. (vâng, tôi đã lưu permalinks).
Matt Keys

4
Điều này không hoạt động. Cung cấp 404 ngay cả khi bạn đã cập nhật permalinks.
Christine Cooper

3
Một lần nữa, ngay cả sau khi lưu lại cài đặt permalink, các bài đăng và trang không còn hoạt động (404)
amklose

1
Giải pháp này hoạt động để loại bỏ sên khỏi URL. Nhưng các trang lưu trữ không hoạt động nữa.
Annapurna

13

Tôi đã cố gắng để tìm ra điều này cách đây không lâu và câu trả lời ngắn từ những gì tôi biết là không . Không phải từ bên trong các đối số viết lại ít nhất.

Lời giải thích dài trở nên rõ ràng nếu bạn nhìn vào mã thực tế register_post_typetrong wp-includes / dòng post.php 1454 :

add_permastruct( $post_type, "{$args->rewrite['slug']}/%$post_type%", $permastruct_args );

Bạn có thể thấy nó có tiền tố $args->rewrite['slug']vào %$post_type%thẻ viết lại. Người ta có thể nghĩ "chúng ta hãy đặt sên thành null" cho đến khi bạn nhìn lên vài dòng:

if ( empty( $args->rewrite['slug'] ) )
    $args->rewrite['slug'] = $post_type;

Bạn có thể thấy rằng hàm luôn mong đợi một giá trị slug không trống và nếu không thì sử dụng loại bài đăng.


Cảm ơn @JanBeck. Có một lý do chính cho điều này tồn tại? Tại sao không hack tệp lõi này với một điều kiện để bỏ qua các loại bài đăng nhất định từ quy tắc này?
Ben Racicot

9
Bạn nên trao câu trả lời cho Jan Beck. WordPress cần sên post_type để định tuyến các yêu cầu đúng cách. Quy tắc này ngăn chặn xung đột đặt tên giữa các trang WP gốc (hiển thị mà không có sên) và bất kỳ loại bài đăng được xác định tùy chỉnh nào. Nếu bạn hack sên thì WordPress sẽ không biết sự khác biệt giữa một trang có tên "dã ngoại" và một sự kiện (loại bài đăng tùy chỉnh) có tên là "dã ngoại".
dswebsme

3
@dswebsme Đồng ý, nhưng có những tình huống bạn nhất định phải thay đổi URL. Vì vậy, ngoài lý do tại sao bạn không thể tự nhiên và không nên, làm thế nào để bạn làm như vậy một cách hiệu quả?
Ben Racicot

7

Đáp lại câu trả lời trước của tôi : tất nhiên bạn có thể đặt rewritetham số falsekhi đăng ký loại bài đăng mới và tự mình xử lý các quy tắc viết lại như vậy

<?php
function wpsx203951_custom_init() {

    $post_type = 'event';
    $args = (object) array(
        'public'      => true,
        'label'       => 'Events',
        'rewrite'     => false, // always set this to false
        'has_archive' => true
    );
    register_post_type( $post_type, $args );

    // these are your actual rewrite arguments
    $args->rewrite = array(
        'slug' => 'calendar'
    );

    // everything what follows is from the register_post_type function
    if ( is_admin() || '' != get_option( 'permalink_structure' ) ) {

        if ( ! is_array( $args->rewrite ) )
            $args->rewrite = array();
        if ( empty( $args->rewrite['slug'] ) )
            $args->rewrite['slug'] = $post_type;
        if ( ! isset( $args->rewrite['with_front'] ) )
            $args->rewrite['with_front'] = true;
        if ( ! isset( $args->rewrite['pages'] ) )
            $args->rewrite['pages'] = true;
        if ( ! isset( $args->rewrite['feeds'] ) || ! $args->has_archive )
            $args->rewrite['feeds'] = (bool) $args->has_archive;
        if ( ! isset( $args->rewrite['ep_mask'] ) ) {
            if ( isset( $args->permalink_epmask ) )
                $args->rewrite['ep_mask'] = $args->permalink_epmask;
            else
                $args->rewrite['ep_mask'] = EP_PERMALINK;
        }

        if ( $args->hierarchical )
            add_rewrite_tag( "%$post_type%", '(.+?)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&pagename=" );
        else
            add_rewrite_tag( "%$post_type%", '([^/]+)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&name=" );

        if ( $args->has_archive ) {
            $archive_slug = $args->has_archive === true ? $args->rewrite['slug'] : $args->has_archive;
            if ( $args->rewrite['with_front'] )
                $archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug;
            else
                $archive_slug = $wp_rewrite->root . $archive_slug;

            add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$post_type", 'top' );
            if ( $args->rewrite['feeds'] && $wp_rewrite->feeds ) {
                $feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')';
                add_rewrite_rule( "{$archive_slug}/feed/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' );
                add_rewrite_rule( "{$archive_slug}/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' );
            }
            if ( $args->rewrite['pages'] )
                add_rewrite_rule( "{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type=$post_type" . '&paged=$matches[1]', 'top' );
        }

        $permastruct_args = $args->rewrite;
        $permastruct_args['feed'] = $permastruct_args['feeds'];
        add_permastruct( $post_type, "%$post_type%", $permastruct_args );
    }
}
add_action( 'init', 'wpsx203951_custom_init' );

Bạn có thể thấy add_permastructcuộc gọi bây giờ không bao gồm sên nữa. Tôi đã thử nghiệm hai kịch bản:

  1. Khi tôi tạo một trang với "lịch" sên, trang đó bị ghi đè bởi kho lưu trữ loại bài đăng cũng sử dụng sên "lịch".

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

  1. Khi tôi tạo một trang với sên "my-event" và một sự kiện (CPT) với sên "my-event", loại bài đăng tùy chỉnh được hiển thị.

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

  1. Bất kỳ trang nào khác cũng không hoạt động. Nếu bạn nhìn vào hình trên, nó sẽ trở nên rõ ràng tại sao: quy tắc loại bài đăng tùy chỉnh sẽ luôn khớp với sên trang. Bởi vì WordPress không có cách nào để xác định xem đó là trang hay loại bài đăng tùy chỉnh không tồn tại, nó sẽ trả về 404. Đó là lý do tại sao bạn cần một con sên để xác định trang hoặc CPT. Một giải pháp khả thi sẽ là chặn lỗi và tìm một trang có thể tồn tại tương tự như câu trả lời này .

Vì vậy, nếu mục tiêu là loại bỏ sên cho CPT, chúng ta không thể đặt tên cho CPT một cái gì đó độc đáo sẽ không va chạm vì dù sao nó sẽ không bao giờ được nhìn thấy trong URL? Hoặc là tên bài viết có thể xung đột nếu được đặt tên giống như một trang?
Ben Racicot

Tôi đã cập nhật câu trả lời của mình để cho thấy rằng điều này thực sự phá vỡ tất cả các trang. Nếu không có sên, WP sẽ tìm CPT thay vì trang và nếu không tìm thấy, hãy trả về lỗi. Vì vậy, nó thực sự không liên quan đến tên bài.
Jan Beck

1
Tôi hiểu rồi. Cần phải viết lại các quy tắc nối thêm '-1' vào URL xung đột trong tương lai như các bài đăng WP gốc so với các trang. Tôi đã tạo một vé trac core.trac.wordpress.org/ticket/34136#ticket sẽ thích suy nghĩ của bạn.
Ben Racicot

7

Nhìn qua các câu trả lời ở đây tôi nghĩ có chỗ cho một giải pháp tốt hơn kết hợp một số điều tôi đã học ở trên và thêm tính năng tự động phát hiện và ngăn chặn các bài đăng trùng lặp.

LƯU Ý: Đảm bảo bạn thay đổi 'custom_post_type' cho tên CPT của riêng bạn trong suốt ví dụ của tôi bên dưới. Có rất nhiều lần xuất hiện và 'tìm / thay thế' là một cách dễ dàng để nắm bắt tất cả. Tất cả các mã này có thể đi vào hàm.php của bạn hoặc trong một plugin.

Bước 1: Vô hiệu hóa ghi lại trên loại bài đăng tùy chỉnh của bạn bằng cách đặt viết lại thành 'false' khi bạn đăng ký bài viết:

register_post_type( 'custom_post_type',
    array(
        'rewrite' => false
    )
);

Bước 2: Thêm thủ công viết lại tùy chỉnh của chúng tôi vào cuối phần viết lại WordPress cho custom_post_type của chúng tôi

function custom_post_type_rewrites() {
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/embed/?$', 'index.php?attachment=$matches[1]&embed=true', 'bottom');
    add_rewrite_rule( '([^/]+)/embed/?$', 'index.php?custom_post_type=$matches[1]&embed=true', 'bottom');
    add_rewrite_rule( '([^/]+)/trackback/?$', 'index.php?custom_post_type=$matches[1]&tb=1', 'bottom');
    add_rewrite_rule( '([^/]+)/page/?([0-9]{1,})/?$', 'index.php?custom_post_type=$matches[1]&paged=$matches[2]', 'bottom');
    add_rewrite_rule( '([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?custom_post_type=$matches[1]&cpage=$matches[2]', 'bottom');
    add_rewrite_rule( '([^/]+)(?:/([0-9]+))?/?$', 'index.php?custom_post_type=$matches[1]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/embed/?$', 'index.php?attachment=$matches[1]&embed=true', 'bottom');
}
add_action( 'init', 'custom_post_type_rewrites' );

LƯU Ý: Tùy thuộc vào nhu cầu của bạn, bạn có thể muốn sửa đổi các bản viết lại ở trên (vô hiệu hóa trackback? Feed?, Vv). Chúng đại diện cho các kiểu viết lại 'mặc định' sẽ được tạo nếu bạn không tắt viết lại ở bước 1

Bước 3: Tạo lại permalinks cho loại bài đăng tùy chỉnh của bạn 'đẹp' một lần nữa

function custom_post_type_permalinks( $post_link, $post, $leavename ) {
    if ( isset( $post->post_type ) && 'custom_post_type' == $post->post_type ) {
        $post_link = home_url( $post->post_name );
    }

    return $post_link;
}
add_filter( 'post_type_link', 'custom_post_type_permalinks', 10, 3 );

LƯU Ý: Bạn có thể dừng ở đây nếu bạn không lo lắng về việc người dùng của mình tạo bài đăng xung đột (trùng lặp) trong một loại bài đăng khác sẽ tạo ra tình huống chỉ một trong số họ có thể tải khi trang được yêu cầu.

Bước 4: Ngăn chặn các bài đăng trùng lặp

function prevent_slug_duplicates( $slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug ) {
    $check_post_types = array(
        'post',
        'page',
        'custom_post_type'
    );

    if ( ! in_array( $post_type, $check_post_types ) ) {
        return $slug;
    }

    if ( 'custom_post_type' == $post_type ) {
        // Saving a custom_post_type post, check for duplicates in POST or PAGE post types
        $post_match = get_page_by_path( $slug, 'OBJECT', 'post' );
        $page_match = get_page_by_path( $slug, 'OBJECT', 'page' );

        if ( $post_match || $page_match ) {
            $slug .= '-duplicate';
        }
    } else {
        // Saving a POST or PAGE, check for duplicates in custom_post_type post type
        $custom_post_type_match = get_page_by_path( $slug, 'OBJECT', 'custom_post_type' );

        if ( $custom_post_type_match ) {
            $slug .= '-duplicate';
        }
    }

    return $slug;
}
add_filter( 'wp_unique_post_slug', 'prevent_slug_duplicates', 10, 6 );

LƯU Ý: Điều này sẽ nối chuỗi 'lặp lại' vào cuối của bất kỳ sên trùng lặp nào. Mã này không thể ngăn ngừa sên trùng lặp nếu chúng đã tồn tại trước khi thực hiện giải pháp này. Hãy chắc chắn để kiểm tra trùng lặp đầu tiên.

Tôi rất muốn nghe lại từ bất cứ ai khác đưa ra điều này để xem liệu nó có hoạt động tốt cho họ không.


Chỉ cần thử nghiệm và có vẻ như nó đang hoạt động cho đến nay.
Christine Cooper

Hy vọng cho cách tiếp cận này, nhưng mang lại cho tôi 404 trên các bài đăng CPT của tôi, ngay cả sau khi lưu lại Permalinks.
Garconis

Xin lỗi nó không làm việc cho bạn Garconis. Tôi đã nói chuyện với người khác về điều này một thời gian trước và họ cũng gặp vấn đề với nó trên trang web của họ. Tôi dường như nhớ rằng nó quan trọng nếu bài đăng trên blog của bạn permalinks có tiền tố trên chúng. Trên trang web tôi đã phát triển điều này cho các bài đăng trên blog đang sử dụng cấu trúc permalink: / blog /% postname% /. Nếu bạn không có tiền tố trên các bài đăng trên blog của mình và bạn có thể chấp nhận được, hãy dùng thử và cho tôi biết cách thực hiện!
Matt Keys

2
Điều này làm việc cho tôi. Không giống như các giải pháp khác trên trang, nó không phá vỡ các trang bình thường hoặc bố cục blog và không gây ra chuyển hướng vô hạn. Nó thậm chí còn hiển thị URL chính xác trong khu vực "Permalink" khi chỉnh sửa các trang cpt đó. Giải pháp khá tốt ở đây, chỉ có một điều lưu ý là trang lưu trữ không hoạt động. NHỚ để hoán đổi "custom_post_type"làm mới permalinks của bạn sau đó .
Radley Sustaire

@MattKeys, Cài đặt Permalink mặc định có Cấu trúc tùy chỉnh là /%category%/%postname%/. Khi thêm mã của bạn, các sên CPT trông vẫn ổn (mặc dù thiếu dấu gạch chéo) ... và trình kiểm tra xung đột cũng hoạt động. Nhưng kết quả bài đăng thực tế trên 404.
Garconis

1

Bạn không cần quá nhiều mã cứng. Chỉ cần sử dụng plugin nhẹ:

Nó có các tùy chọn tùy chỉnh.


Bây giờ tôi biết lý do tại sao bạn bị hạ cấp, nó ngăn chặn các liên kết trang bình thường giải quyết. Tôi đã không nhìn thấy nó bởi vì tôi đã nhận được các bản sao được lưu trong bộ nhớ cache của các trang hiện có mặc dù được làm mới.
Walf

@Walf Bạn có thể cho tôi biết chi tiết về vấn đề này không?
T.Todua

Theo liên kết đến các trang (không phải là loại bài đăng tùy chỉnh) từ menu chính đã đưa ra lỗi 404, như thể trang không tồn tại; đó là nó.
Walf

@Walf bạn có thể cho tôi bất kỳ url ví dụ nào của bạn không? (bạn có thể bao gồm tên miền nếu bạn muốn, tôi chỉ cần một ví dụ cũ) cảm ơn, tôi sẽ cập nhật nó
T.Todua

1

Có vấn đề tương tự ở đây và dường như không có chuyển động trên trang wordpress. Trong tình huống cụ thể của tôi, nơi đối với các blogpost đơn, cấu trúc / blog /% postname% / là cần thiết cho giải pháp này

https://kellenmace.com/remove-custom-post-type-slug-from-permalinks/

đã kết thúc trong một loạt 404

Nhưng cùng với cách tiếp cận tuyệt vời này, không sử dụng cấu trúc permalink phụ trợ cho blogpost, cuối cùng nó cũng hoạt động như bùa mê. https://www.bobz.co/add-blog-prefix-permalink-structure-blog-posts/

Cảm ơn nhiều.


0

và chúng ta có thể thực hiện một số thay đổi đối với chức năng nêu trên:

function na_parse_request( $query ) {

if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
    return;
}

if ( ! empty( $query->query['name'] ) ) {
    $query->set( 'post_type', array( 'post', 'events', 'page' ) );
}
}

đến:

function na_parse_request( $query ) {

if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
    return;
}

if ( ! empty( $query->query['name'] ) ) {

    global $wpdb;
    $pt = $wpdb->get_var(
        "SELECT post_type FROM `{$wpdb->posts}` " .
        "WHERE post_name = '{$query->query['name']}'"
    );
    $query->set( 'post_type', $pt );
}
}

để đặt đúng giá trị post_type.


0

Điều này làm việc cho tôi: 'rewrite' => array('slug' => '/')


1
Điều này không hoạt động. Cung cấp 404 ngay cả khi bạn đã cập nhật permalinks.
Christine Cooper

0

Đối với bất cứ ai đọc điều này gặp rắc rối với các bài đăng trẻ em như tôi đã làm, tôi thấy cách tốt nhất là thêm các quy tắc viết lại của riêng bạn.

Vấn đề chính tôi gặp phải là WordPress xử lý chuyển hướng từ các trang có 2 cấp độ (bài đăng trẻ em) khác một chút so với việc xử lý sâu 3 cấp độ (con của bài đăng trẻ em).

Điều đó có nghĩa là khi tôi có / post-type / post-name / post-child / Tôi có thể sử dụng / post-name / post-child và nó sẽ chuyển hướng tôi đến một loại có post-type ở phía trước nhưng nếu tôi có loại post-type / post-name / post-child / post-cháu thì tôi không thể sử dụng post-name / post-child / post-cháu.

Nhìn vào các quy tắc viết lại, có vẻ như nó phù hợp với những thứ khác ngoài pagename ở cấp độ thứ nhất và thứ hai (tôi nghĩ cấp độ thứ hai phù hợp với tệp đính kèm) và sau đó thực hiện điều gì đó để chuyển hướng bạn đến bài đăng phù hợp. Ở ba cấp độ sâu, nó không hoạt động.

Điều đầu tiên bạn cần làm là loại bỏ liên kết loại bài đăng từ trẻ em. Logic này sẽ xảy ra ở đây nếu bạn nhìn vào câu trả lời của Nate Allen ở trên:

$post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );

Bản thân tôi đã sử dụng hỗn hợp các điều kiện khác nhau để kiểm tra xem bài đăng có con hay không và để có được permalink đúng. Phần này không quá khó và bạn sẽ tìm thấy những ví dụ về những người làm việc đó ở nơi khác.

Bước tiếp theo là nơi mọi thứ thay đổi từ câu trả lời đã cho. Thay vì thêm mọi thứ vào truy vấn chính (hoạt động cho các bài đăng tùy chỉnh và con cái của họ nhưng không phải là những đứa trẻ khác) tôi đã thêm một bản viết lại đi đến tận cùng của các quy tắc WordPress để nếu pagename không kiểm tra và nó sắp sửa nhấn 404, nó sẽ thực hiện một kiểm tra cuối cùng để xem liệu một trang trong loại bài đăng tùy chỉnh có cùng tên hay không nếu không nó sẽ ném ra 404.

Đây là quy tắc viết lại mà tôi đã sử dụng giả sử 'sự kiện' là tên của CPT của bạn

function rewrite_rules_for_removing_post_type_slug()
{
    add_rewrite_rule(
        '(.?.+?)?(:/([0-9]+))?/?$',
        'index.php?event=$matches[1]/$matches[2]&post_type=event',
        'bottom'
    );
}

add_action('init', 'rewrite_rules_for_removing_post_type_slug', 1, 1);

Hy vọng điều này sẽ giúp được người khác, tôi không thể tìm thấy bất cứ điều gì khác liên quan đến bài viết của trẻ em và loại bỏ con sên khỏi chúng.


Dường như có một lỗi đánh máy trong regex. Giữa '(:' a '?' Là cần thiết để sử dụng nó làm mẫu con không chụp => '(?:'. Cái thứ ba? Có vẻ bị đặt nhầm chỗ vì nó cho phép một mẫu con đầu tiên trống rỗng. Nếu không có lỗi đánh máy này, khái niệm sẽ được giống như một trong đó có thể được tìm thấy cho việc xây dựng trong bài kiểu 'trang'.
jot
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.