add_role () jalankan hanya sekali?

11

Saya terkejut menemukan bahwa add_role () memodifikasi database dan gagal jika peran sudah ada. Ada dua implikasi di sini, yang pertama lebih serius daripada yang lain: 1) jika Anda dalam pengembangan dan memperbarui kode add_role Anda, Anda harus terlebih dahulu menghapus_rol () 2) setelah Anda melakukannya dengan benar, Anda seharusnya tidak perlu menjalankan kode itu lagi.

Jadi biasanya saya telah meletakkan add_role () saya di dalam kait tindakan wp_loaded. Dan karena saya sedang dalam pengembangan, saya juga telah menambahkan remove_role () sebelum add_role saya sehingga saya dapat yakin bahwa jika saya memodifikasi daftar topi saya, itu benar-benar akan berlaku.

Tapi jelas ini sekarang sedang dijalankan setiap kali halaman blog sedang diakses. Oke, saya bisa memasukkannya ke tindakan khusus admin, atau saya bisa membuat halaman plugin mungkin di bawah Pengguna atau Alat tempat peran ini bisa dibuat sekali. Saya kira saya berharap ada solusi yang lebih sederhana, lebih elegan di luar sana.

Saya tidak membayangkan ada semacam aksi run_once di sana?

Atau apakah praktik terbaik hanya dengan menambahkan peran dan kemudian menggunakan add_cap () beberapa kali? Dan bahkan kemudian saya bayangkan add_cap mengakses db.

Hanya berpikir dalam hal cara terbaik untuk mengurangi akses db yang tidak perlu. Apa praktik terbaik Anda?

Tom Auger
sumber
Luar biasa! Terima kasih atas pertanyaan ini..Hanya menambahkan remove_role()fungsi sebelum add_role()membantu saya.
beytarovski

Jawaban:

10

Peran dan kemampuan pengguna disimpan dalam basis data sehingga setelah Anda menggunakannya add_role(), maka selanjutnya WordPress akan tahu peran itu seperti peran bawaan.

Sekarang jika Anda melihat fungsi add_role()lebih khusus pada baris 141 Anda akan melihat bahwa itu hanya menyimpan peran dan kemampuan dalam database jika var $use_dbdisetel ke true (yang dia secara default) sehingga Anda dapat dengan mudah mengubahnya sebelum Anda memanggil Anda add_role()fungsi dan peran tidak akan disimpan.

mencoba:

//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 );

Memperbarui:

Jika itu dalam lingkungan pengujian / pengembangan maka saya tidak melihat sisi negatifnya, tetapi jika Anda berada di lingkungan langsung maka Anda menghemat waktu yang diperlukan untuk membuat itu pada peran setiap beban.

Adapun praktik terbaik berjalan sekali, jika dalam sebuah plugin Anda harus menggunakan register_activation_hookdan untuk hal lain saya menggunakan fungsi bersyarat kustom dibuat sederhana:

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
}
Bainternet
sumber
Aduh omong kosong. Saya bahkan tahu tentang itu juga dari beberapa rooting sebelumnya tentang kelas WP_Roles. Bisakah Anda memikirkan kelemahan untuk TIDAK menggunakan database untuk peran? Dan apakah ada praktik terbaik WP untuk melakukan sesuatu hanya sekali?
Tom Auger
Terima kasih atas pembaruannya - Saya suka kesederhanaan dari solusi update_option
Tom Auger
Tidak terlalu memuaskan tetapi tampaknya menjadi solusi terbaik 👍
Blackbam