Difunde el contenido de la publicación, el título y el autor
Como tenía que hacer algo relacionado hace un mes, aquí está la manera más fácil y más futura de probar (que podría encontrar una multa) para comprobar si se realizó algún cambio 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 situación: estaba buscando publicaciones desde una ubicación remota a través de una API remota. Luego devolví el global $post
, durante un solo bucle de publicación, que contenía los datos originales o los nuevos datos. De esta manera, me moví alrededor de la configuración de todos los demás valores de publicación que no necesitaba revisar para los cambios.
Proponiendo la edición
El hecho principal que se debe 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 de longtext
. Por lo tanto, el lugar donde se quiere 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 combinar el sistema y engancharse en casi cualquier tema disponible.
Yo sugeriría simplemente (cualquiera) extender o alterar el formulario de comentarios. Use lo siguiente o agregue campos adicionales con una devolución de llamada enganchada a 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 campo hidden
para comment_approved
con un valor de 0
para configurarlo en la cola. No estoy seguro de si esto funcionará o si este valor (principal) es en realidad metadatos de comentarios y debe agregarse usando add_comment_meta()
durante el guardado. Si no, puede usar algo junto en 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 );
}
Mostrando 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 .
Aprobando ediciones
Luego, puede agregar acciones personalizadas y procesar las ediciones propuestas utilizando el primer código que mostré para verificar si hubo algún cambio y luego 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
También me gustaría ver el complemento final. Por favor enlázalo aquí :)