Я только что установил связь «пост / родитель» между типом поста «эпизоды» и типом поста «мультфильм-серия».
Я использовал этот фрагмент кода для добавления в мета-поле, чтобы назначить родителя из другого типа сообщения:
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.
}
Это работало на экране администратора, позволяя мне установить сериал как родитель для эпизода, но когда я пытаюсь просмотреть пост, я получаю 404. Структура URL:
domain/episodes/series-name/episode-name
URL для серии:
domain/cartoon-series/series-name
Я хотел бы, чтобы URL для эпизода был:
domain/cartoon-series/series-name/episode-name
Что мне не хватает? Можно ли сделать весь тип сообщения дочерним по отношению к другому типу сообщения? Итак, я мог бы даже получить URL для списка эпизодов:
domain/cartoon-series/series-name/episodes
Благодарность! Matt
Как и требовалось, вот код для двух пользовательских типов сообщений:
$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 );
Я использую плагин CPT UI, поэтому я не могу редактировать этот код напрямую. Это только код экспорта, который предоставляет CPT UI.
У меня нет другого кода, который связывает два CPT. Может быть, это то, что я скучаю. Я только что нашел этот код в Интернете, который размещает метабокс на странице для создания ссылок. Разве этого недостаточно для выполнения работы? Похоже, он устанавливает post_parent.
Благодарность! Matt
источник
parent_id
запрос var, и ему не нужно больше кода для установки отношений. Проблема в том, что созданный URL не распознается WordPress. Я пытался найти правило переписывания, которое заставило бы его работать, но у меня не было успеха. Я сейчас исследую решение.pre_get_posts
чтобы изменить запрос, но безуспешно, что-то более сложное, что я не смог понять. Как будто кошка будет родителем собаки. Я предлагаю использовать только один иерархический тип сообщения или установить область с помощью мета-полей .Ответы:
Наконец-то я нашел рабочее решение. Мультяшной серии могут быть зарегистрированы , как вы делали , но эпизоды пользовательские почтовые типы не могут быть hirarchical (я думаю , WordPress ожидает родительский контент быть того же типа , как содержание ребенка , если отношения устанавливается с использованием
post_parent
вwp_posts
таблице базы данных).При регистрации эпизодов правило перезаписи должно быть установлено на нужный вам слаг, то есть
cartoon-series/%series_name%
. Затем мы можем отфильтровать ссылку на эпизоды, чтобы заменить ее%series_name%
реальным именем родительскогоcartoon-series
типа записи и правилом перезаписи, чтобы сообщить WordPress, когда запрашивается тип публикации серии мультфильмов и когда это эпизоды.ПРИМЕЧАНИЕ . Не забудьте сбросить правила перезаписи после сохранения приведенного выше кода и перед его попыткой. Перейдите
wp-admin/options-permalink.php
и нажмите «Сохранить», чтобы заново создать правила перезаписи.ПРИМЕЧАНИЕ 2 : Вероятно, необходимо добавить больше правил переписывания, например, для постов постраничной публикации. Также может потребоваться дополнительная работа, чтобы иметь полное решение, например, при удалении
cartoon-series
удалить также все дочерние эпизоды? Добавить фильтр на экране редактирования администратора, чтобы фильтровать эпизоды по родительскому посту? Изменить заголовок эпизода на экране редактирования администратора, чтобы показать имя родительской серии?источник
domain/episodes/series-name/episode-name
как раньше, я получилdomain/episodes/series-name/series-name/episode-name
Нет необходимости в жестком кодировании в этом случае ... Вы можете просто использовать этот плагин:
https://wordpress.org/plugins/add-hierarchy-parent-to-post/
Вы даже можете получить код из него. Тем не менее, это не может быть полным решением.
источник
Вам нужно будет написать свой собственный код парсинга URL для этого, так как wordpress должен знать тип поста, который он пытается извлечь из БД, на основе структуры URL, и ваша структура URL не дает на это никакого намека.
Это не то, что очень легко сделать с помощью API правил переписывания WordPress, но ничто не мешает вам обойти механизм перезаписи и самостоятельно проанализировать URL-адреса. Что-то вроде 1. Запустите правила переписывания WordPress. Если контент был найден, отобразите его и выйдите из 2. получите первую часть URL, проверьте, есть ли запись, соответствующая слагу с ожидаемым циклом типа 3. в остальных частях URL, убедитесь, что сообщения существуют и в правильном типе. 4. если все совпадает, отобразите последнее найденное сообщение, иначе отобразите страницу 404
источник