관리 메뉴 섹션 순서 변경?


31

운이 없이이 간단한 작업을 수행하려고 몇 시간을 보낸 후 여기에 약간 좌절했습니다.

본질적으로 나는 5 개의 사용자 정의 게시물 유형을 가지고 있으며 원하는 모든 것은 "dashboard" 바로 아래에 특정 순서로 각각 표시하는 것입니다 .

WordPress 설명서에서 가장 높은 메뉴 순서는 "5"인 것처럼 보이기 때문에 실제로는 할 수없는 것 같습니다. 그리고 L 이상

나는 이것을 읽는 일부 전문가가 플러그인을 사용하지 않고 함수 파일을 사용하여 관리 메뉴를 원하는 방식으로 정확하게 주문할 수있는 간단한 방법을 보여줄 수 있다고 생각합니다.

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

답변:


33

안녕 @BinaryBit :

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

@EAMann훌륭했습니다 WordPress에서 관리자 메뉴가 어떻게 작동하는지 설명하는 일을했습니다 (약 4 개월 전에 읽을 수 있었으면 좋겠습니다 ... :)

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

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

당신은 할 수 있습니다 다운로드 여기 테마의 디렉토리에 드롭 할 수있는 파일 : WP - 관리자 메뉴 - 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에 포함시키기 위해 기본으로 고려 중이므로 운이 좋으면 표준이 될 수도 있습니다!


API에 환상적인 추가! 기존 프레임 워크에 첫 번째 사용자 정의 메뉴 섹션을 추가하는 데 몇 달이 걸렸습니다 (그래서 코드를 많이 연구 한 이유는 ...) ... API 사용이 훨씬 직관적입니다!
EAMann

@EAMann- 감사합니다! 제안 사항을 제안하거나 개선을 위해 협력하고 싶다면이 Q & A를 보는 소수의 사람들을 제외하고 누구나 쉽게 할 수있는 무언가를 만들고 싶습니다.
MikeSchinkel

이것이 핵심이 되었습니까 아니면 관리자의 메뉴 항목 순서를 조작하는 데 여전히 또는 이와 유사한 것이 필요합니까?
Q Studio

내가 찾은 한, 그것은 WP 3.5로 연기되었습니다
pixeline

Mike-wp_debug는이 함수에서 오류를 발생시킵니다. -------- function swap_admin_menu_sections ($ from_section, $ to_section) {$ from_section = get_admin_menu_section ($ from_section); if ($ from_section) $ from_section-> swap_with ($ to_section); $ 섹션 반환; } ---주의 : 정의되지 않은 변수 : section
Q Studio

21

다음은 WordPress 관리 메뉴를 작성하는 방법에 대한 간단한 설명입니다. add_menu_page API를 실제 기본 WordPress 메뉴를 의미합니다.

메뉴 파일 호출

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

그래서, 메뉴 시스템을로드 admin.php단지 require이야 menu.php워드 프레스 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' );

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

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

시스템이 모든 메뉴를로드 한 후에 (많은 것은 없지만 시스템은 5 또는 10 씩 색인을 단계별로 밟습니다 ... 대시 보드는 첫 번째 메뉴 항목이지만 여전히 항목 "2"(PHP 배열은 인덱스 0에서 시작합니다. 따라서 약간의 조작 공간이 생깁니다).

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

메뉴를 통해 스테핑

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

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

맞춤 메뉴 주문

후크 admin_menu는 메뉴를 설정 한 후 주문 하기 전에 호출 됩니다. 따라서 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');

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

주어진 섹션에서 모든 메뉴 항목의 순서를 지정하십시오 . 그렇지 않으면 메뉴에 예기치 않은 이상이 발생할 수 있습니다.


귀하의 예제 코드에서 작은 오류가있는 경우 조건문이 누락은 "주문 사용자 정의 메뉴"제목 아래에있다 $.. 변수 이름 (대 응답하지만)에
t31os

"스택 교환 질문"에 대한 사용자 정의 게시물 유형을 대시 보드 섹션 아래 섹션에 어떻게 추가 하시겠습니까?
epaps

안녕 EAMann-빠른 질문. 최신 버전의 워드 프레스에서이 프로세스가 전혀 바뀌 었거나 더 단순 해졌습니까?
NetConstructor.com

방법에 대한 하위 메뉴 ? 하위 메뉴 항목 을 재배 열하는 비슷한 방법이 있습니까?
Giraldi

@GiraldiMaggio 새로운 질문을 하고 이것을 참조하십시오.
EAMann

18

나는 이것이 오래된 스레드라는 것을 알고 있지만 훨씬 쉬운 솔루션으로 업데이트 할 가치가 있다고 생각합니다. 이것은 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');

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


1
그렇습니다. 하위 메뉴 항목을 다시 정렬하여 설정을 해제 한 다음 재설정 할 수 있습니다.
Wyck December

2

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


다중 사이트 설치 에서이 플러그인을 사용해 보았지만 가장 잘 작동하지만 다중 사이트 설치가있는 경우 모든 하위 사이트에 대한 옵션을 수동으로 구성해야합니다.
user391

2

메뉴 항목을 이동하려면 전역 $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로 테스트 한이 트릭을 약간 사용했습니다.


나는 이것이 이전 게시물입니다하지만 마지막 줄에 문제에 귀하의 첫 번째 조각의 I의 RAN에 관해서 알고 admin_menu_items로 교체하여 고정 기능unset($menu[20]);
hot_barbara

0

대단해 정말 고맙습니다. 방금 함수에 몇 줄의 코드를 넣었습니다.

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 를 배치하면 '게시물'버튼이 '페이지'버튼으로 바뀌 었습니다.

이 기능이 곧 핵심 기능의 일부가되어 두 버튼을 재정렬하기 위해 함수 내에서 전체 메뉴를 작성할 필요가 없기를 바랍니다.

실제로 4 개의 버튼에 대해 더 지정된 순서를 얻는 것은 약간 까다 롭습니다. 4 개의 버튼 중 하나를 페이지, 게시물, 미디어, 링크로 변경하려면 다음 코드를 사용해야했습니다.

  swap_admin_menu_sections('Pages','Posts');                
  swap_admin_menu_sections('Media','Links');                 
  swap_admin_menu_sections('Posts','Links');
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.