Cómo habilitar ediciones sugeridas
Me gusta la idea de permitir que cualquier usuario de mi sitio web pueda sugerir ediciones a una página. Similar al sistema de edición de Stack Exchange pero con la diferencia de que cualquiera pueda editar, no solo usuarios registrados. Todas las ediciones pasarían por un proceso de aprobación.
¿Cómo podría implementar eso?

Comparar el contenido, título y autor del post
Como tuve que hacer algo relacionado hace unos meses, aquí está la forma más fácil y a prueba de futuro (que pude encontrar) para verificar si hay un cambio en el contenido o título o si el autor cambió:
// Actualizar Título
'' !== wp_text_diff(
$el['post_title'],
$GLOBALS['post']->post_title
)
AND $GLOBALS['post']->post_title = $el['post_title'];
// Actualizar Contenido
'' !== wp_text_diff(
$el['post_content'],
$GLOBALS['post']->post_content
)
AND $GLOBALS['post']->post_content = $el['post_content'];
// Actualizar autor
$GLOBALS['post']->post_author !== $el['post_author']
AND $GLOBALS['post']->post_author = $el['post_author'];
Para explicar brevemente mi escenario: estaba obteniendo posts desde una ubicación remota a través de una API remota. Luego devolvía el global $post
, durante un bucle de post único, que contenía los datos originales o los nuevos. De esta manera, manejé todos los demás valores del post que no necesitaba verificar por 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 de edición del contenido del post es que el contenido es una entrada de base de datos de tipo longtext
. Por lo tanto, el lugar donde se quiere guardar la edición propuesta debe cumplir ese requisito. Los comentarios lo hacen.
Luego está el hecho agradable de que ofrecen una API para colocarlos perfectamente 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 engancharse a casi cualquier tema disponible.
Sugeriría simplemente (ya sea) extender o alterar el formulario de comentarios. Usa lo siguiente o agrega campos adicionales con un callback enganchado a comment_form_default_fields
.
<?php
// Agregarlo para usuarios registrados e invitados:
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( 'Proponer Edición', '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 he agregado un campo hidden
para comment_approved
con un valor de 0
para colocarlo en la cola. No estoy seguro si esto funcionará o si este valor (del núcleo) es en realidad metadatos del comentario y necesita agregarse usando add_comment_meta()
durante el guardado. Si no, podrías usar algo similar a 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 )
{
// Podrías necesitar inspeccionar $commentdata
// para determinar aprobación, desaprobación o estado de spam
if ( ! empty( $commentdata['wpse_propsed_edit'] ) )
{
# Ahora agrega un filtro a la acción de publicación de comentarios, así guardamos una entrada de meta
add_action( 'comment_post', 'wpse_set_proposed_edit' );
return 0;
}
return 1;
}
// Esta función facilita identificar los comentarios por su valor meta
function wpse_set_proposed_edit( $comment_id );
{
// Solo ejecutar una vez
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 simple extensión de clase y una página personalizada de administración:
function wpse_add_proposed_edits_admin_page()
{
add_menu_page(
'Ediciones Propuestas',
'Ediciones Sugeridas',
'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
{
// Sobrescribe la lógica predeterminada de la tabla de listado aquí
}
Más información se puede encontrar en WPEngineer.
Aprobando ediciones
Podrías agregar acciones personalizadas y procesar las ediciones propuestas usando el primer código que mostré para verificar si hubo un cambio y luego simplemente actualizar el post. El comentario en sí tiene un valor con una clave de comment_post_ID
, por lo que identificar el ID del post editado es directo.
Nota final
Me gustaría ver el plugin final también. Por favor, enlázalo aquí :)

Mi idea es algo sencillo.
Puedes crear un enlace de
Sugerencia de Edición
al final de las publicaciones que tenga una plantilla personalizada, donde uses un cuadro de texto (quizás con un editor) que esté vinculado a una taxonomía personalizada con el valor predeterminado decontenido de la publicación
.Cualquier cambio en el
contenido
se comparará con elcontenido original de la publicación
después de enviarlo (como Borrador) e ingresar elcódigo CAPTCHA
con algoritmos de diferencias como el paquete PHP inline-diff o el paquete PEAR Text-Diff o alternativamente usando una función PHP según esto para textos no demasiado largos combinado con CSS.Luego, al guardar los valores en 3 Meta Boxes personalizados (en la página de agregar/editar de esa taxonomía en el backend) que muestren
- Contenido Original
- Versión Editada
- Apodo del Usuario y su Correo Electrónico
y guardar el
ID de la Publicación
quizás con una funciónupdate_option()
para uso posterior.Después de leer la versión editada y su aceptación por parte del administrador, esa publicación reemplazará a la original como hayas codificado en functions.php.

Algunas notas: (A) "como has codificado en functions.php" - no estoy de acuerdo con esto. Esto es material de plugin. (B) "vinculado a una taxonomía personalizada con el valor por defecto del contenido del post" - Un término/taxón de taxonomía solo tiene un valor posible donde el contenido encajaría en cualquier caso: La descripción. Y luego necesitarías un lugar para almacenar el ID del post. ¿Dónde estaría esto? Como no hay lugar para esto debido a los límites del sistema de taxonomías de WP, solo podrías guardar el ID del término. Entonces esto sería un sistema (limitado) de una sola dirección: Post > Datos del término.

Bueno, esto es bastante complicado, una respuesta adecuada tomaría bastante tiempo para escribir. Así que esto no es una respuesta real, solo algunas reflexiones...
Usar la función incorporada de WordPress wp_update_post
a través de ajax te daría el historial de revisiones necesario pero no la capacidad requerida para aprobar ediciones.
Crear borradores a partir de ediciones no es posible por defecto pero se ha discutido aquí, ¿Hay alguna manera de crear un borrador de una revisión de una página o entrada publicada? ¿Qué soluciones alternativas has usado?
Puedes intentar usar Front-end Editor pero no tendrás control sobre las ediciones que se publiquen, así que trata de combinarlo con otro plugin como Revisionary que sí permite ediciones basadas en permisos, no tengo idea si funcionarán juntos.
Si no funcionan, tendrás que modificar un plugin basado en los 2 plugins anteriores o escribir algo desde cero.
Mi enfoque desde cero sería tener un botón que vaya a otra página que muestre el contenido/datos de la entrada usando JSON, que es más fácil de trabajar cuando usas Ajax y editores WYSIWYG. El botón de guardado publicaría como borrador en lugar de publicar directamente y de esa manera tendrías control sobre las ediciones (ver la discusión de WPSE mencionada sobre cómo lograr esto, es bastante desalentador).
Hay complicaciones adicionales al hacer esto como saneamiento, codificación, spam, manejo de medios, campos personalizados, marcas de tiempo, memoria, etc. La buena noticia es que WordPress ya tiene un sistema de revisiones al que puedes conectarte y una capacidad decente para manejar múltiples editores.
PD: Esta es una buena idea para un plugin.
