วิธีการตั้งค่าตัวเลือกหน้าจอเริ่มต้น?


20

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

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

ความคิดใด ๆ


ตามชื่อผู้ใช้คุณจะต้องสร้างปลั๊กอินประเภทที่กำหนดผู้ใช้ทั้งหมดด้วยช่องทำเครื่องหมายถัดจากชื่อและขอลงในตัวกรองเพื่อแสดงกล่องเมตาหรือเมตากล่องหลายกล่อง
Wyck

ตามค่าเริ่มต้นคุณหมายถึงว่าควรจะใช้งานครั้งเดียวเมื่อสร้างผู้ใช้ใหม่ถูกต้องหรือไม่
Rarst

คำตอบ:


25

คุณอ้างถึง metaboxes ในหน้าจอโพสต์ของผู้ดูแลระบบใช่ไหม?

เพื่อที่คุณไม่จำเป็นต้องใช้ปลั๊กอินเพียงแค่วางสิ่งต่อไปนี้ลงในไฟล์ functions.php ของคุณ

// add_action('user_register', 'set_user_metaboxes');
add_action('admin_init', 'set_user_metaboxes');
function set_user_metaboxes($user_id=NULL) {

    // These are the metakeys we will need to update
    $meta_key['order'] = 'meta-box-order_post';
    $meta_key['hidden'] = 'metaboxhidden_post';

    // So this can be used without hooking into user_register
    if ( ! $user_id)
        $user_id = get_current_user_id(); 

    // Set the default order if it has not been set yet
    if ( ! get_user_meta( $user_id, $meta_key['order'], true) ) {
        $meta_value = array(
            'side' => 'submitdiv,formatdiv,categorydiv,postimagediv',
            'normal' => 'postexcerpt,tagsdiv-post_tag,postcustom,commentstatusdiv,commentsdiv,trackbacksdiv,slugdiv,authordiv,revisionsdiv',
            'advanced' => '',
        );
        update_user_meta( $user_id, $meta_key['order'], $meta_value );
    }

    // Set the default hiddens if it has not been set yet
    if ( ! get_user_meta( $user_id, $meta_key['hidden'], true) ) {
        $meta_value = array('postcustom','trackbacksdiv','commentstatusdiv','commentsdiv','slugdiv','authordiv','revisionsdiv');
        update_user_meta( $user_id, $meta_key['hidden'], $meta_value );
    }
}

โดยทั่วไปสิ่งที่เกิดขึ้นคือสำหรับผู้ใช้ที่เข้าสู่ระบบในปัจจุบันคุณกำลังเปลี่ยน meta_values ​​ที่บันทึกไว้ในตาราง wp_usermeta

มีสองวิธีในการใช้ฟังก์ชั่นนี้คุณสามารถเชื่อมต่อกับ 'user_register' หรือคุณสามารถเชื่อมต่อกับ 'admin_init'

ข้อดีของการใช้ 'user_register' คือฟังก์ชั่นนี้จะเริ่มทำงานเมื่อผู้ใช้ใหม่ลงทะเบียนแล้วเท่านั้น อย่างไรก็ตามมันจะไม่ทำงานสำหรับผู้ใช้ที่มีอยู่แล้ว

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


15
นี่ไม่ใช่งานรูปแบบและไม่ได้อยู่ใน function.php
fuxia

6
@toscho ฉันไม่เห็นด้วยกับสิ่งนั้นจริงๆ โดยปกติคุณสามารถใส่สิ่งนี้ลงในปลั๊กอิน แต่ถ้าเช่นคุณกำลังสร้างธีมสำหรับตัวคุณเองหรือบางทีสำหรับลูกค้าที่ไม่จำเป็นต้องเห็นกล่องบางอย่างทำไมต้องเพิ่มค่าใช้จ่ายในการจัดการเพิ่มเติมที่มาพร้อมกับสิ่งนี้ลงในปลั๊กอิน โดยการวางลงในไฟล์ functions.php คุณมั่นใจได้ว่าประสบการณ์สำหรับชุดรูปแบบนั้นสอดคล้องกันโดยไม่ต้องแน่ใจว่าติดตั้งและเปิดใช้งานปลั๊กอินแล้ว
drebabels

10
นอกจากนี้ไม่มีค่าใช้จ่ายโดยใช้ปลั๊กอิน นั่นเป็นตำนานที่ต้องตายทันที นอกจากนี้ข้อ จำกัด การใช้งานของคุณไม่ได้เป็นส่วนหนึ่งของคำถาม คำตอบของคุณอ่านโดยสามเณรนับพัน คุณจะช่วยพวกเขาด้วยรหัสที่ดีที่สุดที่คุณสามารถเขียนได้ไม่ใช่สิ่งที่ทำงานได้ในบางสถานการณ์ :)
fuxia

+1 คำตอบที่ดี - บางครั้งคุณต้องการตั้งค่าเหล่านี้อย่างชัดเจน เป็นฐานที่ดีและแน่นอนว่ารหัสนี้สามารถแก้ไขได้อย่างง่ายดายเพื่อเรียกใช้เมื่อจำเป็น (เช่นการเพิ่มผู้ใช้ใหม่) เพื่อให้คุณตั้งค่าตัวเลือก "เริ่มต้น" จริง ๆ และไม่บังคับให้ผู้ใช้ที่เปลี่ยนแปลงพวกเขา ฉันจะเพิ่มรหัสนี้ลงในfunctions.phpไฟล์ธีมของฉันเนื่องจากตัวเลือกเริ่มต้นสำหรับโครงการเฉพาะซึ่งแสดง / ตั้งอยู่ในธีมที่ฉันกำลังพัฒนา
cwd

1
สองสามเดือนหลังจากคำตอบนี้ถูกเขียนตัวกรองที่เพิ่มไปยังหลักทำให้คำตอบนี้ล้าสมัย
WraithKenny

16

มีdefault_hidden_meta_boxesตัวกรองget_hidden_meta_boxes()ที่อนุญาตให้แก้ไขซึ่งไม่แสดงตราบใดที่ผู้ใช้ไม่ได้แก้ไขการตั้งค่าของเขาในตัวเลือกหน้าจอ


7

ฉันมีความคิดเห็นรหัสเกี่ยวกับวิธีแก้ไขปัญหาสามรายการที่โพสต์แล้ว แต่ยังเป็นความคิดเห็นทั่วไป

ตัวเลือกเหล่านี้แสดงตัวเลือกย่อย: แทนที่ตัวเลือกหน้าจอตัวเลือกหน้าจอของผู้ใช้ หรือให้ความเคารพ แต่ให้โค้ดของคุณถูกเพิกเฉยถ้าผู้ใช้เคยเปลี่ยนช่องทำเครื่องหมายแม้แต่สำหรับ meta_boxes อื่น ๆ หรือก่อนที่รหัสของคุณจะอยู่ใน WP ดูเหมือนว่าทางเลือกที่น่าเคารพจะมีประโยชน์ก็ต่อเมื่อผู้ใช้ของคุณทั้งหมดเป็นของใหม่ ทางออกที่ดีที่สุดคือการตั้งค่าตัวเลือกผู้ใช้ที่กำหนดเองเพื่อตรวจสอบว่าค่าเริ่มต้น meta_box เฉพาะของคุณมีการเปลี่ยนแปลงโดยผู้ใช้และเคารพว่า ไม่ฉันไม่ได้เขียนรหัสนั้น! ควรเป็นเรื่องง่าย ... :)

โซลูชั่นทั้งสามโพสต์:

1.hidden_meta_boxesวิธีแก้ปัญหาของ WraithKenny เป็นสิ่งที่แทนที่ user_option โปรดทราบว่ามันครอบคลุมประเภทโพสต์ทั้งหมด ('โพสต์', 'หน้า', 'ลิงค์', 'ไฟล์แนบ' และประเภทโพสต์ที่กำหนดเอง) ไม่เป็นไรเว้นแต่คุณต้องการให้เจาะจง คุณระบุ post_type ในการadd_meta_box()โทรของคุณ คุณสามารถลองจับคู่พวกนั้นหรือแค่จับคู่ไว้เพราะสิ่งที่ไม่ตรงกันจะถูกละเว้น หากคุณต้องการทราบ post_type ในตัวกรองคุณสามารถใช้screenพารามิเตอร์พิเศษ:

add_filter('hidden_meta_boxes', 'foo_hidden_meta_boxes', 10, 2);
function foo_hidden_meta_boxes($hidden, $screen) {
    $post_type= $screen->id;
    switch ($post_type) {
        // case 'post', 'page', 'link', 'attachment', and any custom post types
        // $hidden[]= 'foo_box_id';
        // /or/
        // $hidden= array_diff($hidden, array('foo_box_id'));
    }
    return $hidden;
}

2.ตามที่ Rarst กล่าวให้default_hidden_meta_boxesเคารพ user_option เช่นเดียวกับhidden_meta_boxesคุณสามารถใช้พารามิเตอร์ $ screen เพื่อแยกความแตกต่างของ post_types

3.ฟังก์ชัน set_user_metaboxes () ของ Drebabels ยังเคารพ user_option โปรดทราบว่ามันเป็นรหัสสำหรับหน้าจอแก้ไข 'โพสต์' หากต้องการจัดการหน้าจอแก้ไข 'หน้า' และ post_types อื่น ๆ ให้ล้อมโค้ดในลูปนี้:

function set_user_metaboxes($user_id=NULL) {
    $post_types= array( 'post', 'page', 'link', 'attachment' );
    // add any custom post types here:
    // $post_types[]= 'my_custom_post_type';
    foreach ($post_types as $post_type) {

       // These are the metakeys we will need to update
       $meta_key= array(
           'order' => "meta-box-order_$post_type",
           'hidden' => "metaboxhidden_$post_type",
       );

       // The rest is the same as drebabels's code,
       // with '*_user_meta()' changed to '*_user_option()'

       // So this can be used without hooking into user_register
       if ( ! $user_id)
           $user_id = get_current_user_id(); 

       // Set the default order if it has not been set yet
       if ( ! get_user_option( $meta_key['order'], $user_id ) ) {
           $meta_value = array(
               'side' => 'submitdiv,formatdiv,categorydiv,postimagediv',
               'normal' => 'postexcerpt,tagsdiv-post_tag,postcustom,commentstatusdiv,commentsdiv,trackbacksdiv,slugdiv,authordiv,revisionsdiv',
               'advanced' => '',
           );
           update_user_option( $user_id, $meta_key['order'], $meta_value, true );
       }

       // Set the default hiddens if it has not been set yet
       if ( ! get_user_option( $meta_key['hidden'], $user_id ) ) {
           $meta_value = array('postcustom','trackbacksdiv','commentstatusdiv','commentsdiv','slugdiv','authordiv','revisionsdiv');
           update_user_option( $user_id, $meta_key['hidden'], $meta_value, true );
       }
    }
 }

ใช่ควรจะเป็นget_user_meta get_user_optionสำหรับไซต์เดียวไม่สำคัญและแม้แต่สำหรับหลายไซต์ก็อาจไม่ได้ ดู wp-admin / include / ajax-actions.php เพราะเหตุใด: update_user_optionมีพารามิเตอร์โกลบอล 'true'


1
add_filter( 'hidden_meta_boxes', 'custom_hidden_meta_boxes' );
function custom_hidden_meta_boxes( $hidden ) {
    $hidden[] = 'your_metabox';
    return $hidden;
}

นอกจากนี้ยังมีhidden_meta_boxesตัวกรองที่จะ "ยกเลิกการเลือก" metabox (ทำให้ถูกซ่อนไว้) ในการโหลดหน้าเว็บทุกหน้า (แต่ไม่ต้องอัปเดตฐานข้อมูลเลย) หากคุณต้องการให้ผู้ใช้ใหม่ออกจนกว่าพวกเขาจะทำเครื่องหมายในช่องให้ใช้คำตอบของ Rarst

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.