Intereting Posts
Пользовательский шаблон архива таксономии не признан Добавить класс в <i> и <span> в bootstrap nav walker Как я могу динамически загружать другой шаблон страницы, чтобы предоставить альтернативный макет сообщений? Я пытаюсь добавить div только для одной категории Добавьте пользовательскую форму на странице администрирования post-new.php Можно ли удалить один плагин из другого плагина? UserMeta изменяет значение метаданных для идентификатора сообщения Отображать сообщения только из одной формы сообщения в пользовательском запросе и исключать в основном запросе Изменить классы выравнивания для изображений Редактировать заголовок страницы в пользовательском плагине Нет флажка в таблице списка сообщений WordPress для CPT Как использовать категории, подкатегории и настраивать навигацию Ошибка WordPress при выходе из системы «Не разрешено» и не может выйти из системы Поместите категории и теги в раскрывающийся список, Категории как параметры и теги в качестве групп опций Редактируемый стол для конечных пользователей

Показать иерархическую взаимосвязь между настраиваемыми типами сообщений в списке admin

У меня есть два пользовательских типа сообщений: «запрос» и «цитата». Оба имеют флаг «иерархический», равный true.

«Запрос» cpt может быть родителем одного или нескольких «котировок» cpt.

Поскольку это два разных типа сообщений, администратор WordPress имеет отдельные обзорные списки (например, edit.php? Post_type = request) для обоих.

То, что я ищу, – это способ отформатировать обзор запроса так же, как отформатирован иерархический список страниц, например:

  • Запрос 1
    • Ответить с цитированием
    • Ответить 2
  • Запрос 2
    • Ответить с цитированием
    • Ответить 4

Мне нужно сделать это только на стороне администратора (поскольку я не использую front-end).

Solutions Collecting From Web of "Показать иерархическую взаимосвязь между настраиваемыми типами сообщений в списке admin"

Способ WordPress для иерархических типов сообщений заключается в том, что родительский пост всегда должен быть одним и тем же типом дочерних типов.

По этой причине в экранах администратора тип сообщения в edit.php довольно жестко.

Однако, что WordPress делает, это запустить WP_Query где аргумент post_type является текущим.

Итак, что вы можете сделать?

Прежде всего, если вы хотите объединить 2 экрана cpt admin, вы можете скрыть экран администратора для «цитаты». Это очень просто: когда вы регистрируете тип сообщения, просто установите аргумент public для false:

 $args = array( // all other args here 'hierarchical' => TRUE 'public' => FALSE ); register_post_type( 'quote', $args ); 

Таким образом, экран управления цитатой не отображается, поэтому у вас есть только «запрос».

То, что вам нужно сделать, – это перехватить запрос и установить аргумент 'post_type' в массив, содержащий как «запрос», так и «цитату».

Проблема заключается в том, что глобальная переменная «post_type» будет установлена ​​в этот массив, но WordPress ожидает, что «post_type» строка закончится в некоторых ошибках. Чтобы избежать этих ошибок, мы должны найти крючок, чтобы глобальный 'post_type' был строковым «запросом».

После быстрого просмотра файла, ответственного за вывод таблицы сообщений администратора: 'wp-admin/includes/class-wp-posts-list-table.php' Я обнаружил, что хорошим крючком для области может быть 'edit_posts_per_page' фильтра 'edit_posts_per_page' .

Итак, код:

 add_action( 'pre_get_posts', function( $query ) { if ( is_admin() ) { // do nothing if not is admin $scr = get_current_screen(); // if in the right admin screen if ( $scr->base === 'edit' && $scr->post_type === 'request' ) { // force query to get both 'request' and 'quote' cpt $query->set( 'post_type', array( 'request', 'quote' ) ); // force global $post_type to be = 'request' if is an array add_filter( 'edit_posts_per_page', function( $perpage ) { global $post_type; if ( is_array( $post_type ) && in_array( 'request', $post_type ) ) { $post_type = 'request'; } return $perpage; // we don't want to affect $perpage value } ); } } return $query; } );