รับไอเท็มเมนูผู้ดูแลระบบที่กำหนดเองเพื่อเน้นเมื่อมีการใช้งาน


9

ฉันมีประเภทโพสต์ที่กำหนดเอง, งาน, มี 3 taxonomies ภายใต้ในเมนูผู้ดูแลระบบ

หนึ่งใน taxonomies คือสถานะซึ่งเป็นแอ็คทีฟหรือปิด ฉันต้องการรายการเมนูภายใต้งานสำหรับงานที่ใช้งานอยู่ ฉันสร้างมันด้วยรหัสนี้

add_submenu_page(
    'edit.php?post_type=jobs',
    'Active Jobs',
    'Active Jobs',
    'manage_options',
    'edit.php?post_type=jobs&jobstatus=67'
);

สิ่งนี้ทำงานได้อย่างสมบูรณ์ยกเว้นว่ารายการเมนูงานยังคงเน้นอยู่เมื่อตัวเลือกเมนูใช้งานอยู่ ดูภาพหน้าจอ

ตัวอย่างของการแสดงเมนูย่อย

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

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


ฉันสนใจที่จะทราบว่ามีวิธีแก้ไขปัญหาใดบ้างเนื่องจากดูเหมือนว่าจะทำได้ยาก วิธี 'WordPress' คือการเพิ่มเมนูตัวกรองแบบหล่นลงดังที่แสดงในภาพหน้าจอของคุณ
Stephen Harris

คุณมีข้อผิดพลาดใน url 'edit.php?&post_type=jobs&jobstatus=67' ... ที่แรก&ไม่ควรอยู่ที่นั่นดังต่อไปนี้?..
Mark Duncan

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

คำตอบ:


5

ฉันทำงานนี้โดยใช้เมนูโพสต์และสถานะฉบับร่าง มันอาศัย jQuery เพื่อปรับเปลี่ยนคลาสไอเท็มรายการ ปรับให้ทำงานกับประเภทโพสต์และ URL ของคุณ

นี่คือผลลัพธ์ที่ได้:
รายการเมนูย่อยแบบร่างพิเศษ

add_action( 'admin_menu', 'wpse_44270_menu_admin' );
add_action( 'admin_head-edit.php', 'wpse_44270_highlight_menu_item' );

function wpse_44270_menu_admin() 
{
    add_submenu_page(
        'edit.php',
        'Drafts', 
        '<span id="my-draft-posts">Drafts</span>', 
        'edit_pages', 
        'edit.php?post_status=draft&post_type=post'
    );
}

function wpse_44270_highlight_menu_item()
{
    global $current_screen;

    // Not our post type, exit earlier
    if( 'post' != $current_screen->post_type )
        return;

    if( isset( $_GET['post_status'] ) && 'draft' == $_GET['post_status'] )
    {       
        ?>
        <script type="text/javascript">
            jQuery(document).ready( function($) 
            {
                var reference = $('#my-draft-posts').parent().parent();

                // add highlighting to our custom submenu
                reference.addClass('current');

                //remove higlighting from the default menu
                reference.parent().find('li:first').removeClass('current');             
            });     
        </script>
        <?php
    }
}

5

นี่เป็นวิธีแก้ปัญหาที่ฉันเพิ่งพบซึ่งไม่ได้ใช้ jQuery:

มีตัวกรองเป็นparent_fileในwp-admin/menu-header.phpที่วิ่งขวาก่อนการแสดงผลเมนู ความคิดเห็นแบบอินไลน์พูดว่า:

สำหรับปลั๊กอินเพื่อย้ายแท็บเมนูย่อยรอบ ๆ

มันเป็นเพียงตัวกรองของตัวแปรส่วนกลาง$parent_fileและฉันไม่แน่ใจว่ามันทำอะไร แต่เราจะใช้ตัวกรองนี้เพื่อเปลี่ยนตัวแปรทั่วโลก$submenu_fileแทนซึ่งตั้งค่าเมนูย่อยที่ไฮไลต์ไว้ ดังนั้นนี่จะเป็นคำตอบในกรณีของคุณ:

add_filter('parent_file', 'wpse44270_parent_file');

function wpse44270_parent_file($parent_file){
    global $submenu_file;
    if (isset($_GET['jobstatus']) && $_GET['jobstatus'] == 67) $submenu_file = 'edit.php?post_type=jobs&jobstatus=67';

    return $parent_file;
}

คุณสามารถปรับได้ด้วยการจัดรูปแบบ URL ตัวอย่างเช่นฉันใช้รูปแบบadmin.php?page=my_plugin_slug&action=myactionสำหรับเมนูย่อยของปลั๊กอินดังนั้นฉันจึงใช้สิ่งนี้เพื่อเน้นเมนูย่อยของฉัน:

add_filter('parent_file', 'wpse44270_1_parent_file');

function wpse44270_1_parent_file($parent_file){
    global $submenu_file;
    if (isset($_GET['page']) && isset($_GET['action'])) $submenu_file = $_GET['page'] . '&action=' . $_GET['action'];

    return $parent_file;
}

PS: ฉันยังพยายามดำเนินการadmin_menuเพื่อตั้งค่า$submenu_fileและมันก็ใช้งานได้ในกรณีของฉัน (หน้าปลั๊กอินที่กำหนดเอง / กระสุน) แต่ไม่ได้สำหรับedit.phpเมนูย่อย (กรณีของคุณ) ดังนั้นผมจึงค้นหาอีกกระทำ / parent_fileกรองที่วิ่งต่อมาและมันก็เป็นตัวกรอง


0

ฉันพบว่าคุณยังต้องใช้เอนทิตี html สำหรับลิงก์ของคุณ ตั้งแต่คุณมี

add_submenu_page(
    'edit.php?post_type=jobs',
    'Active Jobs',
    'Active Jobs',
    'manage_options',
    'edit.php?post_type=jobs&jobstatus=67'
);

คุณสามารถลองและเปลี่ยนเครื่องหมายแอมเปอร์แซนด์เป็นเอนทิตี html

&amp;

ดังนั้นคุณจะมี

add_submenu_page(
    'edit.php?post_type=jobs',
    'Active Jobs',
    'Active Jobs',
    'manage_options',
    'edit.php?post_type=jobs&amp;jobstatus=67'
);

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

add_filter( 'parent_file', 'test_taxonomy_highlight' );
function test_taxonomy_highlight( $parent_file ){
   global $submenu_file;
   echo '<pre>', var_dump( $submenu_file, htmlentities( $submenu_file ) ), '</pre>';
   echo '<pre>', var_dump( $parent_file, htmlentities( $parent_file ) ), '</pre>';
   return $parent_file;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.