Различают содержание сообщения, название и автора
Как и в случае с чем-то, что было сделано несколько месяцев назад, вот самый простой и наиболее надежный способ будущего (который я мог бы применить), чтобы проверить, были ли внесены изменения в контент или заголовок или изменился автор:
// 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
, так что идентифицировать отредактированный идентификатор сообщения просто.
Конечная нота
Я бы тоже хотел увидеть финальный плагин. Пожалуйста, свяжите это здесь :)