web-dev-qa-db-ja.com

管理サブメニュー項目を注文しますか?

私はadd_submenu_pageを使用してCPT管理メニューに項目を追加していますが、これはCPTオプションの後のサブメニューの一番下に追加されます。私はそれらを一番上に置くことができるようにしたいのですが、私はこの質問がAdminベースのすべてのサブメニュー項目を注文することにもあてはまると思います。

私が試したこと(うまく動かない、私はいくつかのバリエーションを試した)、

function custom_menu_order($menu_ord) {
       if (!$menu_ord) return true;

       return array( 

         'edit.php?post_type=page' =>array(
                                      'edit.php?post_type=note',
                                      'edit_pages',
                                      'notes',
                                      )   
                    );
}

add_filter('custom_menu_order', 'custom_menu_order');
add_filter('menu_order', 'custom_menu_order');

これはmenu_orderフィルタがサブメニューを考慮に入れていないためでしょうか?

4
Wyck

Wp-admin/includes/menu.phpのapply_filtersはフィルタされたコンテンツとしてfalseを提供するので、フィルタ 'custom_menu_order'はメニューの順序では機能しません。あなたはfalseを$ menuに変えることを試みることができますそしてフィルターは壮大に働きます。

私たちは明らかにコアに触れることができないので、これが私がそれを機能させる方法です:

function custom_menu_order(){
    global $submenu;

    $find_page = 'edit.php';
    $find_sub = 'Post Tags';

    foreach($submenu as $page => $items):
        if($page == $find_page):
            foreach($items as $id => $meta):
                if($meta[0] == $find_sub):
                    $submenu[$find_page][0] = $meta;
                    unset ($submenu[$find_page][$id]);
                    ksort($submenu[$find_page]);
                endif;
            endforeach;
        endif;
    endforeach;
}
add_action('_admin_menu', 'custom_menu_order');
3
Brian Fegter

私はネクロ投稿していますが、最近同じ問題を抱えています。この答えを得るために私はRaoの SO の解法)を使ったことに注意してください。

あなたのCPTが「メモ」と呼ばれていると仮定します。

/**
 * @see https://codex.wordpress.org/Plugin_API/Filter_Reference/menu_order
 */
add_filter( 'custom_menu_order', 'change_note_submenu_order' );

/**
 * Change the submenu order for the Note CPT in the Admin panel
 * 
 * @param  [type] $menu_ord I don't think this is actually used for anything...
 * @return [type]           $menu_ord
 * @see https://stackoverflow.com/questions/18766477/wordpress-change-admin-submenu-order
 */
function change_note_submenu_order( $menu_ord ) {
  global $submenu;

  /* Uncomment the line below to see all menu orders */
  // echo '<pre>'.print_r($submenu,true).'</pre>';

  /**
   * NOTE: Original note submenu order should be:
   *  5 (note list),
   * 10 (Add new),
   * 15 (Categories),
   * 16 (Tags),
   * 17 (Your Custom Page added via add_submenu_page) */
  $arr = array();
  $arr[] = $submenu['edit.php?post_type=note'][17]; // Custom menu page (Omit if unused)
  $arr[] = $submenu['edit.php?post_type=note'][5];  // Note List
  $arr[] = $submenu['edit.php?post_type=note'][10]; // Add New Note
  $arr[] = $submenu['edit.php?post_type=note'][15]; // Categories
  $arr[] = $submenu['edit.php?post_type=note'][16]; // Tags
  $submenu['edit.php?post_type=note'] = $arr;

  return $menu_ord;
}

問題がある場合はecho '<pre>'.print_r($submenu,true).'</pre>';を間違いなくコメントアウトしてください。 change_note_submenu_order関数でも手動で配列を設定できることも覚えておいてください。

$notes_list  = array("Notes", "edit_posts", "edit.php?post_type=notes");
$custom_page = array("Custom Menu Page Title", "Capability", "Menu Slug", "Page Title");
$new_note    = array("Add New", "edit_posts", "post-new.php?post_type=note");
$arr         = array($custom_page, $notes_list, $new_note);
$submenu['edit.php?post_type=note'] = $arr;

これが誰かに役立つことを願っています!

3
StephanieQ

より単純な問題に対するもう一つのネクロ。

私はカスタムリンクを一番下に移動したいと思いました(それがどのように元の質問に対処するのにも使えるかについてのコメントを追加しました):

public function change_wc_submenu_order( $menu_order ) {
    global $submenu;

    foreach ( $submenu['woocommerce'] as $index => $item ) {
        if ('My Custom Submenu Title' === $item[0] ) {
            $custom = $item;
            unset( $submenu['woocommerce'][$index] );
            break;
        }
    }

    if ( ! empty( $custom ) ) {
        // If we want it at the beginning, use array_unshift() instead
        array_Push( $submenu['woocommerce'], $custom );
    }

    return $menu_order;
}
0
Camwyn