it-swarm-ko.tech

관리자 메뉴 섹션의 순서 변경

나는 약간의 시간을 어떤 행운도없이이 공정한 작업을 성취하려고 노력하고 난 후에 여기에서 조금 실망하게하게된다.

본질적으로 내가 만든 5 개의 사용자 정의 게시물 유형이 있으며 원하는 것은 모두 직접 해당 특정 순서로 "대시 보드"아래에 표시하는 것입니다.

워드 프레스 문서에서 가장 높은 메뉴 순서가 "5"인 것처럼 보이기 때문에이 작업을 실제로 수행 할 수없는 것으로 보입니다. 그리고 L보다

나는이 기능을 사용하여 플러그인 파일 (내가 아는 것)을 사용하지 않고 내가 원하는 방식으로 관리자 메뉴를 주문할 수있는 간단한 방법을 보여줄 수있는 전문가의 독서를 추측하고있다.

앞으로 5 가지 별도의 게시물 유형을 만들어 대시 보드 바로 아래 특정 순서로 포함 시키십시오. 불가능한 것 같습니다.이 작품을 만드는 데 사용할 수있는 jquery 해킹이 있습니다. jQuery를 사용하지 않고 나와 공유 할 수 있습니까?

31
Binarybit

안녕하세요 @BinaryBit :

당신이 약간 좌절하는 것은 놀라운 일이 아닙니다. 관리자 메뉴는 WordPress 코어를 통해 가장 애매하고 실망스러운 구현 중 하나입니다. 솔직히, 나는 그들이 그렇게 설계했을 때 그들이 무엇을 생각하고 있었는지 모른다.

@ EAMannexcellent _ ​​WordPress에서 관리자 메뉴의 작동 방식을 설명하는 작업을 수행했습니다. 약 4 개월 전에 그것을 읽으려면 ... :)

아직도, 나는 그것이 어떻게 작동했는지 알아 낸 후에도 간단한 일을하려고하는 동안 머리를 똑바로 유지하기에 충분한 시간을 소비하지 않고 여전히 일을 할 수 없었습니다. 그래서 WordPress 관리 메뉴 작업을 단순화하고 간소화하는 Menu API를 만들었습니다.

그것들은 WordPress의 기존 구조와 100 % 호환되며 내가 그것을 사용하는 유일한 조직이기 때문에 여전히 알파로 많이 사용됩니다. 아직 처리하지 않은 유스 케이스가 있다고 확신합니다. 그러나 나는 당신과 다른 사람들이 시험해 볼 수 있도록 여기에 코드를 게시 할 것입니다.

download 파일을 여기에서 테마 디렉토리에 놓을 수 있습니다 : wp-admin-menu-classes.php 테마의 functions.php 파일에서 함수를 호출 할 수 있습니다.

<?php
require_once('wp-admin-menu-classes.php');
add_action('admin_menu','my_admin_menu');
function my_admin_menu() {
  swap_admin_menu_sections('Pages','Posts');              // Swap location of Posts Section with Pages Section
  rename_admin_menu_section('Media','Photos & Video');    // Rename Media Section to "Photos & Video"
  delete_admin_menu_section('Links');                     // Get rid of Links Section
  $movie_tags_item_array = get_admin_menu_item_array('Movies','Movie Tags');  // Save off the Movie Tags Menu
  update_admin_menu_section('Movies',array(               // Rename two Movie Menu Items and Delete the Movie Tags Item
    array('rename-item','item'=>'Movies','new_title'=>'List Movies'),
    array('rename-item','item'=>'Add New','new_title'=>'Add Movie'),
    array('delete-item','item'=>'Movie Tags'),
  ));
  copy_admin_menu_item('Movies',array('Actors','Add New')); // Copy the 'Add New' over from Actors
  renamed_admin_menu_item('Movies','Add New','Add Actor');  // Rename copied Actor 'Add New' to 'Add Actor
  add_admin_menu_item('Movies',array(                       // (Another way to get a 'Add Actor' Link to a section.)
    'title' => 'Alt Add Actor ',
    'slug' => 'post-new.php?post_type=actor',
  ), array(// Add Back the Movie Tags at the end.
    'where'=>'end'
  ));
  add_admin_menu_item('Movies',$movie_tags_item_array,array(// Add Back the Movie Tags at the end.
    'where'=>'end'
  ));
  delete_admin_menu_section('Actors');                      // Finally just get rid of the actors section
}

더욱이,이 함수는 WordPress 3.1 에 포함시키기 위해 _ {(_/기본으로 고려 됨)입니다. 운이 좋으면 이것이 표준이 될 수도 있습니다!

33
MikeSchinkel

다음은 WordPress 관리자 메뉴가 구축 된 방법에 대한 간략한 설명입니다. 저는 add_menu_page API를 말하는 것이 아니며 실제 기본 WordPress 메뉴를 의미합니다.

메뉴 파일 호출하기

메뉴는 분명히 wp-admin/admin.php에 의해로드됩니다. 하지만 WordPress 문서를 기반으로 사용하는 표준 API를 통해로드되지 않습니다. 오히려 전체 메뉴 (가능한 모든 옵션, 하위 메뉴 등)는 wp-admin/menu.php에 정의 된 간단한 배열을 통해로드됩니다.

그래서 메뉴 시스템을로드하려면 admin.phprequires menu.php ... WordPress 3.0의 99 행 주위.

메뉴로드하기

메뉴 자체는 전역 배열 $menu에 저장됩니다. 인라인 문서에 따르면 메뉴 배열에는 다음 요소가 있습니다.

The elements in the array are:
    *     0: Menu item name
    *     1: Minimum level or capability required.
    *     2: The URL of the item's file
    *     3: Class
    *     4: ID
    *     5: Icon for top level menu

예를 들어, 대시 보드는 다음과 같습니다.

$menu[2] = array( __('Dashboard'), 'read', 'index.php', '', 'menu-top menu-top-first menu-icon-dashboard', 'menu-dashboard', 'div' );

이 파일은 각 메뉴 항목을 배열로로드하고 모든 하위 메뉴 항목을 상위 메뉴의 URL을 기반으로 색인을 생성하는 $submenu라는 배열에로드합니다. 따라서 대시 보드의 하위 메뉴 항목 인 "대시 보드"는 다음과 같습니다.

 $submenu[ 'index.php' ][0] = array( __('Dashboard'), 'read', 'index.php' );

시스템이 모든 메뉴를로드하면 (많은 수는 없지만, 시스템이 인덱스를 5 또는 10 단계 씩 진행합니다 ... 대시 보드가 첫 번째 메뉴 항목 임에도 불구하고 여전히 항목 "2"(PHP 배열은 인덱스 0에서 시작합니다 ... 그래서 이것은 약간의 기동실을 제공합니다).

이 시점에서 시스템은 wp-admin/includes/menu.php를 호출합니다.

메뉴를 통해 스테핑하기

이 세 번째 파일은 각 메뉴 항목을 탐색하며 현재 사용자에게 지정된 권한에 따라 메뉴를 사용하거나 제거합니다. 먼저 모든 하위 메뉴를 반복하고 사용자가 액세스 할 수없는 페이지를 제거합니다. 그런 다음 부모 페이지를 반복하고 동일한 작업을 수행합니다. 그런 다음 메뉴 제거로 인해 남아있는 중복 된 구분 기호를 제거합니다.

마지막으로 할당 된 메뉴 순서에 따라 메뉴를 정렬합니다.

주문 메뉴 주문

후크 admin_menu는 메뉴가 설정되었지만 before anything이 주문 된 후에 호출됩니다. 따라서 API를 "해킹"하지 않고 전체 WordPress 메뉴 시스템을 주문할 수 있습니다.

admin_menu 작업이 실행 된 후 사용자 정의 페이지가 시스템에로드됩니다. 그 다음에 일어나는 일은 WordPress가 custom_menu_order라는 필터를 검사하는 것입니다 ...이 필터는 항상 false을 반환하고 사용자 정의 명령을 사용할지 여부를 WordPress에 알려줍니다.

테마에 다음을 추가하여 플래그를 true으로 설정하고 명시 적 메뉴 순서를 정의하십시오.

function custom_menu_order($menu_ord) {
       if (!$menu_ord) return true;
       return array('index.php', 'edit.php', 'edit-comments.php');
}

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

모든 메뉴에 대해 원하는 순서를 지정하십시오 (필자는 메뉴로드 파일에 대한 참조를 제공하여 파일 이름 목록을 얻을 수있게되었습니다).


편집 (2010 년 9 월 2 일) :

이 방법을 사용하여 맞춤 게시 유형의 수정 화면 순서를 지정하려면 수정 화면의 URL을 알아야합니다. 대부분의 경우 http://blog.url/wp-admin/edit.php?post_type=POST_TYPE가됩니다. 이것은 WordPress가 사이트 (루트 또는 하위 폴더에 설치된 경우) 및 사용중인 사용자 정의 게시물 유형의 슬러그에 어떻게 설정되어 있는지에 따라 다릅니다.

예를 들면 ...

'스택 교환 질문'에 대한 맞춤 게시 유형이 있고 편집기를 대시 보드 아이콘 바로 아래에있는 대시 보드와 동일한 섹션에 표시하려고한다고 가정 해 보겠습니다. 테마의 functions.php 파일에 다음 코드를 사용합니다.

function custom_menu_order($menu_ord) {
       if (!$menu_ord) return true;
       return array('index.php', 'edit.php?post_type=stack_exchange_questions');
}

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

나머지 메뉴는 영향을받지 않지만 사용자 정의 편집 페이지는 대시 보드와 동일한 섹션으로 이동되며 바로 아래에 나타납니다. 이를 사용하여 사용자 정의 게시 유형을 관리자 메뉴의 모든 섹션으로 이동하고 순서에 관계없이 배치 할 수 있습니다. 동일한 방법으로 표준 메뉴 항목을 이동할 수도 있습니다.

주어진 섹션에있는 모든 메뉴 항목의 순서를 지정하십시오 그렇지 않으면, 당신의 메뉴는 예기치 않은 이상 함을 겪을 수 있습니다.

21
EAMann

이것이 오래된 스레드라는 것을 알았지 만, 훨씬 쉬운 솔루션으로 업데이트 할 가치가 있다고 생각합니다. 이 버전은 3.5와 호환되며 다른 버전에서는 테스트되지 않았습니다. 다음 코드는 플러그인 또는 functions.php 파일에 배치 할 수 있습니다.

참조 : http://codex.wordpress.org/Plugin_API/Filter_Reference/menu_order . 원래 포스터의 요구에 맞게 약간 수정되었습니다 (하지만 지금까지 솔루션을 찾았 으면합니다 ...).

  // Rearrange the admin menu
  function custom_menu_order($menu_ord) {
    if (!$menu_ord) return true;
    return array(
      'index.php', // Dashboard
      'edit.php?post_type=custom_type_one', // Custom type one
      'edit.php?post_type=custom_type_two', // Custom type two
      'edit.php?post_type=custom_type_three', // Custom type three
      'edit.php?post_type=custom_type_four', // Custom type four
      'edit.php?post_type=custom_type_five', // Custom type five
      'separator1', // First separator
      'edit.php?post_type=page', // Pages
      'edit.php', // Posts
      'upload.php', // Media
      'link-manager.php', // Links
      'edit-comments.php', // Comments
      'separator2', // Second separator
      'themes.php', // Appearance
      'plugins.php', // Plugins
      'users.php', // Users
      'tools.php', // Tools
      'options-general.php', // Settings
      'separator-last', // Last separator
    );
  }

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

여기에 나열되지 않은 관리 메뉴의 항목은 제거되지 않습니다. 메뉴 하단에 추가됩니다.

18
Matt

메뉴 항목을 주위로 이동하려면 전역 $menu 변수를 사용하는 것이 좋습니다.

예를 들어, "페이지"메뉴를 메뉴의 맨 아래로 이동하려면 functions.php 또는 플러그인에서 다음과 같이 사용하십시오.

function admin_menu_items() {
    global $menu;
    $menu[102]=$menu[20];//make menu 102 be the same as menu 20 (pages)
    $menu[20]=array();//make original pages menu disappear

}
add_action('admin_menu', 'admin_menu_items');

게시물과 링크 메뉴를 바꾸려면 다음과 같이하십시오.

function admin_menu_items() {
    global $menu;
    $storemenu = $menu[15];//save links menu into $storemenu
    $menu[15] = $menu[5];//make links menu = posts menu
    $menu[5] = $storemenu; //make menu 5/posts = $storemenu/links   
}
add_action('admin_menu', 'admin_menu_items');

이 트릭을 조금 사용해 보았는데 WP 3.4.1로 테스트했습니다.

2
forlogos

플러그인을 사용하고 싶지는 않지만 이해하기 쉽도록 간단하게 Janis Elsts의 Admin Menu Editor 플러그인을 사용해보십시오. 원하는 방식으로 관리자 메뉴를 재정렬하십시오. 또한 메뉴 항목을 숨길 수 있습니다.

2
Ray Gulick

굉장해. 정말 고맙습니다. 난 그냥 내 function.php에 몇 줄의 코드를 넣었다.

require_once('/extras/wp-admin-menu-classes.php');
add_action('admin_menu','my_admin_menu');
function my_admin_menu() {
  swap_admin_menu_sections('Pages','Posts'); // Swop location of Posts Section with Pages Section
}

또한 wp-admin-menu-classes.php 를 내 테마 폴더에 넣으면 'posts'버튼이 'pages'버튼으로 스왑됩니다.

우리가 두 개의 버튼을 재정렬하기 위해 함수 내에 전체 메뉴를 작성할 필요가 없도록 이것이 곧 코어의 일부가되기를 바랍니다.

실제로 4 개의 버튼에 대해 더 특정한 순서를 얻는 것은 약간 까다 롭습니다. 버튼 4 개를 Pages, Post, Media, Links로 변경하려면 다음 코드를 사용해야합니다.

  swap_admin_menu_sections('Pages','Posts');                
  swap_admin_menu_sections('Media','Links');                 
  swap_admin_menu_sections('Posts','Links');
0
Sebastian