Удаление пункта меню, созданного плагином

15 апр. 2013 г., 04:40:05
Просмотры: 14.8K
Голосов: 8

Я пытаюсь удалить пункт меню и пробовал несколько подходов, но безрезультатно. Этот пункт был создан плагином FAQ.

Если я использую эту строку:

remove_menu_page( 'edit.php?post_type=question' );

Она удалит главное меню, однако я хочу удалить только два подпункта внутри этого URL-адреса edit.php?post_type=question.

Для пунктов, которые я хочу удалить, URL-адрес в строке браузера показывает следующее:
edit-tags.php?taxonomy=faq-topic&post_type=question
и
edit-tags.php?taxonomy=faq-tags&post_type=question

Я пробовал несколько решений, включая remove_menu_page и remove_submenu_page, но без успеха.

Что не сработало:

remove_submenu_page( 'edit.php?post_type=question', 'edit-tags.php?taxonomy=faq-topic&post_type=question');
remove_menu_page( 'edit-tags.php?taxonomy=faq-tags') ;
remove_menu_page( 'edit-tags.php?taxonomy=faq-tags&post_type=question') ;
remove_submenu_page( 'edit.php?post_type=question', 'edit-tags.php?taxonomy=faq-topic&post_type=question');
remove_submenu_page( 'edit.php', 'edit-tags.php?taxonomy=faq-topic&post_type=question');
remove_submenu_page( 'edit.php', 'edit-tags.php?taxonomy=faq-topic');
remove_submenu_page( 'edit.php', 'edit-tags.php');
4
Комментарии

Можете показать часть кода, который вы уже пробовали?

Pat J Pat J
15 апр. 2013 г. 04:45:01

Я добавил это в начало, чтобы сделать код чище.

John John
15 апр. 2013 г. 04:51:09

Вы использовали ваши вызовы remove_submenu_page() и remove_menu_page() внутри хука действия? Смотрите пример на странице Codex.

Pat J Pat J
15 апр. 2013 г. 04:53:47

Да, я использовал это внутри хука действия.

add_action( 'admin_menu', 'my_remove_menu_pages' );

function my_remove_menu_pages() { /эти функции здесь/ }

John John
15 апр. 2013 г. 05:06:50
Все ответы на вопрос 2
10
11
function remove_submenu() {

    remove_submenu_page( 'edit.php', 'edit-tags.php?taxonomy=faq-topic&post_type=question' );
    remove_submenu_page( 'edit.php', 'edit-tags.php?taxonomy=faq-tags&post_type=question' );
}

add_action( 'admin_menu', 'remove_submenu', 999 );

Пожалуйста, ознакомьтесь с Кодексом. Функция remove_submenu_page() требует два параметра и правильный хук.

И очень важно: используйте очень, очень, очень высокий приоритет в вашем хуке! Если вы используете низкий приоритет, ваша функция выполнится до добавления меню. Таким образом, не будет меню для удаления. Если вы используете высокий приоритет, есть хороший шанс, что ваша функция выполнится после добавления меню.

Это может быть сложной частью.

ОБНОВЛЕНИЕ

После установки и анализа плагина я нашел решение. Есть несколько проблем и сложных моментов.

Подменю не добавляются с помощью add_submenu_page(), они добавляются с пользовательским типом поста. Простой поиск по add_submenu_page(), копирование слогов меню и удаление меню не сработает. Мне нужно искать slug CPT и использовать его.

После global $submenu; var_dump( $submenu ); я получил такой вывод:

[другие элементы]
    'edit.php?post_type=question' => 
        array (size=7)
          5 => 
            array (size=3)
              0 => string 'FAQs' (length=4)
              1 => string 'edit_posts' (length=10)
              2 => string 'edit.php?post_type=question' (length=27)
          10 => 
            array (size=3)
              0 => string 'Neue FAQ' (length=8)
              1 => string 'edit_posts' (length=10)
              2 => string 'post-new.php?post_type=question' (length=31)
          15 => 
            array (size=3)
              0 => string 'FAQ Titel' (length=9)
              1 => string 'manage_categories' (length=17)
              2 => string 'edit-tags.php?taxonomy=faq-topic&post_type=question' (length=55)
          16 => 
            array (size=3)
              0 => string 'FAQ Tags' (length=8)
              1 => string 'manage_categories' (length=17)
              2 => string 'edit-tags.php?taxonomy=faq-tags&post_type=question' (length=54)
[ другие элементы ]

Теперь было легко удалить подменю с помощью edit.php?post_type=question как slug меню и edit-tags.php?taxonomy=faq-topic&post_type=question / edit-tags.php?taxonomy=faq-tags&post_type=question как slug подменю.

Если присмотреться, амперсанд (&) представлен как HTML-сущность. Невозможно просто скопировать часть URL и вставить её. Таким образом, нельзя удалить подменю с незакодированным URL, он должен быть URL-кодированным.

И вот окончательный код:

add_action( 'admin_menu', 'remove_faq_subpages', 999 );

function remove_faq_subpages() {

    $ptype = 'question';
    remove_submenu_page( "edit.php?post_type={$ptype}", "edit-tags.php?taxonomy=faq-tags&post_type={$ptype}" );
    remove_submenu_page( "edit.php?post_type={$ptype}", "edit-tags.php?taxonomy=faq-topics&post_type={$ptype}" );

}
15 апр. 2013 г. 05:15:40
Комментарии

К сожалению, это тоже не сработало. Следующий скриншот будет крайне полезен. Я попробовал сделать это другим способом... используя переменные на скриншоте, но не смог заставить это работать. http://s7.postimg.org/7m36rciob/this_might_help.jpg

John John
15 апр. 2013 г. 05:18:52

Вот более четкий скриншот, извините, он немного обрезан http://s17.postimg.org/uj18k5vvz/FAQ_help.jpg

John John
15 апр. 2013 г. 05:21:55

Откройте плагин, найдите строку, где меню добавляется с помощью add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function );. Используйте $parent_slug и $menu_slug для удаления подменю.

Ralf912 Ralf912
15 апр. 2013 г. 05:23:19

Я также обновил свой ответ. Приоритет вашего хука очень важен, потому что add_submenu_page() и remove_submenu_page() используют один и тот же хук. Убедитесь, что ваш remove_submenu_page() вызывается как можно позже.

Ralf912 Ralf912
15 апр. 2013 г. 05:29:39

Ваши комментарии были полезны, но я не уверен, как удалить это... даже после просмотра файла faq-manager.php внутри этого плагина.

Я использую этот плагин: http://wordpress.org/extend/plugins/wordpress-faq-manager/

Я видел упомянутый вами $parent_slug и $menu_slug, но это не особо помогло... $parent_slug у нас правильный, а вот $menu_slug под вопросом... Возможно, вы сможете разобраться, посмотрев сам плагин.

John John
15 апр. 2013 г. 05:39:38

И каково решение...?

Ralf912 Ralf912
15 апр. 2013 г. 12:58:31

Я пошел по легкому пути и нашел плагин, который смог это сделать. Я использовал Adminimize и легко справился с задачей.

John John
17 апр. 2013 г. 03:35:23

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

Ralf912 Ralf912
17 апр. 2013 г. 13:27:06

В конце концов я нашел причины, по которым все решения не работали. Сначала это был пользовательский тип записи, а не подменю. И URL должен быть закодирован. Простой амперсанд (&) в URL не сработает.

Ralf912 Ralf912
17 апр. 2013 г. 18:21:40

@Ralf912 спасибо. & сработало после долгих раздумий.

tsdexter tsdexter
23 нояб. 2015 г. 06:38:27
Показать остальные 5 комментариев
0

Сделать пункт меню видимым только для администратора:

function hide_admin_menu()
{
    if ( !current_user_can('administrator')) {
        remove_menu_page('wpca');
    }
}

add_action('admin_menu', 'hide_admin_menu', 999);
26 мая 2020 г. 13:38:35