Создайте 2 типа сообщений, один родитель в другой в плагине

Я создал пользовательский тип сообщения «Книга» и успешно добавлен в меню администратора WordPress как корневую категорию. Я могу успешно перечислить содержимое типа сообщения с помощью /wp-admin/edit.php?post_type=test_book и добавить его через /wp-admin/post-new.php?post_type=test_book .

Тем не менее, я хотел бы добавить пользовательский тип сообщения «Chapter» ( test_chapter ) в «Book», разрешив пользователям выбирать главы (и перенастраивать порядок в post-new.php ), тем самым устанавливая отношения родитель-потомок ,

Как я могу это сделать?

Код, который вам нужно использовать здесь, имеет несколько шагов. Сначала вам нужно создать e metabox для своего настраиваемого типа редактирования edit.php, в котором будут перечислены все ваши сообщения типа post_chapter. Затем вам нужно перехватить действие save_post, чтобы вы установили родителя редактируемого сообщения в выбранный «test_chapter». Лучший способ – связать эти два типа сообщений как метатет пост, а не как отношение родитель-ребенок, чтобы вы могли справиться с этим лучше. Согласно этому руководству: http://wptheming.com/2010/08/custom-metabox-for-post-type/

 add_action( 'add_meta_boxes', 'add_books_metaboxes' ); // Add the Book Meta Boxes function add_books_metaboxes() { add_meta_box('wpt_test_chapter', 'Book chapter', 'wpt_test_chapter', 'test_book', 'side', 'default'); } // Book chapter Metabox function wpt_test_chapter() { global $post; $args = array( 'posts_per_page' => -1, 'post_type' => 'test_chapter', ); $books_array = get_posts( $args ); $chapter_ids = get_post_meta($post->ID, 'related_chapters', true); ?> <select name="book_chapters" multiple> <?php foreach($books_array as $book_array){ if(in_array($book_array->ID, $chapter_ids)){$selected = 'selected;'} else{$selected = '';} echo '<option '.$book_array->ID.' '.$selected.'>'.$book_array->post_title.'</option>'; } ?> </select> <?php // Noncename needed to verify where the data originated /* if you are using plugin: echo '<input type="hidden" name="eventmeta_noncename" id="eventmeta_noncename" value="' . wp_create_nonce( plugin_basename(__FILE__) ) . '" />'; */ } // Save the Metabox Data function wpt_save_chapter_meta($post_id, $post) { // verify this came from the our screen and with proper authorization, // because save_post can be triggered at other times /* if you are using plugin: if ( !wp_verify_nonce( $_POST['eventmeta_noncename'], plugin_basename(__FILE__) )) { return $post->ID; } */ // Is the user allowed to edit the post or page? if ( !current_user_can( 'edit_post', $post->ID )) return $post->ID; // OK, we're authenticated: we need to find and save the data // We'll put it into an array to make it easier to loop though. $chapters_ids['book_chapters'] = $_POST['book_chapters']; // Add values of $events_meta as custom fields foreach ($chapter_ids as $chapter_id) { // Cycle through the $events_meta array! //if( $post->post_type == 'revision' ) return; // Don't store custom data twice update_post_meta($post->ID, 'related_chapters', $chapter_id); } } add_action('save_post', 'wpt_save_chapter_meta', 1, 2); // save the custom fields 

Не проверял код, поэтому он может иметь некоторые ошибки. Позвольте мне knwo, чтобы я мог исправить их.

Сначала вы создаете функцию test_book и вызываете функцию add_action() для инициализации этой функции.

Пример:

 add_action('admin_menu', 'test_book'); 

Затем, после определения функции функции test_book (), для добавления меню и подменю вы объявляете свою function test_book() таким образом …

 function test_book(){ add_menu_page( "Books", "Books", "manage_options", "test_book", "test_book", "" ); add_submenu_page( "test_book", "Chapters", "Chapters", "manage_options", "test_chapter", "test_chapter"); }