Izinkan Kontributor mengubah penulis posnya sendiri?

9

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.

Michael Rogers
sumber
Hanya bertanya-tanya di sini apakah ada cara lain untuk mencapai kebutuhan bisnis. Memberikan kemampuan non-editor / admin untuk menugaskan penulis lain posting mereka tampaknya agak luas. Apakah ada daftar penulis yang telah ditetapkan yang dapat mereka tetapkan sebagai 'penulis'? Apakah ada hubungan yang pasti antara kontributor dan penulis yang diizinkan? Atau bisakah mereka memilih penulis yang mereka sukai?
anmari
Saya juga mencatat bahwa ini tidak akan 'mempublikasikan' posting mereka. Karenanya kedengarannya seperti tujuannya adalah untuk meniru semacam alur kerja di mana kontributor menugaskan posting ke penulis daripada mengatakan editor memilih posting 'menunggu' untuk ditinjau. Jika penulis Anda bisa menjadi editor maka mungkin pergi dengan wp apa adanya dan mungkin menggunakan tag bukan untuk berkomunikasi atau menyoroti editor mana yang harus mengambil posting mana?
anmari
Ah, Anda mengatakan "kunci mereka dari pos, itulah yang saya inginkan". Apakah itu lebih penting? Bahwa begitu mereka 'mengirim untuk ditinjau', mereka tidak lagi dapat mengedit? Apakah perlu mengacaukan 'penulis'? Atau apakah beberapa status non-publik berfungsi? Mungkin menggunakan codex.wordpress.org/Post_Status#Custom_Status
anmari

Jawaban:

1

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_postpengait 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:

function wpse313020_add_custom_box() {

    // Bail out for users other than contributors
    if ( ! user_can( get_current_user_id(), 'contributor' ) ) {
        return;
    } 

    // Register custom meta box
    add_meta_box(
        'wpse313020_author_override',
        'Change Author', // metabox title
        'wpse313020_author_ovveride_box_html', // callbac function
        'post' // a post type you want to show the metabox on
    );
}
add_action('add_meta_boxes', 'wpse313020_add_custom_box');

Bangun markup untuk kotak meta Anda:

/**
 * HTML for custom meta box
 */
 function wpse313020_author_ovveride_box_html() {
    // you can modify the list of users by passing additional args to get_users()
    $users = get_users();
    ?>
    <label for="wpse313020_author_override_id">Select post author</label><br />
    <select name="wpse313020_author_override_id" id="wpse313020_author_override_id" class="postbox">
        <option value="">Select user...</option>
        <?php
        // get post ID on admin edit screen and retrieve saved post meta
        $post_id     = is_admin() && isset( $_GET['post'] ) ? absint( wp_unslash( $_GET['post'] ) ) : '';
        $saved_value = ! empty( $post_id ) ? get_post_meta( $post_id, 'wpse313020_author_override', true ) : '';

        foreach ( $users as $user ) {
            echo sprintf( '<option value="%1$d" %2$s>%3$s</option>', absint( $user->ID ), selected( $saved_value, absint($user->ID, false ) ), esc_html( $user->display_name ) );
        }
        ?>
    </select>
    <?php
 }

Hubungkan ke save_postuntuk menyimpan data dan menimpa penulis:

/**
 * Save custom post meta and override the post author
 */
function wpse313020_save_postdata( $post_id ) {

    if ( array_key_exists('wpse313020_author_override_id', $_POST ) ) {
        // save post meta with author ID
        update_post_meta( $post_id, 'wpse313020_author_override', absint( $_POST['wpse313020_author_override_id'] ) );

        // now modify the post author, we need to unhook the current function to prevent infinite loop
        // you could add additional check here to see if the current author is not the same as chosen author

        remove_action( 'save_post', 'wpse313020_save_postdata' );

        $updated_data = [
            'ID'          => $post_id,
            'post_author' => absint( $_POST['wpse313020_author_override_id'] ),
        ];

        wp_update_post( $updated_data );

        add_action( 'save_post', 'wpse313020_save_postdata' );
    }
}
add_action('save_post', 'wpse313020_save_postdata');

CATATAN Ingatlah untuk menambahkan bidang nonce dan memeriksanya di pos simpan. Anda juga dapat mempertimbangkan untuk menggunakan kait lain, bukan save_post, yaitu pre_post_updateatau wp_insert_post_data, untuk memproses data pada penyimpanan awal posting.

Semoga itu bisa membantu!

Levi Dulstein
sumber
1

Perangkap:

Meskipun memungkinkan untuk memungkinkan seorang penulis (atau kontributor) untuk menetapkan penulis lain ke posnya sendiri menggunakan user_has_caphook 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_postkemampuan (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.

Fayaz
sumber
0

Kotak dropdown penulis hanya akan ditampilkan ketika pengguna memiliki edit_others_postskemampuan. 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 adalah admin_init.

Seperti ini:

add_action ('admin_init', 'wpse313020_change_author');
function wpse313020_change_author () {
  global $pagenow;
  $current_user = wp_get_current_user();
  // only do this if current user is contributor
  if ('contributor' == $current_user->roles[0]) {
    // add capability when we're editing a post, remove it when we're not
    if ('post.php' == $pagenow)
       $current_user->add_cap('edit_others_posts')
    else
       $current_user->remove_cap('edit_others_posts');
    }
  }

Saya belum menguji kodenya, jadi mungkin bermasalah, tetapi Anda dapat idenya.

cjbj
sumber
-1

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_postskemampuan 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.phpWordPress 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 khawatir

/**
 * author_cap_filter()
 *
 * Filter on the current_user_can() function.
 * This function is used to explicitly allow contributors to change post authors
 *
 * @param array $allcaps All the capabilities of the user
 * @param array $cap     [0] Required capability
 * @param array $args    [0] Requested capability
 *                       [1] User ID
 */
function author_cap_filter( $allcaps, $cap, $args ) {

    // Bail out if we're not dealing with right capability:
    if ( ! in_array( $args[0], [ 'edit_others_posts' ] ) ) {
        return $allcaps;
    }

    // Bail out for users who are not contributors
    if ( ! user_can( $args[1], 'contributor' ) ) {
        return $allcaps;
    }

    // Bail out for users who can already edit others posts:
    if ( isset( $allcaps['edit_others_posts'] ) && $allcaps['edit_others_posts'] ) {
        return $allcaps;
    }

    // overwrite 'edit_others_posts' capability
    $allcaps[ $args[0] ] = true;

    return $allcaps;
}
add_filter( 'user_has_cap', 'author_cap_filter', 100, 3 );
Levi Dulstein
sumber
2
Harap dicatat bahwa, memberikan edit_others_postskemampuan 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.
Scott
Saya merasa seperti downvote di sini tidak adil, saya sebenarnya menunjukkan kedua hal dalam jawaban saya yang menyatakan bahwa solusi pertama tidak aman dan menunjukkan bahwa solusi kedua membutuhkan lebih banyak pekerjaan, tetapi saya percaya itu membantu karena menunjukkan solusi yang berfungsi bahwa OP dapat meningkatkan (saya tidak berpikir bahwa menjawab pertanyaan pada WPSE harus berarti memberikan cuplikan kode siap produksi). Juga, akan bermanfaat jika Anda bisa lebih tepat dan menunjukkan apa yang bisa diperbaiki atau bahkan mengedit posting saya jika Anda bermaksud beberapa tweak kecil. Bersulang!
Levi Dulstein
Selain itu, Anda tidak sepenuhnya benar tentang edit_others_postsselalu mengizinkan pengeditan pos pengguna lain. Silakan uji kode dari jawaban saya - bahkan dengan filter di tempat, kemampuan memeriksa if ( ! 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)
Levi Dulstein
-2

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:

masukkan deskripsi gambar di sini

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:

  • Berikan peran baru Anda dua kemampuan tambahan, edit_others_postsdan publish_posts.
  • Dengan cara ini, kontributor Anda akan dapat mengedit hanya posting yang tidak dipublikasikan (hanya posting Pending dan Konsep). Jadi, jika kontributor hanya mengubah penulis posting mereka masih dapat mengedit posting. Mereka hanya akan diblokir dari mengedit posting setelah menerbitkannya. Ini juga berarti bahwa jika kontributor menerbitkan posting dan lupa untuk mengubah penulis, mereka akan kehilangan kesempatan untuk mengubah penulis posting.

Kedua:

  • Berikan peran baru Anda hanya satu kemampuan ekstra edit_others_posts,.
  • Cara ini berfungsi seperti yang pertama, TETAPI di sini kontributor Anda tidak dapat mempublikasikan yang berarti mereka tidak dapat mempublikasikan dan lupa untuk mengubah penulis. Di sini, seseorang harus mempublikasikan posting.

Setelah memutuskan klik "Perbarui". Peran baru Anda sekarang harus memiliki readkemampuan plus yang Anda pilih.

Sekarang, buka halaman profil pengguna kontributor Anda , dan di akhir halaman beri mereka peran tambahan (fitur Editor Peran Pengguna):

masukkan deskripsi gambar di sini

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!!!

Saya menunjukkan kepada Anda solusi menciptakan peran baru untuk menjaga kemampuan default dari Kontributor. Jika Anda mau (tidak bijak), Anda bisa melewatkan kreasi Post Manager dan menggunakan Editor Peran Pengguna, Anda cukup mengedit kemampuan Kontributor secara langsung .

Dan hanya sebagai catatan, secara default WordPress hanya memungkinkan edit_others_postskemampuan untuk mengubah postingan pembuat. Lihat https://github.com/WordPress/WordPress/blob/master/wp-admin/includes/class-wp-posts-list-table.php line 1483.

filipecsweb
sumber
1
ini membuat pengguna menjadi editor, tidak perlu menginstal plugin untuk itu, cukup gunakan admin pengguna. Bagaimanapun, ini bukan yang diminta OP.
Mark Kaplun
Solusi ini secara eksplisit memungkinkan Kontributor mengubah penulis pos. Jadi, ya, itu yang dia minta. Kedua, secara default, Editor memiliki lebih dari 20 kemampuan yang ditugaskan padanya. Solusi saya tidak menjadikan Kontributor Editor. Biarkan orang yang bertanya memutuskan apakah jawaban saya menyelesaikan masalah mereka. Tolong, pikirkan dua kali tentang downvote Anda.
filipecsweb
OP meminta kontributor untuk melakukan sesuatu. Solusi Anda adalah menjadikannya editor yang dapat mengubah penulis di mana pun saat mereka melanggar keamanan
Mark Kaplun