Redeclare / Ubah Slug dari Jenis Posting Kustom Plugin

28

Apakah mungkin untuk mendeklarasikan ulang / mengubah siput dari jenis pos kustom plugin yang ada (tanpa hanya mengedit plugin)?

Yaitu, jika Plugin X membuat tipe posting khusus dengan slug / uncookedtoast /, apakah mungkin untuk menambahkan filter ke functions.php (atau yang serupa) yang mengubah slug menjadi / bread /?

Edbury
sumber
Saya baru saja memecahkan masalah yang sama dengan menghubungkan ke init dengan prioritas 20 dan kemudian memanggil register_post_type lagi untuk jenis posting yang sama. Adakah yang tahu apakah ini akan menyebabkan masalah bagi saya?
Dustin

Jawaban:

24

Ya, ini mungkin, tetapi jika plugin membuat jenis posting khusus menggunakan rewrite => array('slug' => 'post_type')parameter, maka kemungkinan Anda tidak akan bisa mengganti siput.

Setiap kali jenis posting khusus dibuat, aturan penulisan ulang URL ditulis ke database. Bergantung pada tindakan mana yang memicu pembuatan jenis posting kustom (seperti tindakan init ), WordPress akan menghapus aturan penulisan ulang dan mengembalikan siput jenis posting kustom terlepas dari perubahan apa yang Anda coba buat.

Yang mengatakan, Anda dapat memberikan siput khusus untuk jenis posting kustom. Contoh berikut mengasumsikan bahwa Anda memiliki jenis posting khusus moviesdan bahwa Anda mencoba untuk mengubah /movies/siput /films/.

Agar lengkap, inilah fungsi dasar yang digunakan untuk menentukan moviesjenis posting khusus. Plugin yang Anda referensikan harus melakukan sesuatu seperti ini:

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');

Anda dapat mengubah tabel opsi dengan memberikan aturan kustom Anda sendiri berdasarkan jenis posting yang ada.

Pada dasarnya, kami akan melakukan ini:

  • Ambil seperangkat aturan yang ada dan kemudian tulis aturan kita sendiri dengan siput khusus kita sendiri
  • Berikan aturan baru prioritas yang lebih tinggi daripada siput jenis pos kustom

Inilah cara Anda dapat melakukan ini:

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');

Sekarang, Anda memiliki dua cara untuk mengakses film:

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

Perhatikan bahwa saya tidak merekomendasikan mengaitkannya add_custom_rewrite_ruleke dalam inittindakan karena itu akan menyala terlalu sering. Ini hanya sebuah contoh. Tempat yang lebih baik untuk menerapkan fungsi ini adalah pada aktivasi tema, aktivasi plugin, mungkin tindakan save_post, dll. Bergantung pada apa yang perlu Anda lakukan, Anda mungkin hanya perlu memecatnya sekali atau hanya beberapa kali.

Pada titik ini, Anda mungkin ingin mempertimbangkan memperbarui permalink untuk jenis posting khusus untuk menggunakan ' /movies/siput. Misalnya, jika Anda menavigasi ke /films/, Anda akan melihat daftar semua film Anda tetapi melayang di atas judul akan mengungkapkan bahwa /movies/siput masih digunakan.

Untuk melangkah lebih jauh, Anda secara teknis bisa membuat pengalihan 301 untuk menangkap semua tautan /movies/untuk mengarahkan ke /films/mitra mereka , tetapi ini semua tergantung pada apa yang Anda coba lakukan.

Tom
sumber
Bekerja dengan indah! Bisakah Anda mengarahkan saya ke arah yang benar untuk memperbarui permalink?
Edbury
1
Tergantung pada tema Anda, Anda dapat melakukan ini di tingkat templat. Saat Anda melihat panggilan ke 'the_title ()', Anda dapat menggantinya dengan $ title = get_the_title (), lalu ganti string '/ film /' dalam $ title dengan '/ film /'.
Tom
Bagaimana jika siput yang ingin Anda ubah secara dinamis dibuat oleh nilai meta dari posting saat ini? Saya harus dapat menggunakan $postdalam add_custom_rewrite_rule()fungsi tetapi itu melemparkan kesalahan di WP Admin yang mengatakan 'Mencoba untuk mendapatkan properti dari non-objek'. Bagaimana saya bisa mendapatkan $ posting untuk mendapatkan nilai meta?
Lee
6

Kode ini berfungsi baik untuk tema anak saya. Diperlukan untuk mengubah "program" siput ke "tempat".

/*
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 );
Iggy
sumber
Ini berfungsi dengan baik, saya juga menggunakannya untuk tag menambahkan aturan relatif, perlu memperbarui permalinks dengan menjalankan save dari halaman pengaturan> permalink. Terima kasih!
Lorenzo Magon
Berfungsi sempurna untuk mengubah argumen lain juga, saya perlu mengatur $args['has_archive'] = falsedan ini berhasil.
Pengembangan Mere