ความท้าทายเมนูผู้ดูแลระบบ WordPress ที่ยอดเยี่ยมของเดือนมกราคม 2011 (หรือที่รู้จักว่าจะแก้ไขความท้าทายบางอย่างได้อย่างไรเมื่อแก้ไขระบบเมนูผู้ดูแลระบบ WordPress)


14

คำถามนี้มีลักษณะเฉพาะเล็กน้อย

มันเป็นส่วนหนึ่งใน"ความท้าทาย"ฉันออกไปยังทีมงาน WordPress ( หรือใครก็ตาม )ที่เกี่ยวข้องกับตั๋ว Trac: # 16048 , # 16050และ# 16204

เป้าหมาย

เป้าหมายคือการแก้ไขปัญหาสามข้อ (3) ที่แสดงในภาพหน้าจอด้านล่างเมื่อพยายามแก้ไขส่วนเมนู WordPress Admin:

  1. รับ"ไมโคร"หน้าเมนูย่อยที่จะมีการเน้นเมื่อมีการแก้ไขอัยการ(สำหรับวันนี้เราต้องอย่างใดสามารถที่จะใช้ "ปัจจุบัน" ให้กับรายการเมนูย่อย _ และตะขอบางอย่างใน _wp_menu_output () ฟังก์ชันจะให้สิ่งที่จำเป็นที่นี่) ,

  2. รับลิงก์เมนูหน้าทนายความเพื่อเชื่อมโยงไปยัง/wp-admin/edit.php?post_type=attorneyเมื่อแก้ไขทนายความ(และhooks ที่จำเป็นเหมือนกันในฟังก์ชัน _wp_menu_output ()สามารถจัดการสิ่งนี้ได้)และ

  3. รับลิงก์"Microsite"เพื่อไม่ให้เกิดข้อผิดพลาด"คุณไม่มีสิทธิ์เพียงพอในการเข้าถึงหน้านี้"ข้อผิดพลาด * (นี่เป็นสิ่งที่น่ารังเกียจที่สุดในการแก้ไขและเบ็ดเกี่ยวกับค่าส่งคืนของuser_can_access_admin_page()สามารถจัดการกับปัญหานี้ได้)

สกรีนช็อตสำหรับความท้าทายเมนูผู้ดูแลระบบ WordPress ที่ยอดเยี่ยมของเดือนมกราคม 2011
(ที่มา: mikeschinkel.com )

มากกว่าแค่การใช้งานของฉัน

ปัญหาทั้งสาม (3) นี้มีไว้สำหรับกรณีการใช้งานของฉัน แต่เป็นปัญหาที่เกี่ยวข้องกับการกำหนดค่าเมนูผู้ดูแลระบบใน WordPress

หลายคนในทีม WordPress บอกว่ามันง่ายและโดยนัยฉันขาดอะไรบางอย่าง(ซึ่งอาจจะถูก)แต่ฉันได้ดูปัญหานี้มาหลายสัปดาห์และไม่ทราบวิธีที่จะแก้ไขมันดังนั้นฉันจึงสร้างปลั๊กอินที่คุณเห็นด้านล่าง ( สามารถดาวน์โหลดได้จาก Gist ) เป็นตัวอย่างการใช้งานที่ง่ายที่สุดของปัญหา รหัสในadmin_menu2()ค่อนข้างแฮ็ค แต่มันค่อนข้างจำเป็นสำหรับการแก้ไข Admin Adminus ใน WordPress

โปรดทราบว่าฉันไม่ได้ลองใช้ฟังก์ชั่นremove_menu_page()ใหม่หรือremove_submenu_page()ฟังก์ชั่นใหม่ใน 3.1 เพราะมันใช้เวลานานกว่าในการสร้างปลั๊กอิน - ฉันมีรหัสadmin_menu2()จากโครงการที่มีอยู่แล้ว - และฉันไม่เชื่อว่าพวกเขาจะพูดถึง ปัญหาอยู่ดี

ฉันต้องการอะไร?

ฉันต้องการหนึ่งในสอง (2) สิ่ง:

  1. วิธีแก้ไขปัญหาที่ฉันพบกับปลั๊กอินนี้และอธิบายในคำถามนี้และในภาพหน้าจอ(BTW ฉันจะตัดสิทธิ์โซลูชันของคุณหากคุณใช้PHP Output Bufferingเพื่อแก้ไขส่วนใดส่วนหนึ่งของนี้)หรือ

  2. เพื่อให้ทีม WordPress รับรู้ว่ามีความจำเป็นสำหรับ hooks เหล่านี้และเพื่อให้พวกเขาพิจารณาตำแหน่งของพวกเขาบนตั๋ว

คุณจะท้าทายอย่างไร

  1. ดาวน์โหลดและติดตั้งสำเนาใหม่ที่เก่าแก่ของ WordPress 3.1 (แก้ไขใด ๆ ที่อาจจะทำ) ,

  2. ดาวน์โหลดติดตั้งและเปิดใช้งานปลั๊กอิน"The Great WordPress Admin Menu Challenge of Jan 2011"ด้านล่าง(หรือดาวน์โหลดปลั๊กอินจาก Gist )จากนั้น

  3. ทำตามคำแนะนำที่พบในหน้าปลั๊กอินสำหรับปลั๊กอินนี้(ดูภาพหน้าจอต่อไปนี้)แต่โดยทั่วไปโหลดภาพหน้าจอที่คุณเห็นด้านบนแล้วลองหาปัญหาสาม (3) ที่อธิบายไว้:

สกรีนช็อตของคำแนะนำสำหรับปลั๊กอิน "The Great WordPress Admin ท้าทายมกราคม 2011"
(ที่มา: mikeschinkel.com )

หนึ่งเรย์แห่งความหวัง

โชคดีที่Andrew Nacin ของทีม WordPress เสนอให้ดูที่นี่เมื่อฉันเขียนมันดังนั้นฉันจะโพสต์ที่นี่เป็นหลักสำหรับเขาในการตรวจสอบและแสดงความคิดเห็นเช่นเดียวกับการให้คนอื่นแสดงความคิดเห็น ฉันรู้ว่าเขาไม่ว่าง แต่ฉันหวังว่าเขา(หรือแม้กระทั่งคุณ)สามารถใช้เวลาในการติดตั้งปลั๊กอินนี้ในการติดตั้ง v3.1 ที่เก่าแก่และดูว่าเขาสามารถแก้ไขปัญหาได้หรือไม่

ถ้าคุณเห็นด้วยกับความท้าทายเป็นไปไม่ได้?

หากหลังจากลองความท้าทายนี้คุณจะได้ข้อสรุปเช่นเดียวกับฉันและหากคุณต้องการดูเมนู WordPress Admin สามารถกำหนดค่าได้มากขึ้นโปรดแสดงความคิดเห็นเกี่ยวกับตั๋ว trac เหล่านี้ ( # 16048 - # 16050 - # 16204 ) และโหวตคำถามนี้ขึ้น เพื่อแสดงการสนับสนุน

ฉันจะยอมรับว่าฉันพลาดบางอย่างถ้าฉันทำอย่างนั้น

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

และนี่คือปลั๊กอิน

คุณสามารถดาวน์โหลดได้ถ้าจากส่วนสำคัญ :

<?php
/*
Plugin Name: The Great WordPress Admin Menu Challenge of Jan 2011
Description: <em>"The Great WordPress Admin Menu Challenge of Jan 2011"</em> was inspired by the WordPress team's apparent lack of understanding of the problems addressed by trac tickets <a href="http://core.trac.wordpress.org/ticket/16048">#16048</a> and <a href="http://core.trac.wordpress.org/ticket/16050">#16050</a> <em>(See also: <a href="http://core.trac.wordpress.org/ticket/16204">#16204</a>)</em> and suggestion that the <a href="http://wordpress.org/extend/plugins/admin-menu-editor/>Admin Menu Editor</a> plugin handles the use-cases that the tickets address. Debate spilled over onto Twitter with participation from <a href="http://twitter.com/nacin">@nacin</a>, <a href="http://twitter.com/aaronjorbin">@aaronjorbin</a>, <a href="http://twitter.com/petemall">@petemall</a>, <a href="http://twitter.com/westi">@westi</a>, <a href="http://twitter.com/janeforshort">@janeforshort</a>, <a href="http://twitter.com/PatchesWelcome">@PatchesWelcome</a>; supportive comments from <a href="http://twitter.com/ramsey">@ramsey</a>, <a href="http://twitter.com/brianlayman">@brianlayman</a>, <a href="http://twitter.com/TheLeggett">@TheLeggett</a>, a retweeting of @nacin's simple yet <em>(AFAICT)</em> insufficient solution by <a href="http://twitter.com/vbakaitis">@vbakaitis</a>, <a href="http://twitter.com/Viper007Bond">@Viper007Bond</a>, <a href="http://twitter.com/nickopris">@nickopris</a>, <a href="http://twitter.com/Trademark">@Trademark</a>, <a href="http://twitter.com/favstar_pop">@favstar_pop</a>, <a href="http://twitter.com/designsimply">@designsimply</a>, <a href="http://twitter.com/darylkoop">@darylkoop</a>, <a href="http://twitter.com/iamjohnford">@iamjohnford</a>, <a href="http://twitter.com/markjaquith">@markjaquith</a>, <a href="http://twitter.com/JohnJamesJacoby">@JohnJamesJacoby</a> and <a href="http://twitter.com/dd32">@dd32</a>. Also see <a href="http://andrewnacin.com/2010/12/20/better-admin-menu-controls-custom-post-types-wordpress-3-1/#comment-6360">comments</a> on @nacin's blog post entitled "<em>Better admin menu handling for post types in WordPress 3.1</em>." <strong>The desired goal of the <em>"challenge"</em></strong> is to simply either to find a solution that has eluded me or, to get those who are dismissing it as solvable without added hooks in WordPress to have a tangible example to explore in hopes they will recognize that there is indeed a need for at least some of the requested hooks. <strong>There are three (3) steps to the challenge:</strong> 1.) Get the "Microsite" submenu page to be highlighted when editing an Attorney, 2.) Get the Attorney Menu Page link to link <a href="/wordpress//wp-admin/edit.php?post_type=attorney">here</a>  when editing an Attorney, and 3.) Get the "Microsite" link not to trigger a "You do not have sufficient permissions to access this page" error.  Here is <a href="https://mikeschinkel.com/websnaps/skitched-20110114-235302.png" target="_blank"><strong>a screenshot</strong> that attempts to illustrate the callenge</a>. The code can be found on gist <a href="https://gist.github.com/780709"><strong>here</strong></a>. Activate it as a plugin in a WordPress 3.1 install and go <a href="/wordpress//wp-admin/post.php?post=10&action=edit"><strong>here</strong></a> to see what the screenshot illustrates. <strong>Be sure to load the <a href="https://mikeschinkel.com/websnaps/skitched-20110114-235302.png" target="_blank">screenshot</a> in another browser tab or window first</strong>.
Author:      Mike Schinkel
Author URI:  http://about.me/mikeschinkel
Plugin URI:  https://gist.github.com/780709
*/
if (!class_exists('TheGreatWordPressAdminMenuChallenge')) {
  class TheGreatWordPressAdminMenuChallenge {
    static function on_load() {
      add_action('init',array(__CLASS__,'init'));
      add_action('admin_menu',array(__CLASS__,'admin_menu1'));      // Simulates generic "Microsite" plugin
      add_action('admin_menu',array(__CLASS__,'admin_menu2'),100);  // Simulates website-specific plugin
      add_action('post_row_actions',array(__CLASS__,'post_row_actions'),10,2);
    }
    static function post_row_actions($actions,$post) {
      $url = admin_url(self::this_microsite_url($post->ID));
      $actions = array_merge(array('microsite'=>"<a href=\"{$url}\" title=\"Manage this Microsite\">Microsite</a>"),$actions);
      return $actions;
    }
    static function the_microsite_editor() {
      echo "We are in the Microsite Editor for " . self::post_title();
    }
    static function admin_menu1() {
      if (self::this_post_id() && in_array(self::this_post_type(),array('attorney','practice_area'))) {
        add_submenu_page(
          self::this_parent_slug(),
          self::microsite_page_title(),
          self::microsite_page_title(),
          $capability = 'edit_posts',
          'microsite',
          array($microsite,'the_microsite_editor')
        );
        global $wp_post_types;
        $parent_type_meta = $wp_post_types[self::this_post_type()];
        global $menu;
        $slug = false;
        foreach($menu as $index => $menu_page)
          if ($menu_page[0]===$parent_type_meta->label) {
            $slug = $menu_page[2];
            break;
          }
        if ($slug) {
          global $pagenow;
          global $submenu;
          // Setting this makes gives the link to the microsite in the menu the highlight for "current" menu option
          global $submenu_file;
          $submenu_file = self::this_microsite_url();
          $index = end(array_keys($submenu[$slug]));
          $submenu[$slug][$index][12] = $submenu_file;
        }
      }
    }
    static function this_parent_slug() {
      return "edit.php?post_type=" . self::this_post_type();
    }
    static function post_title() {
      $post_id = self::this_post_id();
      return ($post_id ? get_post($post_id)->post_title : false);
    }
    static function microsite_page_title() {
      return 'Microsite for ' . self::post_title();
    }
    static function this_post_type($get_post=true) {
      $post_type = (isset($_GET['post_type']) ? $_GET['post_type'] : false);
      if (!$post_type && $get_post) {
        $post_id = self::this_post_id();
        $post_type = get_post($post_id)->post_type;
      }
      return $post_type;
    }
    static function this_post_id() {
      $post_id = false;
      $post_type = self::this_post_type(false);
      if (isset($_GET[$post_type]))
        $post_id = intval($_GET[$post_type]);
      else if (isset($_GET['post']))
        $post_id = intval($_GET['post']);
      return $post_id;
    }
    static function this_microsite_url($post_id=false) {
      $post_type = self::this_post_type();
      $post_id = $post_id ? intval($post_id) : self::this_post_id();
      return "edit.php?post_type={$post_type}&page=microsite&attorney={$post_id}";
    }
    static function admin_menu2() {
      // The code required for this is super, nasty, ugly and shouldn't be, but at least it *is* doable
      global $menu;
      global $submenu;
      global $microsite;

      $parent_type = self::this_post_type();
      foreach(array('attorney','practice_area') as $post_type) {
        $slug = "edit.php?post_type={$post_type}";
        if ($post_type==$parent_type) {  // If a microsite remove everything except the microsite editor
          $microsite_url = self::this_microsite_url();
          foreach($submenu[$slug] as $submenu_index => $submenu_page) {
            if ($submenu_page[2]!=$microsite_url) {
              unset($submenu[$slug][$submenu_index]);
            }
          }
        } else {
          $submenu[$slug] = array();
        }
      }

       // Remove the Submenus for each menu
      unset($submenu['index.php']);
      unset($submenu['edit.php?post_type=article']);
      unset($submenu['edit.php?post_type=event']);
      unset($submenu['edit.php?post_type=case_study']);
      unset($submenu['edit.php?post_type=news_item']);
      unset($submenu['edit.php?post_type=transaction']);
      unset($submenu['edit.php?post_type=page']);
      unset($submenu['upload.php']);

      unset($submenu['users.php'][13]); // Removed the "Add New"

      $remove = array_flip(array(
        'edit.php',
        'link-manager.php',
        'edit-comments.php',
        'edit.php?post_type=microsite-page',
      ));
      if (!current_user_can('manage_tools'))
        $remove['tools.php'] = count($remove);

      foreach($menu as $index => $menu_page) {
        if (isset($remove[$menu_page[2]])) {
          unset($submenu[$menu_page[2]]);
          unset($menu[$index]);
        }
      }

      $move = array(
        'edit.php?post_type=page' => array( 'move-to' => 35,  0 => 'Other Pages' ),
        'separator2' => array( 'move-to' => 40 ),
        'upload.php' => array( 'move-to' => 50, 0 => 'Media Library' ),
      );
      $add = array();
      foreach($menu as $index => $menu_page) {
        if (isset($move[$menu_page[2]])) {
          foreach($move[$menu_page[2]] as $value_index => $value) {
            if ($value_index==='move-to') {
              $move_to = $value;
            } else {
              $menu_page[$value_index] = $value;
            }
          }
          $add[$move_to] = $menu_page;
          unset($menu[$index]);
        }
      }
      foreach($add as $index => $value)
        $menu[$index] = $value;

      add_menu_page(
        'Attorney Positions',
        'Attorney Positions',
        'edit_posts',
        'edit-tags.php?taxonomy=attorney-position&amp;post_type=attorney',
        false,
        false,
        55);

      ksort($menu); // Need to sort or it doesn't come out right.
    }
    static function init() {
      register_post_type('attorney',array(
        'label'           => 'Attorneys',
        'public'          => true,
      ));
      register_post_type('practice_area',array(
        'label'           => 'Practice Areas',
        'public'          => true,
      ));
      register_taxonomy('attorney-position','attorney',array(
        'label'=>'Attorney Positions',
      ));
      register_post_type('article',array(
        'label'           => 'Articles & Presentations',
        'public'          => true,
      ));
      register_post_type('case_study',array(
        'label'           => 'Case Studies',
        'public'          => true,
      ));
      register_post_type('news_item',array(
        'label'           => 'Firm News',
        'public'          => true,
      ));
      register_post_type('event',array(
        'label'           => 'Events',
        'public'          => true,
      ));
      register_post_type('transaction',array(
        'label'           => 'Transactions',
        'public'          => true,
      ));

      // Install the test data
      $post_id = 10;
      $attorney = get_post($post_id);
      if (!$attorney) {
        global $wpdb;
        $wpdb->insert($wpdb->posts,array(
          'ID' => $post_id,
          'post_title' => 'John Smith',
          'post_type' => 'attorney',
          'post_content' => 'This is a post about the Attorney John Smith.',
          'post_status' => 'publish',
          'post_author' => 1,
        ));
      }
    }
  }
  TheGreatWordPressAdminMenuChallenge::on_load();
}

สำหรับทุกคนที่อ่านสิ่งนี้ฉันหวังว่าคุณจะช่วยได้จริงๆ

ขอบคุณล่วงหน้า.


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

ฉันรู้ว่าปัญหาที่คุณพูดถึงไมค์ฉันไม่คิดว่าฉันจะอธิบายได้ดีไปกว่านี้ แต่ฉันเห็นปัญหาเดียวกันเมื่อเขียนเมนูแบบเลื่อนลงสำหรับผู้ดูแลระบบ (เพื่อความสนุก) เพียงแค่เพิ่ม +1 ของฉัน
t31os

@ t310s - ขอบคุณที่เพิ่ม +1 ของคุณ ฉันอาจต้องใช้เวลา 2 สัปดาห์ในการวิจัยเพื่ออธิบายปัญหาดังนั้นข้อเท็จจริงที่คุณสามารถรับรู้ได้ว่ามีความเกี่ยวข้อง(และยังไม่ได้ใช้เวลา 2 สัปดาห์ที่ฉันมี)หมายความว่าคุณเป็นผู้นำของทุกคนในเรื่องนี้รวมถึง ฉัน!
MikeSchinkel

คำตอบ:


2

ไมค์ฉันได้ลองดูโค้ดและกรณีการใช้งานในอุดมคติของคุณ ... และบางอย่างก็ตรงไปตรงมากับระบบปัจจุบัน อีกครั้งความต้องการของคุณ:

  1. รับหน้าเมนูย่อย "Microsite" เพื่อเน้นเมื่อแก้ไขทนายความ
  2. รับลิงก์เมนูหน้าทนายความเพื่อเชื่อมโยงไปยัง/wp-admin/edit.php?post_type=attorneyเมื่อแก้ไขทนายความ
  3. รับลิงก์ "Microsite" เพื่อไม่ให้เกิดข้อผิดพลาด "คุณมีสิทธิ์ไม่เพียงพอในการเข้าถึงหน้านี้"

และปัญหาสำคัญที่นี่คือ # 2

สิ่งที่ฉันพยายาม

ฉันพยายามเพิ่มประเภทโพสต์ที่กำหนดเองสำหรับทนายความและได้รับการเตือนทันทีว่า/wp-admin/edit.php?post_type=attorneyจะให้รายชื่อทนายความไม่ใช่หน้าจอแก้ไขจริง /wp-admin/post.php?post=10&action=editที่เกิดขึ้นจริงการแก้ไขเกิดขึ้นใน ดังนั้นหากคุณเชื่อมโยงกับ # 2 ... อีกสองเกณฑ์จะไม่ทำงาน

นี่คือสาเหตุที่ # 3 ล้มเหลวในการนำไปใช้ ... และฉันไม่สามารถลอง # 1 ได้เพราะฉันไม่สามารถทำได้


เชื่อว่าการวิเคราะห์ของคุณถูกต้อง เลย์เอาต์ที่แสดงเป็นคำถามคือสิ่งที่ฉันมีมากกว่าหนึ่งคำขอของลูกค้าในเป้าหมายของพวกเขาเพื่อทำให้โครงสร้างเมนูง่ายขึ้นสำหรับกรณีใช้งาน ฉันเสนอให้ใช้เมนูย่อย แต่พวกเขาไม่ชอบ พวกเขารู้สึกว่ามันจะทำให้ผู้ใช้สับสนเกินไป สิ่งหนึ่งที่ฉันอาจไม่ได้กล่าวถึงก็คือฉันกำลังพัฒนาผลิตภัณฑ์ที่ใช้ WordPress เพื่อให้พวกเขาแจกจ่ายกับเว็บไซต์ WordPress สำหรับพวกเขาที่ฉันสามารถฝึกให้รู้วิธีทำให้สิ่งต่าง ๆ ทำงานได้ ตัวเลือกอื่นของพวกเขาคือการละทิ้ง WordPress; ไม่ใช่สิ่งที่ฉันต้องการให้พวกเขาทำ
MikeSchinkel

2

เฮ้ไมค์ปัญหา # 3 ของคุณเกิดจากการที่คุณ($microsite, 'the_microsite_editor')ควร(__CLASS__, 'the_microsite_editor')ระบุ

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

function add_posttype_submenu_page($mytype, $label, $cap, $slug) {  
    /* we add two submenu pages to work around the 
       edit.php?post_type=...&page=...problem and have 
       our page called as admin.php?page=... instead */
    //first create a 'blind' pseudo-entry to register our page callback
    add_submenu_page($mytype, $label, $label, $cap, $slug, 
                     array( &$this, 'admin_'.$mytype ));
    //then create a real entry that 'calls' our pseudo-entry
    add_submenu_page('edit.php?post_type='.$mytype, $label, 
                     $label, $cap, 'admin.php?page='.$slug);
    /* then lets fix/hack the highlighting */
    global $plugin_page;
    global $submenu_file;
    if ($plugin_page == $slug) {
        // this next line highlights the submenu entry
        $submenu_file = 'admin.php?page='.$slug; 
        add_filter('parent_file', 
                   array(&$this, 'evil_parent_file_hack'));
    }
} 

function evil_parent_file_hack() {
    //we do this to get the parent menu properly highlighted, too
    //it only gets called on the submenu menu page in question
    global $self;
    global $parent_file;
    $self = $parent_file;
    remove_filter('parent_file', array(&$this, 'evil_parent_file_hack'));
}

จากนั้นคุณเพียงแค่เรียกadd_posttype_submenu_page()ตามพารามิเตอร์ สิ่งนี้ควรเพิ่มรายการเมนูย่อยในเมนูที่สร้างขึ้นอัตโนมัติระหว่างการregister_post_type()โทร


อ๊ะ ... ขีดเส้นใต้คู่รอบ CLASS ถูกเปลี่ยนเป็นรูปแบบตัวหนา ;-)
wyrfel

ฉันซ่อมมัน. :)
fuxia

โอ้นั่นยอดเยี่ยมมาก ขอบคุณ! ฉันจะพลาดจุดแรกไปได้อย่างไร!? Doh!
MikeSchinkel

ขอบคุณไมค์ กลับไปที่หัวข้อเดิมของคุณ ... WP สร้าง ID ภายในสำหรับรายการเมนูบางรายการและเก็บไว้ในค่า 4 ของเมนูอาร์เรย์ เช่น plugin-page-hooks อย่างไรก็ตามสำหรับ posttypes ที่กำหนดเองจะเก็บ ID ที่ไม่สอดคล้องกับรูปแบบ plugin-page-hook ฉันคิดว่าจะช่วยได้มากถ้า WP จะทำให้สิ่งนี้สอดคล้องกัน (เช่นสร้าง hooks หน้าสำหรับทุกสิ่งและใช้เพื่อเชื่อมโยงรายการเมนูเข้าด้วยกันแทนที่จะแนบเมนูย่อยด้วย 'slug พาเรนต์ / ไฟล์'
wyrfel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.