Mungkinkah membiarkan kontributor mengubah penulis dari posnya sendiri? Saya menyadari ini akan secara efektif mengunci mereka dari pos, itulah yang saya inginkan. Saya ingin mereka dapat mengubah penulis begitu mereka selesai mengedit.
capabilities
Michael Rogers
sumber
sumber
Jawaban:
Saya menambahkan jawaban kedua karena pendekatan pertama saya ditolak dan yang ini tidak mendapatkan perhatian yang layak.
Idenya adalah membuat kotak meta khusus yang mencantumkan semua pengguna dan mengubah
save_post
pengait penulis . Dengan cara ini Anda tidak mengacaukan kemampuan pengguna dan perubahan penulis terjadi ketika pos sudah disimpan. Juga keuntungan tambahan adalah Anda dapat mengontrol daftar pengguna yang tersedia di dropdown penulis. Langkah-langkah untuk diikuti:Daftarkan kotak meta:
Bangun markup untuk kotak meta Anda:
Hubungkan ke
save_post
untuk menyimpan data dan menimpa penulis:CATATAN Ingatlah untuk menambahkan bidang nonce dan memeriksanya di pos simpan. Anda juga dapat mempertimbangkan untuk menggunakan kait lain, bukan
save_post
, yaitupre_post_update
atauwp_insert_post_data
, untuk memproses data pada penyimpanan awal posting.Semoga itu bisa membantu!
sumber
Perangkap:
Meskipun memungkinkan untuk memungkinkan seorang penulis (atau kontributor) untuk menetapkan penulis lain ke posnya sendiri menggunakan
user_has_cap
hook filter dan beberapa KODE terkait, namun, pendekatan ini sendiri pada dasarnya cacat . Jadi, bahkan jika Anda mengambil semua tindakan keamanan yang diperlukan, itu masih kerentanan karena itu merusak arsitektur kemampuan secara bersamaan.Biarkan saya memberi Anda sebuah skenario contoh: katakanlah seorang pengguna dengan peran penulis kurang memiliki niat yang terhormat dan spam penulis lain dengan banyak posting (mungkin menggunakan skrip). Kali berikutnya penulis tujuan masuk, ia akan melihat semua pos tersebut atas namanya! Ini akan terus berlanjut karena penulis lain tidak memiliki cara untuk menghentikannya! Jadi kita harus menemukan pendekatan alternatif yang tidak memiliki kekurangan ini.
Pendekatan yang lebih baik:
Jika perubahan penulis adalah fitur yang diperlukan, maka pendekatan yang lebih baik adalah melibatkan penulis lain (atau pengguna dengan kekuatan lebih tinggi seperti editor atau admin lain) dalam proses perubahan penulis, sehingga penulis yang memulai mungkin tidak dapat melakukan spam penulis tujuan.
Untuk mencapainya, kami akan membiarkan penulis yang memulai memilih penulis tujuan dari editor, tetapi kami tidak akan mengubah cara penulis pos secara langsung. Sebaliknya, pada saat perubahan penulis, kami akan menyimpan meta pos khusus yang akan menyimpan id penulis tujuan. Kemudian di dalam panel admin, kita akan memiliki sub menu posting, di mana semua posting dengan permintaan perubahan penulis akan muncul. Hanya pembuat tujuan dan pengguna dengan
edit_others_post
kemampuan (seperti editor, admin, dll.) Yang akan memiliki akses ke pembuat ini mengubah permintaan UI. Dari UI, pengguna dengan akses yang tepat akan menyetujui perubahan dan hanya kemudian perubahan penulis akhir akan terjadi.Apa yang terjadi pada posting saat dalam antrian persetujuan?
Implementasi CODE dapat bervariasi tergantung pada persyaratan, namun, tanpa implementasi CODE lainnya, penulis pemula akan dapat memodifikasi posting atau bahkan mengembalikan permintaan perubahan penulis dalam jendela proses persetujuan. Mereka akan dikunci dari pos segera setelah permintaan perubahan penulis disetujui.
sumber
Kotak dropdown penulis hanya akan ditampilkan ketika pengguna memiliki
edit_others_posts
kemampuan. Namun, Anda tidak ingin memberikan kemampuan ini kepada penulis secara default, karena alasan yang jelas. Solusinya adalah memberikan kemampuan ini hanya dalam keadaan tertentu, yaitu ketika dia mengedit salah satu posnya sendiri. Karena kemampuannya ditulis ke database Anda juga harus memastikan itu dihapus pada halaman lain.Ini adalah masalah waktu yang tepat. Anda ingin mengubah kemampuan setelah WP memutuskan bahwa kontributor memiliki hak untuk mengedit posting, tetapi sebelum bentuk halaman edit (
post.php
) dibuat. Kait yang cocok adalahadmin_init
.Seperti ini:
Saya belum menguji kodenya, jadi mungkin bermasalah, tetapi Anda dapat idenya.
sumber
Saya mencoba untuk mencapai apa yang Anda butuhkan dengan memfilter kemampuan meta kontributor dan tampaknya berfungsi dengan baik. Yang saya lakukan di sini adalah menambahkan
edit_others_posts
kemampuan untuk kontributor ketika WordPress meminta untuk itu.Namun, saya akan mengatakan itu adalah solusi yang sedikit rumit bagi saya dan saya tidak yakin apakah itu sepenuhnya aman. Dari apa yang saya periksa setelah meletakkan filter saya ke
functions.php
WordPress tidak memungkinkan kontributor mengedit posting pengguna lain dalam konteks lain daripada yang Anda minta. Tampaknya baik-baik saja, tetapi kami tidak dapat benar-benar memeriksa secara eksplisit apakah pengguna saat ini adalah penulis posting yang sedang diedit (Anda tidak akan dapat menyimpan posting sebagai pengguna yang berbeda jika pemeriksaan bersyarat itu akan ditambahkan ke fungsi) - yang membuatku khawatirsumber
edit_others_posts
kemampuan penulis pada dasarnya akan memungkinkan mereka untuk mengedit posting orang lain. Kita bisa juga membuat penulis menjadi editor, itu mungkin lebih baik daripada memberi mereka kemampuan yang lebih tinggi. Solusi kedua adalah suatu kemungkinan, tetapi membutuhkan lebih banyak pekerjaan, IMHO.edit_others_posts
selalu mengizinkan pengeditan pos pengguna lain. Silakan uji kode dari jawaban saya - bahkan dengan filter di tempat, kemampuan memeriksaif ( ! current_user_can( 'edit_post', $post_id ) )
di github.com/WordPress/WordPress/blob/… masih mengembalikan false. Sekali lagi, saya setuju bahwa itu bukan solusi yang aman seperti yang disebutkan dalam jawaban saya, tetapi saya pikir itu layak disebut karena itu benar-benar berfungsi. (maaf untuk dua komentar berturut-turut, saya tidak cocok dengan batas charachter)Pertama-tama, instal Editor Peran Pengguna plugin ( https://wordpress.org/plugins/user-role-editor/ ).
Kedua, menggunakan plugin untuk membuat peran baru yang disebut Post Manager, misalnya:
Setelah membuat peran baru Anda akan dapat mengedit kemampuannya. Sekarang, adalah saat Anda menyelesaikan masalah Anda, tetapi Anda harus memutuskan di antara dua opsi:
(jangan khawatir tentang peran kontributor, belum)
Pertama:
edit_others_posts
danpublish_posts
.Kedua:
edit_others_posts
,.Setelah memutuskan klik "Perbarui". Peran baru Anda sekarang harus memiliki
read
kemampuan plus yang Anda pilih.Sekarang, buka halaman profil pengguna kontributor Anda , dan di akhir halaman beri mereka peran tambahan (fitur Editor Peran Pengguna):
Sekarang, setiap pengguna yang merupakan Kontributor dan Manajer Posting akan dapat mengubah pembuat posting dari posting yang tidak dipublikasikan. Dan tergantung pada pilihan Anda sebelumnya, pengguna juga dapat mempublikasikan posting, dan jika mereka melakukannya mereka tidak dapat mengedit posting lagi.
PENTING!!!
Dan hanya sebagai catatan, secara default WordPress hanya memungkinkan
edit_others_posts
kemampuan untuk mengubah postingan pembuat. Lihat https://github.com/WordPress/WordPress/blob/master/wp-admin/includes/class-wp-posts-list-table.php line 1483.sumber