Saya mencoba menyiapkan struktur jenis pos kustom multi-level dengan permalink yang terlihat seperti authors/books/chapters
, dengan penulis, buku, dan bab semua diatur sebagai jenis pos kustom mereka sendiri. Misalnya, URL tipikal pada situs ini mungkin terlihatexample.com/authors/stephen-king/the-shining/chapter-3/
Setiap bab hanya dapat dimiliki oleh satu buku, dan setiap buku hanya dapat dimiliki oleh satu penulis. Saya telah mempertimbangkan menggunakan taksonomi alih-alih CPT untuk penulis dan buku, tetapi saya harus mengaitkan metadata dengan setiap item dan saya lebih suka antarmuka posting untuk ini.
Saya sebagian besar jalan di sana dengan hanya mengatur setiap pos kustom sebagai anak dari entri di CPT satu tingkat ke atas. Misalnya, saya membuat "Bab 3" dan menetapkan "The Shining" sebagai induk menggunakan kotak meta khusus. "The Shining" pada gilirannya memiliki "Stephen King" sebagai orang tua. Saya tidak kesulitan membuat hubungan ini.
Saya menggunakan tag menulis ulang di siput CPT dan permalink ingin bekerja, tetapi mereka tidak benar. Dengan menggunakan penganalisis penulisan ulang, saya dapat melihat bahwa aturan penulisan ulang sebenarnya dibuat, tetapi aturan tersebut tampaknya tidak berada dalam urutan yang benar sehingga aturan lain diproses terlebih dahulu.
Inilah cara saya mendaftarkan CPT saya:
function cpt_init() {
$labels = array(
'name' => 'Authors'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array(
'slug' => 'author',
'with_front' => FALSE,
),
'with_front' => false,
'capability_type' => 'post',
'has_archive' => false,
'hierarchical' => true,
'menu_position' => null,
'supports' => array( 'title', 'editor' )
);
register_post_type('authors',$args);
$labels = array(
'name' => 'Books'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array(
'slug' => 'author/%authors%',
'with_front' => FALSE,
),
'with_front' => false,
'capability_type' => 'post',
'has_archive' => false,
'hierarchical' => true,
'menu_position' => null,
'supports' => array( 'title', 'editor' )
);
register_post_type('books',$args);
$labels = array(
'name' => 'Chapters'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array(
'slug' => 'author/%authors%/%books%',
'with_front' => FALSE,
),
'with_front' => FALSE,
'capability_type' => 'post',
'has_archive' => false,
'hierarchical' => true,
'menu_position' => null,
'supports' => array( 'title', 'editor' )
);
register_post_type('chapters',$args);
}
add_action( 'init', 'cpt_init' );
Jadi, adakah cara untuk mengubah prioritas aturan penulisan ulang saya sehingga penulis, buku, dan bab semuanya cocok terlebih dahulu?
Saya juga tahu bahwa saya harus menambahkan post_type_link
filter, tapi itu tampaknya sekunder untuk mendapatkan permalink yang benar. Jika ada yang tahu di mana saya dapat menemukan ikhtisar komprehensif tentang cara kerja filter itu, itu akan dihargai.
Jawaban:
Jika Anda ingin menjadikan 'penulis' sebagai slug dasar di permalinks, yaitu example.com/authors/stephen-king/ untuk 'CPT penulis', example.com/authors/stephen-king/the-shining/ untuk 'buku' CPT dan contoh.com/authors/stephen-king/the-shining/chapter-3/ untuk 'bab' CPT, WordPress akan berpikir bahwa semuanya adalah pos 'penulis' atau anak hirarki penulis. 'memposting dan, karena bukan itu masalahnya, WordPress akhirnya menjadi sangat bingung.
Dengan itu, ada solusi yang cukup mendasar tetapi selama struktur permalink Anda selalu mengikuti urutan yang sama, yaitu kata 'penulis' selalu diikuti oleh siput penulis, yang selalu diikuti oleh siput buku yang selalu diikuti dengan bab siput, maka Anda harus baik untuk pergi.
Dalam solusi ini, tidak perlu mendefinisikan slug penulisan ulang dalam definisi tipe posting kustom untuk 'bab' dan 'buku', tetapi atur slug menulis ulang 'penulis' hanya sebagai 'penulis', tempatkan kode berikut di fungsi Anda.php file dan "siram" aturan penulisan ulang Anda.
Pelajari lebih lanjut tentang plugin CPT-onomies
sumber
Saya tidak punya pengalaman pribadi dengan skenario seperti itu, tetapi Randy Hoyt melakukan presentasi di WordCamp San Fran akhir pekan lalu tentang "Subordinate Post Types" yang terdengar seperti apa yang Anda bicarakan.
Inilah halamannya untuk ceramah yang mencakup slide presentasinya dan tautan ke plugin yang ia buat untuk bekerja dengan jenis posting bawahan: http://randyhoyt.com/wordpress/subordinate-post-types/
sumber
Aturan akan ditambahkan ke extra_rules_top WP_Rewrite dalam urutan bahwa permastruct tambahan ditambahkan. Jadi, mengalihkan urutan yang Anda daftarkan ke jenis tulisan akan mengubah urutan aturan penulisan ulang yang dihasilkan sehingga penulisan ulang bab menjadi cocok terlebih dahulu. Namun, karena Anda menggunakan query_var dari post_types lain, wp_query mungkin akan cocok dengan salah satu dari mereka sebagai nama posting yang di-query sebelum mencocokkan bab seperti yang Anda inginkan.
Saya akan membuat tag penulisan ulang baru untuk mewakili placeholder untuk penulis induk dan buku induk, yaitu:
Saat melakukan ini, Anda harus memfilter 'query_vars' untuk membuat 'parent_book' menjadi publik. Maka Anda perlu menambahkan filter ke pre_get_posts yang akan mengubah nama yang ditetapkan sebagai parent_book query_var ke dalam post_id dan menjadikannya sebagai 'post_parent'.
sumber