Bagaimana cara mengatur opsi layar default?

20

Saya ingin menyembunyikan kotak meta menggunakan opsi layar, alih-alih menghapusnya atau membatasi mereka ke peran pengguna, tujuannya adalah untuk hanya "menghapus centang" kotak meta untuk pengguna.

Saya melihat bagaimana ini akan menjadi rumit karena kode apa pun yang akan membuat perubahan DB untuk pengguna tidak akan diizinkan untuk berjalan setiap kali mereka menekan halaman karena itu hanya akan mengatur ulang. Tetapi orang-orang yang lebih pintar daripada saya kode inti, jadi mungkin ada cara. Dan jika ada, saya ingin tahu.

Ada ide?

berkembang
sumber
Per nama pengguna, Anda harus membuat plugin sendiri yang mengisi semua pengguna dengan kotak centang di sebelah nama mereka dan menghubungkannya ke filter untuk menampilkan kotak meta, atau beberapa kotak meta.
Wyck
Secara default, maksud Anda, aplikasi tersebut harus diterapkan sekali saat pengguna baru dibuat, benar?
Paling lambat

Jawaban:

25

Anda mengacu pada metabox di layar posting admin kan?

Untuk itu Anda tidak memerlukan plugin, cukup masukkan yang berikut ke dalam file functions.php Anda.

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

Pada dasarnya apa yang terjadi adalah bahwa untuk pengguna yang saat ini masuk, Anda mengubah beberapa meta_values ​​yang disimpan dalam tabel wp_usermeta.

Ada dua cara untuk menggunakan fungsi ini, Anda dapat menghubungkan ke 'user_register' atau Anda dapat menghubungkan ke 'admin_init'.

Keuntungan menggunakan 'user_register' adalah bahwa fungsi ini hanya akan diaktifkan ketika pengguna baru terdaftar (sehingga biaya overhead lebih rendah). Namun itu tidak akan berfungsi untuk pengguna yang sudah ada.

Jika Anda ingin itu berfungsi untuk pengguna yang sudah ada, maka kaitkan ke 'admin_init'. Kerugiannya tentu saja adalah bahwa sekarang fungsi ini menyala setiap kali pengguna pergi ke halaman admin.

drebabels
sumber
15
Ini bukan pekerjaan tema dan bukan milik functions.php.
fuxia
6
@ tooscho Saya tidak terlalu setuju dengan itu. Tentu saja Anda bisa memasukkan ini ke dalam plugin tetapi jika misalnya Anda sedang membangun tema untuk diri sendiri atau mungkin untuk klien yang tidak perlu melihat kotak-kotak tertentu maka mengapa menambahkan overhead manajemen tambahan yang disertakan dengan memasukkan ini ke dalam plugin. Dengan memasukkannya ke file functions.php Anda memastikan bahwa pengalaman untuk tema konsisten tanpa harus memastikan plugin diinstal dan diaktifkan.
drebabels
10
Tidak ada overhead dengan menggunakan plugin. Itu mitos yang harus mati seketika. Plus, pembatasan penggunaan Anda bukan bagian dari pertanyaan. Jawaban Anda dibaca oleh ribuan siswa. Anda akan membantu mereka dengan kode terbaik yang dapat Anda tulis, bukan dengan sesuatu yang agak berfungsi dalam beberapa situasi tertentu. :)
fuxia
+1 Jawaban bagus - terkadang Anda ingin mengaturnya secara eksplisit. Ini adalah basis yang bagus, dan tentu saja kode ini dapat dimodifikasi dengan mudah untuk dipanggil saat diperlukan (menambahkan pengguna baru, misalnya), sehingga Anda benar-benar mengatur opsi "default" dan tidak memaksakan opsi pada pengguna yang mengubahnya. Saya akan menambahkan kode ini ke functions.phpfile tema saya karena opsi default adalah untuk proyek tertentu, yang diwakili / ditempati oleh tema yang saya kembangkan.
cwd
1
Beberapa bulan setelah Jawaban ini ditulis, filter mana ditambahkan ke inti membuat jawaban ini usang.
WraithKenny
16

Ada default_hidden_meta_boxesfilter di get_hidden_meta_boxes()yang memungkinkan untuk memodifikasi yang tidak ditampilkan selama pengguna belum mengubah preferensi dalam opsi layar.

Jarang
sumber
7

Saya punya komentar kode tentang tiga solusi yang sudah diposting, tetapi juga komentar umum

Mereka menyajikan pilihan yang kurang optimal: mengesampingkan pilihan kotak centang Opsi Layar pengguna; atau hormati tetapi biarkan kode Anda diabaikan jika pengguna pernah mengubah kotak centang, bahkan untuk meta_box lainnya, atau sebelum kode Anda ada di WP. Tampaknya pilihan penuh hormat hanya berguna jika semua pengguna Anda baru. Solusi terbaik adalah dengan menetapkan opsi pengguna khusus untuk menentukan apakah default meta_box spesifik Anda telah diubah oleh pengguna, dan hormati itu. Tidak, saya belum menulis kode itu! Seharusnya mudah ... :)

Tiga solusi diposting:

1. Solusi WraithKenny adalah hidden_meta_boxessolusi yang mengesampingkan user_option. Catatan itu mencakup semua jenis posting ('posting', 'halaman', 'tautan', 'lampiran', dan semua jenis posting khusus). Tidak apa-apa kecuali Anda menginginkannya spesifik. Anda menentukan post_type di add_meta_box()panggilan Anda . Anda dapat mencoba mencocokkannya, atau hanya menaruhnya karena yang tidak cocok akan diabaikan. Jika Anda ingin mengetahui post_type di filter, Anda dapat menggunakan screenparameter tambahan :

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. Seperti yang dikatakan Rarst, default_hidden_meta_boxeshormati user_option. Sepertihidden_meta_boxes , Anda dapat menggunakan parameter $ screen untuk membedakan post_types.

3. Fungsi set_user_metaboxes () dari Drebabels juga menghormati user_option. Catat itu hard-coded untuk layar edit 'post'. Untuk menangani layar edit 'halaman', dan post_types lainnya, bungkus kode dalam loop ini:

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

Ya, get_user_metaseharusnya begitu get_user_option. Untuk satu situs tidak masalah, dan bahkan untuk multi situs mungkin tidak. Lihat wp-admin / include / ajax-actions.php untuk alasan: update_user_optionmemiliki parameter global 'benar'.

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

Ada juga hidden_meta_boxesfilter yang akan "hapus centang" metabox (membuatnya tersembunyi) di setiap halaman memuat (tetapi tidak perlu memperbarui database sama sekali). Jika Anda hanya menginginkannya untuk pengguna baru sampai mereka mencentang kotaknya sendiri, gunakan jawaban Rarst.

WraithKenny
sumber