Нюанс в добавлении CPT и TAX в подменю

У меня много CPT и пользовательских налоговых деклараций, и я решил добавить их в несколько подменю. Все прошло отлично. Я объясню, как я это сделал в одно мгновение, но проблема в том, что когда вы выбираете «новый термин» или «новый пост», меню боковой панели администратора теряет следы нахождения в подменю и сворачивает меню. Это не имеет особого значения, поскольку вы можете добавить элемент, а затем снова открыть меню администратора, но это раздражитель, который я бы хотел удалить.

Чтобы помочь объяснить мою проблему, я включил несколько снимков экрана. Вот меню «Администратор», когда я открываю его в меню / подменю «LG RefData / UOM»:

введите описание изображения здесь

Пока все хорошо. BTW, UOM – это CPT (не TAX). Теперь, если я нажму кнопку «Добавить новый» в верхней части страницы edit.php, он отобразит страницу в порядке, но меню администратора рухнет, чтобы выглядеть так:

введите описание изображения здесь

Так что это основная проблема, но есть небольшое следствие, связанное с тем, как ведет себя TAX. На исходном снимке экрана вы видите подменю под названием «UOM Context», которое является таксономии. По умолчанию нажатие на это немедленно сворачивает меню администратора, но я нашел способ обойти это (более того, в секунду), но мое решение по-прежнему оставляет меню, подобное этому, когда я нажимаю ссылку «UOM Context»:

введите описание изображения здесь

Обратите внимание, что пока он не рухнул, он не выделяет (aka, boldfacing) подменю.

Поэтому позвольте мне показать вам код, который я использовал для его настройки (хотя это, вероятно, довольно стандартный код для людей, пытающихся это сделать). Первое, что происходит с точки зрения исполнения, – это регистрация CPT и TAX. Трюк с CPT состоит в том, чтобы использовать «show_in_menu» и установить его для названия страницы меню, в которой он будет сидеть:

// Default args array( 'label' => $plural, 'labels' => $labels, 'public' => true, 'show_ui' => $this->show_menu, 'show_in_menu' => $this->show_in_menu, 'supports' => array( 'title', 'editor' , 'excerpt'), 'show_in_nav_menus' => true, 'menu_icon' => LG_FE_DIR . "/img/lg-admin.png", 'menu_position' => $this->get_menu_priority(), '_builtin' => false, ), 

Обратите внимание, что это необязательно для TAX, и в моих экспериментах это, кажется, не имеет эффекта, поэтому я только что его исключил. Вторым шагом являются вызовы add_menu_page и add_submenu_page:

 add_menu_page ("LG Ref Data", "LG Ref Data", "manage_options", LG_REFDATA_MENU, "LG_AdminMenuSystem::show_reference_menu", plugins_url ("/img/LG.png", __DIR__), 61.1); add_submenu_page (LG_REFDATA_MENU,"UOMs","UOMs","manage_options",'edit.php?post_type=uoms'); add_submenu_page (LG_REFDATA_MENU,"UOM Context","UOM Context","manage_options",'edit-tags.php?taxonomy=uom-contexts&post_type=uoms'); array_push (self::$tax_correct, "uom-contexts"); 

Довольно стандартный материал, за исключением последней строки, которая является началом моего исправления TAX, о котором я упоминал ранее (иначе, останавливает меню при смене при выборе пункта TAX, но не останавливает его при добавлении нового элемента). Вот код для исправления:

 static public function tax_menu_correction ($parent_file) { global $current_screen; $taxonomy = $current_screen->taxonomy; if ( in_array($taxonomy,self::$tax_correct) ) $parent_file = LG_REFDATA_MENU; return $parent_file; } 

который затем вызывается из следующего крючка:

 add_action( 'parent_file' , 'LG_AdminMenuSystem::tax_menu_correction'); // helps to keep the menu selection on the menu when choosing a custom TAX 

Итак, это все. Любая помощь будет очень признательна.

Solutions Collecting From Web of "Нюанс в добавлении CPT и TAX в подменю"

Я ответил на аналогичный вопрос . AFAIK, вам нужно решить это с помощью jQuery.

 var reference = $('#my-draft-posts').parent().parent(); // add highlighting to our custom submenu reference.addClass('current'); //remove higlighting from the default menu reference.parent().find('li:first').removeClass('current'); 

И трюк заключается в том, чтобы добавить идентификатор в свои пользовательские меню, чтобы вы могли reference них.

 add_submenu_page( 'edit.php', 'Drafts', '<span id="my-draft-posts">Drafts</span>', // <---- HERE 'edit_pages', 'edit.php?post_status=draft&post_type=post' ); 

Скорее всего, вам понадобится больше jQuery, чем этот образец.

Теперь у меня трещина, так как у меня есть плагин, который ему нужен. Я также использую parent_file hook фильтра parent_file который позволяет указать пункт меню верхнего уровня администратора, под которым ваша страница логически сидит. (NB: это фильтр, а не действие, add_action также работает, но на самом деле это должно быть add_filter)

Моя проблема в том, что я действительно не хочу, чтобы страница редактирования настраиваемого типа сообщений отображалась в меню, я просто хочу связать ее с другой страницей, находящейся в меню. Это означает, что у меня есть 'show_in_menu' => false который, я думаю, является тем, что вы сказали, что у вас тоже есть.

Чтобы получить элемент подменю, установленный как «текущий», мне пришлось добавить побочный эффект, который изменяет глобальную переменную $submenu_file чтобы соответствовать странице, на которой у меня есть эта ссылка.

NB: это почти точная копия из какого-либо рабочего кода, поэтому, пожалуйста, приспосабливайтесь к вашему коду.

 // this filter only added when loading the edit page add_filter('parent_file', 'wpse_71865_filterParentFile'); /** * tell WordPress admin the parent page for the menu * @param string $parent_file * @return string */ public function wpse_71865_filterParentFile($parent_file) { global $submenu_file; // set parent menu item for filter return // (Gravity Forms in my case) $parent_file = 'gf_edit_forms'; // set submenu item by side effect, link isn't in menu $submenu_file = 'gfdpspxpay-options'; return $parent_file; } 

Обратите внимание, что я привязываюсь к странице (например, page=gfdpspxpay-options ), поэтому $submenu_file может не работать для вас. Если нет, то посмотрите на wp-admin/menu-header.php где все это происходит. Есть массив $submenu_items который зацикливается, чтобы создать подменю, и именно здесь происходит все действие.

edit: Я считаю, что для вашей проблемы вам просто нужно установить:

 $submenu_file = 'post-new.php?post_type=uoms' 

Хммм. Я не знаю, что здесь произошло. Я мог бы поклясться, что уже ответил на этот вопрос и закрыл его. В любом случае я использовал подход, основанный на предложении @ brasofilo. В основном здесь все, что вам нужно сделать:

На вашем PHP, где вы регистрируете подменю, используйте объявление, подобное этому:

 add_submenu_page ( LG_TRANSACTIONAL_MENU, $plural ,"<span id='submenu-{$plural}'>" . $plural . "</span>", "manage_options", "edit.php?post_type={$this->custom_type_slug_name}" ); 

В моем случае этот PHP находится в плагине с настраиваемым пост-типом, который я написал, поэтому имена переменных относятся к этому, но ключевая часть состоит только в том, что вы добавляете идентификатор DOM, который может выбрать ваш jQuery. В этом случае идентификатор будет подменю [множественное имя CPT] .

Остальное выполняется с помощью jQuery:

 // If on a custom taxonomy editing page then make sure the menu item is selected if ( adminpage === "edit-tags-php") { $('#submenu-' + pagenow).closest('li').addClass('current'); } // if on a edit post-type page (post-new.php) then make sure menu is selected, expanded, and the submenu is current if (adminpage === "post-new-php") { $('#submenu-edit-' + pagenow).closest('li').addClass('current'); $('#submenu-edit-' + pagenow).closest('.wp-has-submenu').removeClass('wp-not-current-submenu').addClass('wp-has-current-submenu'); }