Saya baru saja mengatur hubungan post / parent antara tipe posting "episode" dan tipe posting "kartun-seri."
Saya menggunakan sedikit kode ini untuk ditambahkan di kotak meta untuk menetapkan induk dari jenis posting lain:
add_action('admin_menu', function() {
remove_meta_box('pageparentdiv', 'episodes', 'normal');
});
add_action('add_meta_boxes', function() {
add_meta_box('episodes-parent', 'Cartoon Series', 'episodes_attributes_meta_box', 'episodes', 'side', 'default');
});
function episodes_attributes_meta_box($post) {
$post_type_object = get_post_type_object($post->post_type);
if ( $post_type_object->hierarchical ) {
$pages = wp_dropdown_pages(array('post_type' => 'cartoon-series', 'selected' => $post->post_parent, 'name' => 'parent_id', 'show_option_none' => __('(no parent)'), 'sort_column'=> 'menu_order, post_title', 'echo' => 0));
if ( ! empty($pages) ) {
echo $pages;
} // end empty pages check
} // end hierarchical check.
}
Itu berfungsi pada layar admin dalam memungkinkan saya untuk mengatur seri sebagai orangtua untuk episode, tetapi ketika saya mencoba untuk melihat posting, saya mendapatkan 404. Struktur url adalah:
domain/episodes/series-name/episode-name
Url untuk seri ini adalah:
domain/cartoon-series/series-name
Saya ingin url untuk episode ini:
domain/cartoon-series/series-name/episode-name
Apa yang saya lewatkan? Apakah mungkin untuk membuat seluruh jenis posting anak dari jenis posting lain? Jadi, saya bahkan bisa mendapatkan url untuk daftar episode:
domain/cartoon-series/series-name/episodes
Terima kasih! Mat
Seperti yang diminta, berikut adalah kode untuk dua jenis pos kustom yang dimaksud:
$labels = array(
"name" => "Cartoon Series",
"singular_name" => "Cartoon Series",
"menu_name" => "Cartoon Series",
"all_items" => "All Cartoon Series",
"add_new" => "Add New",
"add_new_item" => "Add New Cartoon Series",
"edit" => "Edit",
"edit_item" => "Edit Cartoon Series",
"new_item" => "New Cartoon Series",
"view" => "View",
"view_item" => "View Cartoon Series",
"search_items" => "Search Cartoon Series",
"not_found" => "No Cartoon Series Found",
"not_found_in_trash" => "No Cartoon Series Found in Trash",
"parent" => "Parent Cartoon Series",
);
$args = array(
"labels" => $labels,
"description" => "",
"public" => true,
"show_ui" => true,
"has_archive" => true,
"show_in_menu" => true,
"exclude_from_search" => false,
"capability_type" => "post",
"map_meta_cap" => true,
"hierarchical" => true,
"rewrite" => array( "slug" => "cartoon-series", "with_front" => true ),
"query_var" => true,
"supports" => array( "title", "revisions", "thumbnail" ), );
register_post_type( "cartoon-series", $args );
$labels = array(
"name" => "Episodes",
"singular_name" => "Episode",
);
$args = array(
"labels" => $labels,
"description" => "",
"public" => true,
"show_ui" => true,
"has_archive" => true,
"show_in_menu" => true,
"exclude_from_search" => false,
"capability_type" => "post",
"map_meta_cap" => true,
"hierarchical" => true,
"rewrite" => array( "slug" => "episodes", "with_front" => true ),
"query_var" => true,
"supports" => array( "title", "revisions", "thumbnail" ), );
register_post_type( "episodes", $args );
Saya menggunakan plugin CPT UI, jadi saya tidak dapat mengedit kode itu secara langsung. Itu hanya kode ekspor yang disediakan CPT UI.
Saya tidak punya kode lain yang menghubungkan kedua CPT. Mungkin itu yang saya lewatkan. Saya baru saja menemukan kode online yang menempatkan metabox pada halaman untuk melakukan penautan. Apakah itu tidak cukup untuk melakukan pekerjaan itu? Sepertinya itu mengatur post_parent.
Terima kasih! Mat
sumber
parent_id
kueri var dan tidak perlu lagi kode untuk mengatur hubungan. Masalahnya adalah bahwa URL yang dihasilkan tidak dikenali oleh WordPress. Saya sudah berusaha menemukan aturan penulisan ulang yang membuatnya berfungsi tetapi saya belum berhasil. Saya sekarang sedang menyelidiki suatu solusi.pre_get_posts
untuk mengubah kueri tanpa hasil, sesuatu yang lebih rumit terlibat yang belum dapat saya pahami. Seperti memiliki kucing menjadi orangtua anjing. Saya menyarankan untuk menggunakan hanya satu jenis posting hirarkis atau mengatur hubungan dengan menggunakan bidang meta .Jawaban:
Akhirnya saya menemukan solusi yang berfungsi. Serial kartun dapat didaftarkan seperti yang Anda lakukan tetapi episode jenis posting kustom tidak bisa hirarkis (saya pikir WordPress mengharapkan konten induk menjadi jenis yang sama dengan konten anak jika hubungan diatur menggunakan
post_parent
dalamwp_posts
tabel database).Saat mendaftarkan episode, aturan penulisan ulang harus diatur ke siput yang Anda inginkan, yaitu
cartoon-series/%series_name%
. Kemudian kita bisa memfilter tautan episode untuk menggantikan%series_name%
dengan nama sebenarnya daricartoon-series
jenis posting induk dan aturan penulisan ulang untuk mengatakan ke WordPress ketika jenis posting seri kartun diminta dan kapan episode.CATATAN : Ingatlah untuk menyiram aturan penulisan ulang setelah menyimpan kode di atas dan sebelum mencobanya. Pergi ke
wp-admin/options-permalink.php
dan klik simpan untuk mengatur ulang aturan penulisan ulang.CATATAN 2 : Mungkin ada lebih banyak aturan penulisan ulang yang harus ditambahkan, misalnya untuk berfungsi untuk posting paginate. Juga mungkin perlu beberapa pekerjaan lagi untuk memiliki solusi yang lengkap, misalnya, ketika menghapus
cartoon-series
hapus juga semua episode anak? Tambahkan filter di layar edit admin untuk memfilter episode dengan pos induk? Ubah judul episode di layar edit admin untuk menampilkan nama seri induk?sumber
domain/episodes/series-name/episode-name
seperti sebelumnya, saya dapatdomain/episodes/series-name/series-name/episode-name
Tidak perlu untuk HARD-CODING dalam hal ini ... Anda cukup menggunakan plugin ini:
https://wordpress.org/plugins/add-hierarchy-parent-to-post/
Anda bahkan dapat mengambil kode darinya. Namun, itu mungkin bukan solusi lengkap.
sumber
Anda perlu menulis kode parsing URL Anda sendiri untuk itu sebagai wordpress perlu mengetahui jenis posting yang mencoba untuk mengambil dari DB berdasarkan struktur url dan struktur url Anda tidak memberikan petunjuk apa pun untuk ini.
Ini bukan sesuatu yang sangat mudah dilakukan dengan aturan penulisan ulang API wordpress, tetapi tidak ada yang mencegah Anda melewati mekanisme penulisan ulang dan mem-parsing url sendiri. Sesuatu seperti 1. menjalankan aturan rewite wordpress. Jika suatu konten ditemukan, tampilkan dan keluar 2. dapatkan bagian pertama dari url, periksa apakah ada posting yang cocok dengan siput dengan tipe posting yang diharapkan 3. loop pada bagian-bagian lain dari URL memverifikasi bahwa posting ada dan dalam tipe yang tepat. 4. jika semuanya cocok menampilkan posting terakhir yang ditemukan, yang lain menampilkan halaman 404
sumber