web-dev-qa-db-ja.com

プラグインによって作成されたメニュー項目を削除する

メニュー項目を削除しようとしていますが、いくつかの方法を試しましたが、まだうまくいっていません。これはFAQプラグインから作成されました。

私がこの行を使うならば:

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

それはメインメニューを削除します、しかし私はそのedit.php?post_type=question URLアドレスの中に含まれている2つのサブメニューアイテムを削除したいだけです。

削除したいアイテムについては、URLバーのパスから次のように表示されます。
edit-tags.php?taxonomy=faq-topic&post_type=question
そして
edit-tags.php?taxonomy=faq-tags&post_type=question

私はremove_menu_pageremove_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');
5
John
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()には2つのパラメータと正しいフックが必要です。

そしてvery important:あなたのフックにはとても、とても、とても高い優先順位を使ってください!低い優先順位を使用すると、メニューが追加される前に機能が実行されます。だから削除するメニューはありません。あなたが高い優先順位を使用するならば、あなたの機能が実行される可能性が高いですafterメニューが追加されました。

これは難しい部分かもしれません。

UPDATE

プラグインをインストールして調べたところ、解決策が見つかりました。いくつかの問題といくつかのトリッキーな部分があります。

サブメニューはadd_submenu_page()で追加されたnotで、カスタム投稿タイプで追加されています。 add_submenu_page()による簡単な検索は、メニューのスラッグをコピーして、メニューを削除することは失敗しなければなりません。私はcptスラッグを検索して使用する必要があります。

global $submenu; var_dump( $submenu );の後に私はこの出力を得ます

[more elements]
    '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)
[ more elements ]

これで、メニュースラッグとしてedit.php?post_type=questionを、サブメニュースラッグとしてedit-tags.php?taxonomy=faq-topic&post_type=question/edit-tags.php?taxonomy=faq-tags&post_type=questionを使ってサブメニューを簡単に削除することができました。

注意深く見れば、アンパサンド(&)はhtmlエンティティです。 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}" );

}
8
Ralf912