Intereting Posts
meta_query для идентификатора пользователя в массиве Как добавить <span> после тега <a> в виджетах WordPress? Использовать переведенные метки таксономии в плагине Как вызвать функцию плагина из формы переднего плана Как я могу отправить несколько получателей Contact Form 7 на основе ввода формы? Как удалить некоторые параметры экрана и мета-ящики из добавления / редактирования типа сообщения? Дублировать «Страницы» в меню администратора Как я могу улучшить подход к таксономии? Получить список таксономий, связанных с пользователями Загрузка файла PDF и предоставление ссылок на скачивание Использование короткого кода аудио для .mp3 URL-адресов с строкой запроса Есть ли способ сократить срок хранения содержимого страницы? Добавление menu_order к странице администратора CPT Тема Клео для WordPress с необычным необычным наверху Как создать эту постоянную ссылку: post_type / postname / custom_inner_page

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

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

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

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

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

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

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

Способ 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; } );