Redeclare / Change Slug của Loại bài đăng tùy chỉnh của Plugin


28

Có thể tái phân phối / thay đổi sên của loại bài đăng tùy chỉnh hiện có của plugin (mà không cần chỉnh sửa plugin) không?

Đó là, nếu Plugin X tạo một loại bài đăng tùy chỉnh với slug / unsookedtoast /, thì có thể thêm bộ lọc vào hàm.php (hoặc một cái gì đó tương tự) để thay đổi slug thành / Bread /?


Tôi chỉ giải quyết vấn đề tương tự bằng cách nối vào init với mức độ ưu tiên là 20 và sau đó gọi lại register_post_type cho cùng một loại bài đăng. Bất cứ ai biết nếu điều này sẽ gây ra cho tôi bất kỳ rắc rối xuống đường?
Dustin

Câu trả lời:


24

Có, điều này là có thể, nhưng nếu plugin đang tạo một loại bài đăng tùy chỉnh bằng cách sử dụng rewrite => array('slug' => 'post_type')tham số, thì có khả năng là bạn sẽ không thể thay thế sên.

Bất cứ khi nào loại bài đăng tùy chỉnh được tạo, quy tắc viết lại URL được ghi vào cơ sở dữ liệu. Tùy thuộc vào hành động nào kích hoạt việc tạo loại bài đăng tùy chỉnh (chẳng hạn như hành động init ), WordPress sẽ xóa các quy tắc viết lại và khôi phục các sên của loại bài đăng tùy chỉnh bất kể bạn thay đổi gì.

Điều đó nói rằng, bạn có thể cung cấp sên tùy chỉnh cho các loại bài tùy chỉnh. Ví dụ sau đây giả định rằng bạn có loại bài đăng tùy chỉnh moviesvà bạn đang cố gắng thay đổi /movies/sên thành /films/.

Để hoàn thành, đây là chức năng cơ bản được sử dụng để xác định moviesloại bài tùy chỉnh. Plugin mà bạn đang tham khảo nên làm một cái gì đó như thế này:

function movies_register_post_type() {

    register_post_type(
        'movies',
        array(
            'labels' => array(
                'name' => __('Movies'),
                'singular_name' => __('Movie')
            ),
            'public' => true,
            'has_archive' => true,
            'rewrite' => array(
                'slug' => 'movies'
            )
        )
    );

} // end example_register_post_type
add_action('init', 'movies_register_post_type');

Bạn có thể sửa đổi bảng tùy chọn bằng cách cung cấp các quy tắc tùy chỉnh của riêng bạn dựa trên loại bài đăng hiện có.

Về cơ bản, chúng tôi sẽ làm điều này:

  • Lấy bộ quy tắc hiện có và sau đó viết riêng của chúng tôi bằng sên tùy chỉnh của riêng chúng tôi
  • Đặt cho quy tắc mới mức độ ưu tiên cao hơn so với sên của loại bài tùy chỉnh

Đây là cách bạn có thể làm điều này:

function add_custom_rewrite_rule() {

    // First, try to load up the rewrite rules. We do this just in case
    // the default permalink structure is being used.
    if( ($current_rules = get_option('rewrite_rules')) ) {

        // Next, iterate through each custom rule adding a new rule
        // that replaces 'movies' with 'films' and give it a higher
        // priority than the existing rule.
        foreach($current_rules as $key => $val) {
            if(strpos($key, 'movies') !== false) {
                add_rewrite_rule(str_ireplace('movies', 'films', $key), $val, 'top');   
            } // end if
        } // end foreach

    } // end if/else

    // ...and we flush the rules
    flush_rewrite_rules();

} // end add_custom_rewrite_rule
add_action('init', 'add_custom_rewrite_rule');

Bây giờ, bạn sẽ có hai cách để truy cập phim của mình:

  • /movies/Back-To-The-Future
  • /films/Back-To-The-Future

Lưu ý rằng tôi không khuyên bạn nên hooking add_custom_rewrite_rulevào inithành động vì nó sẽ cháy quá thường xuyên. Đây chỉ là một ví dụ. Một nơi tốt hơn để áp dụng chức năng sẽ là kích hoạt chủ đề, kích hoạt plugin, có lẽ là hành động save_post, v.v. Tùy thuộc vào những gì bạn cần làm, bạn có thể chỉ cần kích hoạt nó một lần hoặc chỉ một vài lần.

Tại thời điểm này, bạn có thể muốn xem xét cập nhật permalinks cho loại bài đăng tùy chỉnh để sử dụng ' /movies/sên. Ví dụ: nếu bạn điều hướng đến /films/, bạn sẽ thấy một danh sách tất cả các bộ phim của bạn nhưng di chuột qua tiêu đề sẽ tiết lộ rằng /movies/con sên vẫn đang được sử dụng.

Để tiến thêm một bước, về mặt kỹ thuật, bạn có thể kích hoạt chuyển hướng 301 để bắt tất cả các liên kết /movies/để chuyển hướng đến /films/đối tác của họ , nhưng tất cả phụ thuộc vào những gì bạn đang cố gắng thực hiện.


Làm việc rất đẹp! Bạn cũng có thể chỉ cho tôi đi đúng hướng để cập nhật permalinks không?
Edbury

1
Tùy thuộc vào chủ đề của bạn, bạn có thể làm điều này ở cấp độ mẫu. Khi bạn thấy lệnh gọi 'the_title ()', bạn có thể thay thế cuộc gọi đó bằng $ title = get_the_title (), sau đó thay thế chuỗi '/ movies /' trong $ title bằng '/ movies /'.
Tom

Điều gì xảy ra nếu slug bạn muốn thay đổi được tạo động bởi giá trị meta của bài đăng hiện tại? Tôi cần để có thể sử dụng $posttrong các add_custom_rewrite_rule()chức năng nhưng nó ném sai sót trong quản lý WP nói 'Đang cố gắng để có được tài sản của phi vật thể'. Làm cách nào tôi có thể nhận được bài đăng $ để nhận giá trị meta?
Lee

6

Mã này hoạt động tốt cho chủ đề con tôi. Cần thay đổi "chương trình" sên thành "nơi".

/*
CHANGE SLUGS OF CUSTOM POST TYPES
*/

function change_post_types_slug( $args, $post_type ) {

   /*item post type slug*/   
   if ( 'program' === $post_type ) {
      $args['rewrite']['slug'] = 'place';
   }

   return $args;
}
add_filter( 'register_post_type_args', 'change_post_types_slug', 10, 2 );

/*
CHANGE SLUGS OF TAXONOMIES, slugs used for archive pages
*/

function change_taxonomies_slug( $args, $taxonomy ) {

   /*item category*/
   if ( 'program-category' === $taxonomy ) {
      $args['rewrite']['slug'] = 'locations';
   }

   return $args;
}
add_filter( 'register_taxonomy_args', 'change_taxonomies_slug', 10, 2 );

Nó hoạt động hoàn hảo, tôi cũng đã sử dụng nó cho các thẻ thêm quy tắc tương đối, cần phải cập nhật permalinks bằng cách thực hiện lưu từ trang cài đặt> permalink. Cảm ơn bạn!
Lorenzo Magon

Hoạt động hoàn hảo để thay đổi các đối số khác quá, tôi cần phải thiết lập $args['has_archive'] = falsevà điều này đã làm việc.
Phát triển đơn thuần
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.