Difunde el contenido de la publicación, el título y el autor
Como tenía que hacer algo relacionado hace un mes, esta es la forma más fácil y más a prueba de futuro (que podría multar) para verificar si hay un cambio realizado en el contenido o el título o si el autor cambió:
// 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'];
Para explicar brevemente mi escenario: estaba buscando publicaciones desde una ubicación remota a través de una API remota. Luego devolví el global $post
, durante un ciclo de publicación único, que contiene los datos originales o los nuevos datos. De esta manera, me moví estableciendo todos los demás valores de publicación que no necesitaba para verificar los cambios.
Proponiendo la edición
El hecho principal que hay que tener en cuenta al buscar un lugar donde se pueda guardar (temporalmente) una copia-edición del contenido de la publicación es que el contenido es una entrada de db longtext
. Por lo tanto, el lugar donde se desea guardar la edición sugerida debe cumplir ese requisito. Los comentarios hacen eso.
Luego está el hecho de que ofrecen una API para ubicarlos en un bucle, por lo que se integra sin problemas, es altamente personalizable y se puede configurar rápidamente. Por último, pero no menos importante, la mayoría de los temas ya vienen con comentarios integrados, por lo que es fácil aprovechar el sistema y conectarse a casi cualquier tema disponible.
Sugeriría simplemente (o) extender o alterar el formulario de comentarios. Utilice lo siguiente o agregue campos adicionales con una devolución de llamada conectada 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
}
Así que agregué un hidden
campo comment_approved
con el valor de 0
establecerlo en la cola. No estoy seguro de si esto funcionará o si este valor (principal) es realmente comentar metadatos y necesita agregarse mediante el uso add_comment_meta()
durante el guardado. De lo contrario, podría usar algo a lo largo de las siguientes líneas de código
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 );
}
Mostrar los comentarios en el lado del administrador
Aquí iría con una extensión de clase simple y una página de administración personalizada:
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
}
Se puede encontrar más información en WPEngineer .
Aprobar ediciones
Luego, puede agregar acciones personalizadas y procesar las ediciones propuestas utilizando el primer código que mostré para verificar si hubo un cambio y luego simplemente actualizar la publicación. El comentario en sí tiene un valor con una clave de comment_post_ID
, por lo que identificar el ID de las publicaciones editadas es sencillo.
Nota final
Me gustaría ver el complemento final también. Por favor vincúlelo aquí :)