การเปลี่ยนลำดับเมนูผู้ดูแลระบบ


31

ฉันรู้สึกผิดหวังเล็กน้อยที่นี่หลังจากใช้เวลาสองสามชั่วโมงในการพยายามทำสิ่งนี้ให้เป็นเรื่องง่ายโดยไม่มีโชค

โดยเฉพาะอย่างยิ่งผมมี 5 ประเภทโพสต์ที่กำหนดเองที่ฉันสร้างขึ้นและทั้งหมดที่ฉันต้องการจะทำคือการแสดงแต่ละของพวกเขาในการสั่งซื้อที่เฉพาะเจาะจงโดยตรงภายใต้"แดชบอร์ด"

จากเอกสาร WordPress ดูเหมือนว่าคุณไม่สามารถทำสิ่งนี้ได้จริงเพราะลำดับเมนูสูงสุดดูเหมือนจะเป็น "5" และเหนือ L

ฉันเดาว่าผู้เชี่ยวชาญบางคนกำลังอ่านสิ่งนี้สามารถแสดงให้ฉันเห็นวิธีง่ายๆที่ฉันสามารถสั่งเมนูผู้ดูแลระบบอย่างที่ฉันต้องการโดยการใช้ไฟล์ฟังก์ชั่นและโดยไม่ต้องใช้ปลั๊กอิน (ซึ่งฉันรู้อยู่)

โปรดไปข้างหน้าและลองสร้างโพสต์ 5 แบบแยกกันและรวมไว้ในลำดับเฉพาะโดยตรงภายใต้แดชบอร์ด ... ดูเหมือนว่ามันจะเป็นไปไม่ได้หรือไม่ ... ... มีแฮ็ค jquery บางประเภทที่จะทำให้คนนี้ทำงาน สามารถแบ่งปันกับฉันหรือดีกว่าโดยไม่ใช้ jQuery?

คำตอบ:


33

สวัสดี@BinaryBit:

ไม่น่าแปลกใจที่คุณจะผิดหวังเล็กน้อย เมนูผู้ดูแลระบบเป็นหนึ่งในการใช้งานที่ป้านและน่าผิดหวังมากที่สุดผ่านทางแกน WordPress จริงๆแล้วฉันไม่รู้ว่าพวกเขากำลังคิดอะไรอยู่เมื่อพวกเขาออกแบบมันในแบบนั้น

@EAMannทำได้ดีมากในการอธิบายว่าเมนู admin ทำงานอย่างไรใน WordPress (ฉันหวังว่าฉันจะสามารถอ่านได้เมื่อประมาณ 4 เดือนที่ผ่านมา ... :)

แต่ถึงกระนั้นหลังจากที่ฉันคิดออกว่ามันทำงานอย่างไรฉันยังคงสูญเสียที่จะทำงานกับมันโดยไม่เสียเวลามากพอที่จะทำให้หัวของฉันตรงในขณะที่ฉันพยายามทำสิ่งที่ง่าย นั่นเป็นเหตุผลที่ฉันสร้าง Menu APIที่ทำให้การทำงานกับเมนู admin ของ WordPress ง่ายขึ้นและคล่องตัวขึ้น

มันเข้ากันได้ 100% กับโครงสร้างที่มีอยู่ของ WordPress และยังคงเป็นอัลฟาอย่างมากตั้งแต่ฉันเป็นคนเดียวที่ใช้มัน ฉันแน่ใจว่ามีกรณีการใช้งานที่พวกเขายังไม่ได้จัดการ แต่ฉันจะโพสต์รหัสที่นี่เพื่อให้คุณและคนอื่น ๆ ลองดู

คุณสามารถดาวน์โหลดไฟล์เพื่อวางในไดเรกทอรีของธีมได้ที่นี่: 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ดังนั้นหากเราโชคดีสิ่งเหล่านี้อาจกลายเป็นมาตรฐาน!


API ที่ยอดเยี่ยมมาก ! ฉันใช้เวลาหลายเดือนในการเพิ่มส่วนเมนูที่กำหนดเองครั้งแรกของฉันด้วยกรอบงานที่มีอยู่ (ซึ่งเป็นเหตุผลที่ฉันศึกษาโค้ดทำได้มาก) ... แต่ API ของคุณดูเหมือนจะใช้งานได้ง่ายกว่ามาก!
EAMann

@EAMann - ขอบคุณ! หากคุณต้องการที่จะให้คำแนะนำใด ๆ หรือแม้กระทั่งร่วมมือในการปรับปรุงมันฉันชอบที่จะได้รับบางสิ่งบางอย่างที่สร้างขึ้นซึ่งสามารถทำให้ง่ายขึ้นสำหรับทุกคนยกเว้นเพียงไม่กี่คนที่จะเห็นคำถาม
MikeSchinkel

สิ่งนี้ทำให้เป็นแกนหลักหรือเป็นสิ่งนี้หรือคล้ายกันที่จำเป็นต้องใช้เพื่อจัดการลำดับของรายการเมนูในผู้ดูแลระบบหรือไม่
Q Studio

เท่าที่ฉันได้พบมันถูกเลื่อนออกไปเป็น WP 3.5
pixeline

เฮ้ Mike - wp_debug โยนข้อผิดพลาดในฟังก์ชั่นนี้: -------- ฟังก์ชั่น swap_admin_menu_sections ($ from_section, $ to_section) {$ from_section = get_admin_menu_section ($ from_section); ถ้า ($ from_section) $ from_section-> swap_with ($ to_section); ส่งคืนส่วน $; } --- ข้อสังเกต: ตัวแปรที่ไม่ได้กำหนด: ส่วน
Q Studio

21

นี่เป็นคำแนะนำเบื้องต้นเกี่ยวกับวิธีการสร้างเมนูผู้ดูแลระบบ WordPress - ฉันไม่ได้พูดถึงadd_menu_pageAPI ฉันหมายถึงเมนู WordPress เริ่มต้นจริง

กำลังเรียกไฟล์เมนู

เมนูถูกโหลดอย่างชัดเจน wp-admin/admin.phpอย่างชัดเจน แต่มันไม่ได้โหลดผ่าน API มาตรฐานที่เราคุ้นเคยโดยใช้เอกสารเวิร์ดเพรส แต่เมนูทั้งหมด (ตัวเลือกที่เป็นไปได้ทุกเมนูย่อย ฯลฯ ) wp-admin/menu.phpจะถูกโหลดผ่านอาร์เรย์ที่เรียบง่ายที่กำหนดไว้ใน

ดังนั้นเพื่อโหลดระบบเมนูadmin.phpเพียงrequire s menu.php... บริเวณเส้น 99 ใน WordPress 3.0

กำลังโหลดเมนู

$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 ของเมนูหลัก ดังนั้นรายการเมนูย่อยของ Dashboard ชื่อ "Dashboard" คือ:

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

หลังจากที่ระบบทำการโหลดเมนูทั้งหมดเสร็จแล้ว (มีไม่มากนัก แต่ระบบจะทำการเลื่อนดัชนีไปทีละ 5 หรือ 10 ... สังเกตว่าแดชบอร์ดถึงแม้ว่ามันจะเป็นรายการเมนูแรกก็ตาม รายการ "2" (PHP อาร์เรย์เริ่มต้นที่ดัชนี 0 ... นี่จะช่วยให้คุณมีห้องซ้อม)

wp-admin/includes/menu.phpจุดนี้สายระบบ

ก้าวผ่านเมนู

ไฟล์ที่สามนี้จะผ่านแต่ละรายการเมนูและตามสิทธิ์ที่กำหนดให้กับผู้ใช้ปัจจุบันอาจใช้เมนูหรือลบออก ก่อนอื่นจะวนซ้ำเมนูย่อยทั้งหมดและลบหน้าที่ผู้ใช้ไม่สามารถเข้าถึงได้ จากนั้นมันจะวนซ้ำไปตามเพจระดับบน จากนั้นจะลบตัวคั่นที่ซ้ำกันที่เหลืออยู่จากการตัดเมนูออก

ในที่สุดมันเรียงลำดับเมนูตามลำดับเมนูที่กำหนด

สั่งเมนูกำหนดเอง

เบ็ดadmin_menuถูกเรียกหลังจากตั้งเมนู แต่ก่อนสั่งอะไร ดังนั้นจึงเป็นไปได้ที่จะสั่งซื้อทั้งระบบเมนู WordPress โดยไม่ต้อง "แฮ็ค" API

หลังจากดำเนินการ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');

ระบุลำดับที่คุณต้องการสำหรับเมนูทั้งหมด (ฉันให้ข้อมูลอ้างอิงไปยังไฟล์โหลดเมนูเพื่อให้คุณสามารถรับรายการชื่อไฟล์) และสิ่งนี้ควรดูแลมัน


แก้ไข (9/2/2553):

ในการระบุลำดับของหน้าจอแก้ไขประเภทโพสต์ที่กำหนดเองโดยใช้วิธีนี้คุณต้องทราบ 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');

ส่วนที่เหลือของเมนูจะไม่ได้รับผลกระทบ แต่หน้าแก้ไขที่กำหนดเองของคุณจะถูกย้ายไปยังส่วนเดียวกับแดชบอร์ดและจะปรากฏด้านล่างทันที คุณสามารถใช้สิ่งนี้เพื่อย้ายประเภทโพสต์ที่คุณกำหนดเองไปยังส่วนใด ๆ ของเมนูผู้ดูแลระบบและวางไว้ในลำดับใดก็ได้ คุณยังสามารถย้ายรายการเมนูมาตรฐานในลักษณะเดียวกันได้

เพียงให้แน่ใจว่าคุณระบุลำดับของรายการเมนูทั้งหมดในส่วนที่กำหนดมิฉะนั้นเมนูของคุณอาจมีความแปลกประหลาดที่ไม่คาดคิด


มีข้อผิดพลาดเล็กน้อยในรหัสตัวอย่างของคุณภายใต้หัวข้อ "การสั่งเมนูกำหนดเอง" คำสั่ง if ตามเงื่อนไขจะหายไป$ในชื่อตัวแปร ... (แม้ว่าคำตอบที่ดี) ..
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

2

ฉันเข้าใจว่าคุณไม่ต้องการใช้ปลั๊กอิน แต่เพื่อความเรียบง่ายอย่างแท้จริงลองใช้ปลั๊กอินตัวจัดการเมนูผู้ดูแลระบบโดย Janis Elsts จัดเรียงเมนูผู้ดูแลระบบตามที่คุณต้องการ ยังสามารถซ่อนรายการเมนู


ฉันลองใช้ปลั๊กอินนี้ในการติดตั้งแบบหลายไซต์มันทำงานได้ดีที่สุด แต่เราต้องกำหนดค่าตัวเลือกสำหรับทุกไซต์ย่อยด้วยตนเองถ้าเรามีการติดตั้งแบบหลายไซต์
user391

2

หากต้องการย้ายรายการเมนูฉันต้องการใช้$menuตัวแปรGlobal

ตัวอย่างเช่นหากฉันต้องการย้ายเมนู "หน้า" ไปที่ด้านล่างของเมนูฉันจะใช้สิ่งนี้ใน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


ฉันรู้ว่านี่เป็นโพสต์เก่า แต่เกี่ยวกับตัวอย่างแรกของคุณฉันพบปัญหากับบรรทัดสุดท้ายใน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 ปุ่มเป็น: หน้า, โพสต์, สื่อ, ลิงก์ฉันต้องใช้รหัส folowing:

  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.