Cómo habilitar ediciones sugeridas

12 mar 2013, 13:52:38
Vistas: 2.06K
Votos: 21

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?

4
Comentarios

No sé cómo hacerlo, pero creo que esto podría ser realmente problemático. Creo que recibirás mucho spam.

Martin Thoma Martin Thoma
13 mar 2013 20:39:52

¿Estás seguro de que necesitas una instalación de WordPress para tu sitio web? La funcionalidad que deseas suena mucho a una instalación de MediaWiki. Deberías sopesar los pros y los contras de ambas instalaciones. MediaWiki es una buena alternativa.

Marc Dingena Marc Dingena
15 mar 2013 11:59:15

Estuve dando vueltas con esta idea hace un tiempo. Lo más cercano a una solución disponible era este plugin: http://wordpress.org/support/plugin/post-forking Sin embargo, está en etapas muy tempranas. El plugin está restringido a usuarios registrados.

Christine Cooper Christine Cooper
5 may 2013 03:10:49

Hemos estado trabajando hacia algo como esto. Habíamos imaginado una edición al estilo Wikipedia para las publicaciones, junto con un widget "Historial": https://github.com/publishpress/Revisionary/issues/13 Todavía no hemos llegado ahí, pero casi toda la estructura está en su lugar.

steveburge steveburge
20 sept 2019 18:59:53
Todas las respuestas a la pregunta 3
1
11

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í :)

7 may 2013 18:03:26
Comentarios

Asigno la recompensa a esta pregunta por la idea de usar meta de comentarios para almacenar la edición sugerida y wp_text_diff() para la comparación real. Votos positivos para las otras respuestas.

fuxia fuxia
8 may 2013 22:26:53
1

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 de contenido de la publicación.

  • Cualquier cambio en el contenido se comparará con el contenido original de la publicación después de enviarlo (como Borrador) e ingresar el có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

    1. Contenido Original
    2. Versión Editada
    3. Apodo del Usuario y su Correo Electrónico

    y guardar el ID de la Publicación quizás con una función update_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.

15 mar 2013 11:56:57
Comentarios

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.

kaiser kaiser
9 may 2013 18:05:03
0

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.

2 may 2013 02:13:51