Як увімкнути запропоновані зміни?


19

Мені подобається ідея дозволити будь-якому користувачеві мого веб-сайту пропонувати зміни на сторінці. Так само, як і система редагування на Stack Exchange, але відрізняється тим, що редагувати повинен кожен, а не лише зареєстровані користувачі. Усі редагування проходили б через процес затвердження.

Як я міг це здійснити?


1
Я не знаю, як це зробити, але думаю, що це може бути справді проблематичним. Я думаю, ви отримаєте багато спаму.
Мартін Тома

3
Ви впевнені, що вам потрібна установка WordPress для вашого веб-сайту? Бажана вам функціональність дуже нагадує встановлення MediaWiki . Ви повинні зважити плюси і мінуси обох установок. MediaWiki - хороша альтернатива.
Marc Dingena

Я трохи підстрибував з цією ідеєю. Найближчим до доступного рішення був цей плагін: wordpress.org/support/plugin/post-forking Однак він знаходиться на дуже ранній стадії. Плагін обмежений для зареєстрованих користувачів.
Крістін Купер

Ми працювали над чимось подібним. Ми передбачили редагування публікацій у стилі Вікіпедії разом із віджетом "Історія": github.com/publishpress/Revisionary/isissue/13 Нас поки ще не існує, але майже вся структура існує.
steveburge

Відповіді:


11

Відмінніть вміст публікації, назву та автора

Оскільки я мав зробити щось, пов’язане з цим місяць тому, ось найпростіший і найбільш перспективний спосіб підтвердження (що я можу штрафувати), щоб перевірити, чи є зміна, внесена до змісту чи назви, чи змінив автор:

// 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'];

Щоб пояснити свій сценарій коротко: я виймав публікації з віддаленого місця через віддалений API. Потім я повернув global $postпід час одного повідомлення цикл, що містив або вихідні дані, або нові дані. Таким чином я перемістив налаштування всіх інших значень публікації, які мені не потрібно було перевіряти на зміни.

Пропозиція редагування

Основний факт, про який слід пам’ятати, під час пошуку місця, де можна було (тимчасово) зберегти копію-редагування вмісту публікації, - це те, що вміст є db-записом longtext. Тому місце, де хочеться зберегти запропоновану редакцію, повинно відповідати цій вимозі. Коментарі це роблять.

Тоді є приємний факт, що вони пропонують API, щоб вони розмістили їх у циклі, тому він інтегрується в плавно, є налаштованим і швидко налаштовується. І останнє, але не в останню чергу, більшість тем вже вбудовані з інтегрованими коментарями, тому їх легко підготувати в систему та підключити майже до будь-якої доступної теми.

Я б запропонував просто (або) розширити або змінити форму коментарів. Скористайтеся поданими нижче або додайте додаткові поля, до яких підключений зворотний дзвінок 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
}

Тож я додав hiddenполе для comment_approvedзі значенням 0для встановлення його у черзі. Не впевнений, чи це спрацює або якщо це (основне) значення - це фактично метадані коментаря та його потрібно додати, використовуючи add_comment_meta()під час збереження. Якщо немає, то ви могли б використовувати що - то вздовж наступні рядки коди

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

Відображення коментарів на стороні адміністратора

Тут я хотів би просте розширення класу та користувацьку сторінку адміністратора:

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
}

Більше інформації можна знайти на WPEngineer .

Схвалення правок

Потім ви можете додати спеціальні дії та обробити запропоновані зміни за допомогою першого коду, який я показав, щоб перевірити, чи відбулися зміни, а потім просто оновити публікацію. Сам коментар має значення з ключем comment_post_ID, тому ідентифікація відредагованих ідентифікаторів публікацій прямо вперед.

Заключна примітка

Я також хотів би бачити останній плагін. Будь ласка, зв’яжіть це тут :)


1
Я надаю щедрості цьому питанню за ідею використовувати мета коментаря для зберігання запропонованих змін та wp_text_diff()для фактичного порівняння. Оновлення інших відповідей.
фуксія

8

Моя ідея - щось просте.

  • Ви можете зробити Edit Suggestionпосилання внизу публікацій, у яких є визначений користувальницький шаблон, використовуючи текстове поле (можливо, з редактором), пов’язане із власною систематикою із значенням за замовчуванням post content.

  • Будь-які зміни contentбудуть порівнюватися original post contentпісля подачі (як чернетка) і введення CAPTCHA codeз Diff алгоритмів , таких як PHP , рядний дифф пакет або Text-Diff PEAR пакет або , альтернативно , з допомогою функції PHP в відповідно до цим для не надто довгих текстів з комбінацією CSS.

  • Потім, зберігаючи значення у 3 користувальницьких метаполе (на цій сторінці таксономії додавання / редагування), які відображаються

    1. Оригінальний вміст
    2. Відредагована версія
    3. Псевдонім користувача та його електронна пошта

    і збереження Post IDможливо з update_option()функцією для подальшого використання.

  • Після прочитання відредагованої версії та прийняття адміністратором ця публікація буде замінена на оригінальну, яку ви зашифрували у function.php.


Деякі зауваження: (A) "як ви кодували у function.php" - не погоджуйтеся з цим. Це матеріал плагінів. (B) "пов'язана з власною систематикою із значенням за замовчуванням вмісту після публікації" - Термін / таксономія таксономії має лише одне можливе значення, у якому вміст у будь-якому випадку підходить: Опис. І тоді вам знадобиться місце для зберігання посвідчення особи. Де це було б? Оскільки для цього немає місця через обмеження податкової системи WP, ви можете зберегти лише ідентифікатор терміна. Тоді це лише (обмежена) система в одну сторону: Публікація> Дані терміна.
кайзер

4

Ну, це досить складно, правильна відповідь потребує значного часу для написання. Тож це не справжня відповідь, а лише деякі думки ..

Використання вбудованої програми WordPress wp_update_postчерез ajax надасть вам необхідну історію версій, але не можливість затвердження змін.

Створення чернеток з редагувань неможливо за замовчуванням, але тут було обговорено. Чи є спосіб скласти редакцію опублікованої сторінки чи публікації? Які обхідні шляхи ви використовували?

Ви можете спробувати використовувати Front-Editor, але у вас не буде ніякого контролю над публікаціями редагувань, тому спробуйте зв'язати його з іншим плагіном на зразок Revisionary, який дозволяє редагувати на основі дозволів, я не маю уявлення, чи будуть вони працювати разом.

Якщо їх немає, вам доведеться зламати плагін на основі двох вищевказаних плагінів або написати щось з нуля.

Моїм подряповим підходом було б мати кнопку, що переходить на іншу сторінку, яка виводить вміст / дані публікації за допомогою JSON , з чим легше працювати при використанні редакторів Ajax та WYSIWYG. Кнопка збереження буде розміщуватися як чернетка замість публікації, і таким чином ви матимете контроль над правками (див. Вище обговорення WPSE про те, як це досягти, це досить непросто).

При цьому виникають додаткові ускладнення, такі як санітарія, кодування, спам, обробка медіа, користувальницькі поля, часові позначки, пам'ять тощо. Хороша новина полягає в тому, що Wordpress вже має систему ревізії, до якої можна підключитись, і гідну можливість роботи з декількома редакторами .

пс. Це гарна ідея для плагіна.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.