add_role () ทำงานเพียงครั้งเดียว?


11

ฉันประหลาดใจที่ค้นพบว่า add_role () แก้ไขฐานข้อมูลและล้มเหลวหากมีบทบาทอยู่แล้ว มีความหมายสองประการที่นี่ร้ายแรงกว่าอีกข้อหนึ่ง: 1) หากคุณกำลังพัฒนาและอัปเดตรหัส add_role ของคุณคุณต้องลบ remove_role () 2) ทันทีที่คุณมีมันถูกต้องคุณไม่ควรรันโค้ดนั้น อีกครั้ง

ดังนั้นโดยทั่วไปฉันวาง add_role () ไว้ในตะขอแอ็คชัน wp_loaded และเนื่องจากฉันอยู่ระหว่างการพัฒนาฉันได้เพิ่ม remove_role () ก่อนหน้า add_role ของฉันด้วยดังนั้นฉันจึงมั่นใจได้ว่าถ้าฉันแก้ไขรายการตัวพิมพ์ใหญ่ก็จะมีผลจริง

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

ฉันไม่คิดว่าจะมีการกระทำแบบ run_once อยู่ที่นั่นหรือ

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

แค่คิดในแง่ของวิธีที่ดีที่สุดในการลดการเข้าถึง db ที่ไม่จำเป็น อะไรคือแนวทางปฏิบัติที่ดีที่สุดของคุณ?


! น่ากลัว ขอบคุณสำหรับคำถามนี้ .. เพิ่งเพิ่มremove_role()ฟังก์ชั่นก่อนที่จะadd_role()ช่วยฉัน
beytarovski

คำตอบ:


10

บทบาทและความสามารถของผู้ใช้จะถูกบันทึกไว้ในฐานข้อมูลดังนั้นเมื่อคุณมีการใช้งานadd_role()สิ่งที่บันทึกไว้แล้วการโหลด WordPress ครั้งถัดไปจะรู้ว่าบทบาทนั้นเหมือนกับบทบาทในตัว

ตอนนี้ถ้าคุณดูฟังก์ชั่นที่add_role()เฉพาะเจาะจงมากขึ้นที่บรรทัดที่ 141คุณจะเห็นว่ามันบันทึกเฉพาะบทบาทและความสามารถในฐานข้อมูลหาก var $use_dbถูกตั้งค่าเป็นจริง (ซึ่งเขาเป็นค่าเริ่มต้น) เพื่อให้คุณสามารถเปลี่ยนได้ก่อนที่จะโทรadd_role()ฟังก์ชั่นและบทบาทจะไม่ถูกบันทึก

ลอง:

//globalize $wp_roles
global $wp_roles;
//set use_db to flase
$wp_roles->use_db = false;
//then add your role
$wp_roles->add_role( $role, $display_name, $capabilities );

ปรับปรุง:

ถ้ามันอยู่ในสภาพแวดล้อมการทดสอบ / การพัฒนาดังนั้นฉันจะไม่เห็นข้อเสีย แต่ถ้าคุณอยู่ในสภาพแวดล้อมแบบสดคุณจะประหยัดเวลาในการสร้างสิ่งนั้นตามบทบาททุก ๆ โหลด

สำหรับแนวปฏิบัติที่ดีที่สุดรันครั้งเดียวหากในปลั๊กอินคุณควรใช้register_activation_hookและอย่างอื่นฉันใช้ฟังก์ชั่นแบบกำหนดเองที่มีเงื่อนไขง่าย ๆ :

function run_once($key){
    $test_case = get_option('run_once');
    if (isset($test_case[$key]) && $test_case[$key]){
        return false;
    }else{
        $test_case[$key] = true;
        update_option('run_once',$test_case);
        return true;
    }
}

**usage:**
if (run_once('add_user_role')){
    //do you stuff and it will only run once
}

อึอึ ฉันยังรู้เกี่ยวกับสิ่งนั้นเช่นกันจากการรูทก่อนหน้านี้เกี่ยวกับคลาส WP_Roles คุณนึกถึงข้อเสียที่จะไม่ใช้ฐานข้อมูลสำหรับบทบาทได้หรือไม่? และมีวิธีปฏิบัติที่ดีที่สุดสำหรับการทำสิ่ง WP เพียงครั้งเดียว?
Tom Auger

ขอบคุณสำหรับการอัปเดต - ฉันชอบความเรียบง่ายของโซลูชัน update_option
Tom Auger

ไม่น่าพึงพอใจจริงๆ แต่ดูเหมือนจะเป็นทางออกที่ดีที่สุด👍
Blackbam

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