Bagaimana cara mengaktifkan suntingan yang disarankan?

19

Saya menyukai gagasan mengaktifkan pengguna situs web saya untuk menyarankan pengeditan ke halaman. Mirip seperti sistem edit di Stack Exchange tetapi berbeda karena siapa pun harus dapat mengedit, bukan hanya pengguna terdaftar. Semua suntingan akan melalui proses persetujuan.

Bagaimana saya bisa menerapkannya?

Patrick Klug
sumber
1
Saya tidak tahu bagaimana melakukannya, tetapi saya pikir ini mungkin sangat bermasalah. Saya pikir Anda akan mendapatkan banyak spam.
Martin Thoma
3
Apakah Anda yakin bahwa Anda memerlukan instalasi WordPress untuk situs web Anda? Fungsi yang Anda inginkan terdengar sangat mirip dengan instalasi MediaWiki . Anda harus mempertimbangkan pro dan kontra dari kedua instalasi. MediaWiki adalah alternatif yang bagus.
Marc Dingena
Saya terpental dengan ide ini beberapa waktu lalu. Yang paling dekat dengan solusi yang tersedia adalah plugin ini: wordpress.org/support/plugin/post-forking Itu adalah namun di sangat tahap awal. Plugin dibatasi untuk pengguna terdaftar.
Christine Cooper
Kami telah berupaya menuju sesuatu seperti ini. Kami telah membayangkan pengeditan gaya Wikipedia untuk posting, bersama dengan widget "History": github.com/publishpress/Revisionary/issues/13 Kami belum sampai di sana, tetapi hampir semua struktur sudah ada.
steveburge

Jawaban:

11

Bedakan dengan konten, judul, dan penulis

Seperti yang harus dilakukan terkait sesuatu beberapa bulan lalu, inilah cara bukti termudah dan paling masa depan (yang saya bisa baik-baik saja) untuk memeriksa apakah ada perubahan pada konten atau judul atau jika penulis berubah:

// Update Title
'' !== wp_text_diff(
    $el['post_title'],
    $GLOBALS['post']->post_title
)
    AND $GLOBALS['post']->post_title = $el['post_title'];
// Update Content
'' !== wp_text_diff(
    $el['post_content'],
    $GLOBALS['post']->post_content
)
    AND $GLOBALS['post']->post_content = $el['post_content'];
// Update author
$GLOBALS['post']->post_author !== $el['post_author']
    AND $GLOBALS['post']->post_author = $el['post_author'];

Untuk menjelaskan skenario saya secara singkat: Saya mengambil posting dari lokasi terpencil melalui API jarak jauh. Kemudian saya mengembalikan global $post, selama satu posting loop, berisi data asli atau data baru. Dengan cara ini saya berpindah pengaturan semua nilai posting lain yang saya tidak perlu memeriksa perubahan.

Mengusulkan hasil edit

Fakta utama yang harus diingat ketika mencari tempat di mana salinan-edit konten posting dapat (sementara) disimpan adalah bahwa kontennya adalah entri db longtext. Jadi tempat di mana seseorang ingin menyimpan hasil edit yang disarankan harus memenuhi persyaratan itu. Komentar melakukan itu.

Lalu ada fakta bagus bahwa mereka menawarkan API untuk menempatkan mereka dengan baik dalam satu lingkaran, sehingga terintegrasi dengan lancar, sangat dapat dikustomisasi dan dapat dengan cepat diatur. Terakhir namun tidak kalah penting, sebagian besar tema telah hadir dengan komentar yang terintegrasi sehingga mudah untuk membonceng sistem dan menghubungkan ke hampir semua tema yang tersedia.

Saya sarankan untuk hanya memperpanjang atau mengubah formulir komentar. Gunakan salah satu dari berikut ini atau tambahkan bidang tambahan dengan panggilan balik yang dikaitkan comment_form_default_fields.

<?php
// Add it for logged in users and guests:
add_action( 'comment_form_logged_in_after', 'wpse_proposed_edit_textarea' );
add_action( 'comment_form_after_fields', 'wpse_proposed_edit_textarea' );
function wpse_proposed_edit_textarea()
{
    ?>
    <p class="comment-form-title">
        <label for="wpse_propsed_edit">
            <?php _e( 'Propose Edit', 'your_textdomain' ); ?>
        </label>
        <textarea name="wpse_propsed_edit" id="wpse_propsed_edit">
            <?php the_content(); ?>
        </textarea>
    </p>
    <input type="hidden" name="comment_approved" id="comment_approved" value="0" />
    <?php
}

Jadi saya telah menambahkan hiddenbidang comment_approveddengan nilai 0untuk mengaturnya dalam antrian. Tidak yakin apakah ini akan berfungsi atau apakah nilai (inti) ini benar-benar mengomentari data meta dan perlu ditambahkan dengan menggunakan add_comment_meta()saat menyimpan. Jika tidak, Anda bisa menggunakan sesuatu di sepanjang baris kode berikut

add_filter( 'pre_comment_approved' , 'wpse_pre_suggest_edit', 100, 2 );
function wpse_pre_suggest_edit( $approved , $commentdata )
{
    // You might need to inspect $commentdata 
    // to determine approval, disapproval, or spam status
    if ( ! empty( $commentdata['wpse_propsed_edit'] ) )
    {
        # Now add a filter to the comment post action, so we save a meta entry
        add_action( 'comment_post', 'wpse_set_proposed_edit' );
        return 0;
    }

    return 1;
}

// This function makes it easier for us to identify the comments by their meta value
function wpse_set_proposed_edit( $comment_id );
{
    // Only run once
    remove_filter( current_filter(), __FUNCTION__ );

    add_comment_meta( $comment_id, 'proposed_edit', true, true );
}

Menampilkan komentar di sisi admin

Di sini saya akan pergi dengan ekstensi kelas sederhana dan halaman admin khusus:

function wpse_add_proposed_edits_admin_page()
{
    add_menu_page(
        'Proposed Edits',
        'Suggested Edits',
        'activate_plugins',
        'proposed_edits',
        'wpse_proposed_edits_page_cb'
    );
}
add_action( 'admin_menu', 'wpse_add_proposed_edits_admin_page' );

function wpse_proposed_edits_page_cb()
{
    $proposed_edits_table = new WP_Proposed_Edits_Table();
    $proposed_edits_table->prepare_items(); 
    $proposed_edits_table->display(); 
}

class WP_Proposed_Edits_Table extends WP_List_Table
{
    // Override List table default logic in here
}

Info lebih lanjut dapat ditemukan di WPEngineer .

Menyetujui pengeditan

Anda kemudian dapat menambahkan tindakan khusus dan memproses pengeditan yang diusulkan menggunakan kode pertama yang saya tunjukkan untuk memeriksa apakah ada perubahan dan kemudian cukup memperbarui kiriman. Komentar itu sendiri memegang nilai dengan kunci comment_post_ID, jadi mengidentifikasi ID tulisan yang diedit adalah lurus ke depan.

Catatan akhir

Saya juga ingin melihat plugin terakhir. Tolong tautkan di sini :)

kaisar
sumber
1
Saya memberikan hadiah kepada pertanyaan ini untuk gagasan menggunakan meta komentar untuk menyimpan hasil edit yang disarankan dan wp_text_diff()untuk perbandingan yang sebenarnya. Suara positif untuk jawaban lainnya.
fuxia
8

Ide saya adalah sesuatu yang sederhana.

  • Anda dapat membuat Edit Suggestiontautan di bagian bawah posting yang memiliki templat yang ditentukan khusus, yang menggunakan kotak teks (mungkin dengan editor) yang ditautkan ke taksonomi khusus dengan nilai default post content.

  • Setiap perubahan contentakan dibandingkan dengan original post contentsetelah mengirimkan (sebagai Draft) dan Memasuki CAPTCHA codedengan algoritma Diff seperti PHP inline-diff paket atau Text-Diff PEAR Package atau alternatif menggunakan fungsi PHP menurut ini untuk teks tidak terlalu panjang dengan kombinasi CSS.

  • Kemudian dengan menyimpan nilai dalam 3 Kotak Meta kustom (di halaman menambahkan / mengedit taksonomi back-end) yang ditampilkan

    1. Konten Asli
    2. Versi yang sudah diedit
    3. Nama panggilan pengguna dan Emailnya

    dan menyimpan Post IDmungkin dengan update_option()fungsi untuk digunakan nanti.

  • Setelah membaca versi yang diedit dan diterima oleh admin, postingan itu akan diganti yang asli saat Anda menulis kode di functions.php.

revo
sumber
Beberapa catatan: (A) "saat Anda menulis kode di functions.php" - jangan setuju dengan ini. Ini adalah bahan plugin. (B) "ditautkan ke taksonomi khusus dengan nilai default konten posting" - Istilah taksonomi / takson hanya memiliki satu nilai yang mungkin di mana konten akan cocok dalam hal apa pun: Deskripsi. Dan kemudian Anda akan membutuhkan tempat untuk menyimpan ID posting. Di mana ini? Karena tidak ada tempat untuk ini karena batas sistem pajak WP, Anda hanya dapat menyimpan ID istilah. Maka ini adalah sistem satu arah (terbatas) saja: Posting> Istilah data.
kaiser
4

Yah ini agak rumit, jawaban yang tepat akan membutuhkan waktu yang cukup lama untuk menulis. Jadi ini bukan jawaban nyata hanya beberapa pemikiran ..

Menggunakan WordPress build in wp_update_postvia ajax akan memberi Anda riwayat revisi yang diperlukan tetapi bukan kemampuan yang diperlukan untuk menyetujui pengeditan.

Membuat draft dari suntingan tidak dimungkinkan secara default tetapi telah dibahas di sini, Apakah ada cara untuk membuat konsep revisi halaman atau postingan yang diterbitkan? Penanganan apa yang telah Anda gunakan?

Anda dapat mencoba dan menggunakan Editor Front-end tetapi Anda tidak akan memiliki kontrol atas suntingan yang diterbitkan, jadi coba dan tumbuhkan dengan plugin lain seperti Revisionary yang memungkinkan untuk mengedit berdasarkan izin, saya tidak tahu apakah mereka akan bekerja sama.

Jika tidak, Anda harus meretas plugin berdasarkan 2 plugin di atas atau menulis sesuatu dari awal.

Pendekatan awal saya adalah memiliki tombol yang menuju ke halaman lain yang menampilkan konten posting / data menggunakan JSON , yang lebih mudah untuk dikerjakan saat menggunakan editor Ajax dan WYSIWYG. Tombol simpan akan memposting sebagai konsep alih-alih mempublikasikan dan dengan cara itu Anda akan memiliki kontrol atas pengeditan (lihat di atas diskusi WPSE tentang cara menyelesaikan ini, itu agak menakutkan).

Ada komplikasi tambahan ketika melakukan ini seperti sanitasi, encoding, spam, penanganan media, bidang kustom, cap waktu, memori, dll. Kabar baiknya adalah wordpress sudah memiliki sistem revisi yang dapat Anda pasang dan kemampuan yang baik untuk menangani banyak editor. .

ps. Ini adalah ide yang bagus untuk sebuah plugin.

Wyck
sumber