Как включить предлагаемые изменения?

19

Мне нравится идея дать возможность любому пользователю моего сайта предлагать изменения на странице. Очень похоже на систему редактирования в Stack Exchange, но отличается тем, что редактировать должен каждый, а не только зарегистрированные пользователи. Все изменения будут проходить процесс утверждения.

Как я мог это реализовать?

Патрик Клуг
источник
1
Я не знаю, как это сделать, но я думаю, что это может быть действительно проблематично. Я думаю, вы получите много спама.
Мартин Тома
3
Вы уверены, что вам нужна установка WordPress для вашего сайта? Желаемая функциональность очень похожа на установку MediaWiki . Вы должны взвесить все за и против обеих установок. MediaWiki - хорошая альтернатива.
Марк Дингена
Некоторое время назад я прыгал с этой идеей. Наиболее близким к доступному решению был этот плагин: wordpress.org/support/plugin/post-forking Однако он находится на очень ранних стадиях. Плагин предназначен только для зарегистрированных пользователей.
Кристина Купер
Мы работали над чем-то вроде этого. Мы предполагали редактирование постов в стиле Википедии вместе с виджетом «История»: github.com/publishpress/Revisionary/issues/13 Мы еще не совсем там, но почти вся структура на месте.
Стивебург

Ответы:

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()для фактического сравнения. Upvotes для других ответов.
fuxia
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()функцией для последующего использования.

  • После прочтения отредактированной версии и принятия администратором этот пост будет заменен оригинальным, как вы написали в файле functions.php.

Revo
источник
Некоторые примечания: (A) «как вы закодировали в functions.php» - не соглашайтесь с этим. Это материал плагина. (B) «связано с пользовательской таксономией со значением по умолчанию для содержимого публикации» - термин / таксон таксономии имеет только одно возможное значение, в котором содержание может подойти в любом случае: описание. И тогда вам понадобится место для хранения почтового идентификатора. Где это будет? Поскольку для этого нет места из-за ограничений налоговой системы WP, вы можете сохранить только идентификатор термина. Тогда это (ограниченная) только односторонняя система: Post> Term data.
Кайзер
4

Ну, это довольно сложно, правильный ответ занял бы значительное время, чтобы написать. Так что это не настоящий ответ, просто некоторые мысли ..

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

Создание черновиков из правок по умолчанию невозможно, но здесь уже обсуждалось, есть ли способ составить редакцию опубликованной страницы или сообщения? Какие обходные пути вы использовали?

Вы можете попробовать и использовать Front-end Editor, но у вас не будет никакого контроля над опубликованными правками, поэтому попробуйте сделать это с другим плагином, таким как Revisionary, который допускает правки на основе правок, я понятия не имею, будут ли они работать вместе.

Если этого не произойдет, вам придется взломать плагин на основе 2 выше плагинов или написать что-то с нуля.

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

При этом возникают дополнительные сложности, такие как очистка, кодирование, спам, обработка мультимедиа, настраиваемые поля, временные метки, память и т. Д. Хорошая новость заключается в том, что WordPress уже имеет систему ревизий, которую вы можете подключить, и приличную способность работать с несколькими редакторами. ,

пс. Это хорошая идея для плагина.

Уик
источник