Intereting Posts
Как использовать таксономии вложений в новой медиабиблиотеке? Получите значения полей Gravity Forms и подсчитайте, сколько? Добавление настраиваемых параметров отображения вложений для изображений Как я могу использовать jQuery-версию WordPress «async»? После изменения URL-адреса сайта на https невозможно получить доступ к странице входа в систему Перенаправление DNS без нарушения всего Добавить всплывающее окно на кнопки TinyMCE Сравнение Meta с датой (хранимой как строка) не работает Автоматическое изменение пароля страницы Как получить список только пользовательских таксономий? Как сбросить этот запрос wp_list_categories? Удостовериться, что записи отношений терминалов wp уникальны Сообщение 2 Сообщение: Как связаться с человеком? Как сделать запланированный просмотр сообщений видимым для всех? wp_handle_upload: получить настраиваемое значение флажка из медиа-загрузчика

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

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

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

Solutions Collecting From Web of "Как включить предложенные изменения?"

Разница в содержании, заголовке и авторе

Как и должно было сделать что-то, связанное несколько месяцев назад, вот самый простой и наиболее вероятный способ (я мог бы это сделать), чтобы проверить, есть ли какие-либо изменения в содержании или заголовке или если автор изменил:

// 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 в течение одного цикла почты, содержащего либо исходные данные, либо новые данные. Таким образом, я перешел к настройке всех других значений сообщений, которые мне не нужно было проверять на наличие изменений.

Предложение редактирования

Главный факт, который следует иметь в виду при поиске места, где копирование-редактирование постсоциального содержимого может быть (временно) сохранено, заключается в том, что контент является записью longtext db. Поэтому место, где нужно сохранить предлагаемое редактирование, должно соответствовать этому требованию. Комментарии делают это.

Тогда есть хороший факт, что они предлагают 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 , поэтому идентификация отредактированного идентификатора сообщений является прямой.

Итоговая записка

Я бы тоже хотел увидеть финальный плагин. Пожалуйста, ссылку сюда 🙂

Моя идея – это что-то простое.

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

  • Любые изменения в content будут сравниваться с original post content после отправки (как черновик) и CAPTCHA code с помощью алгоритмов Diff, таких как PHP inline-diff или Text-Diff PEAR Package, или, альтернативно, с использованием функции PHP в соответствии с этим для не слишком длинного тексты с комбинацией CSS.

  • Затем, сохраняя значения в 3 пользовательских мета-боксах (на этой странице добавления / редактирования на основе таксономии), которые показывают

    1. Исходное содержание
    2. Редактированная версия
    3. Пользовательский псевдоним и его электронная почта

    и сохранение Post ID возможно, с помощью функции update_option() для последующего использования.

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

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

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

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

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

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

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

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

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