¿Cómo habilitar las ediciones sugeridas?

19

Me gusta la idea de permitir que cualquier usuario de mi sitio web sugiera modificaciones en una página. Al igual que el sistema de edición en Stack Exchange, pero diferente en el sentido de que cualquiera debería poder editar, no solo los usuarios registrados. Todas las ediciones pasarían por un proceso de aprobación.

¿Cómo podría implementar eso?

Patrick Klug
fuente
1
No sé cómo hacerlo, pero creo que esto podría ser realmente problemático. Creo que recibirás mucho spam.
Martin Thoma
3
¿Estás seguro de que necesitas una instalación de WordPress para tu sitio web? La funcionalidad que deseas se parece mucho a una instalación de MediaWiki . Debe sopesar los pros y los contras de ambas instalaciones. MediaWiki es una buena alternativa.
Marc Dingena
Estaba rebotando con esta idea hace un tiempo. El más cercano a una solución disponible fue este complemento: wordpress.org/support/plugin/post-forking Sin embargo, se encuentra en etapas muy tempranas. El complemento está restringido a usuarios registrados.
Christine Cooper
Hemos estado trabajando para algo como esto. Habíamos previsto la edición al estilo de Wikipedia para publicaciones, junto con un widget de "Historia": github.com/publishpress/Revisionary/issues/13 Todavía no hemos llegado, pero casi toda la estructura está en su lugar.
steveburge

Respuestas:

11

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 hiddencampo comment_approvedcon el valor de 0establecerlo 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í :)

emperador
fuente
1
Doy la recompensa a esta pregunta por la idea de usar el meta comentario para almacenar la edición sugerida y wp_text_diff()para la comparación real. Votos a favor de las otras respuestas.
fuxia
8

Mi idea es algo simple.

  • Puede hacer un Edit Suggestionenlace en la parte inferior de las publicaciones que tenga una plantilla definida personalizada, en la que use un cuadro de texto (tal vez con un editor) que esté vinculado a una taxonomía personalizada con el valor predeterminado de post content.

  • Cualquier cambio a contentse comparará con original post contentdespués de enviar (como Borrador) e ingresar CAPTCHA codecon algoritmos Diff como el paquete PHP inline-diff o el paquete Text-Diff PEAR o, alternativamente, usar una función PHP de acuerdo con esto para textos no demasiado largos con combinación de CSS.

  • Luego, guardando los valores en 3 Meta Boxes personalizados (en la página de agregar / editar back-end de esa taxonomía) que muestran

    1. Contenido original
    2. Versión editada
    3. Apodo del usuario y su correo electrónico

    y guardar Post IDtal vez con una update_option()función para su uso posterior.

  • Después de leer la versión editada y la aceptación por parte del administrador, esa publicación será reemplazada por la original a medida que codificó en functions.php.

revo
fuente
Algunas notas: (A) "como codificó en functions.php" - no está de acuerdo con este. Este es material de complemento. (B) "vinculado a una taxonomía personalizada con el valor predeterminado del contenido publicado" : un término / taxón de taxonomía solo tiene un valor posible en el que el contenido cabría en cualquier caso: la descripción. Y luego necesitarías un lugar para almacenar la identificación de la publicación. ¿Dónde sería esto? Como no hay lugar para esto debido a los límites del sistema de impuestos WP, solo puede guardar el ID de término. Entonces este es un sistema unidireccional (limitado) solo: Publicar> Datos de término.
Kaiser
4

Bueno, esto es bastante complicado, una respuesta adecuada tomaría un tiempo considerable para escribir. Así que esta no es una respuesta real, solo algunos pensamientos ...

El uso de WordPress integrado a wp_update_posttravés de ajax le daría el historial de revisiones necesario, pero no la capacidad necesaria para aprobar las ediciones.

La creación de borradores a partir de ediciones no es posible de forma predeterminada, pero se ha discutido aquí. ¿Hay alguna forma de redactar una revisión de una página o publicación publicada? ¿Qué soluciones alternativas has usado?

Puede intentar usar el Editor frontal, pero no tendrá control sobre las ediciones que se publiquen, así que intente mezclarlo con otro complemento como Revisionary que permita ediciones basadas en permisos, no tengo idea de si funcionarán juntas.

Si no lo hacen, tendrá que hackear un complemento basado en los 2 complementos 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 publicación usando JSON , que es más fácil de usar cuando se usan editores Ajax y WYSIWYG. El botón Guardar se publicaría como un borrador en lugar de publicar y de esa manera usted tendría control sobre las ediciones (vea la discusión anterior de WPSE sobre cómo lograr esto, es bastante desalentador).

Hay complicaciones adicionales al hacer esto, como desinfección, codificación, spam, manejo de medios, campos personalizados, marcas de tiempo, memoria, etc. La buena noticia es que WordPress ya tiene un sistema de revisión al que puede conectarse y una capacidad decente para manejar múltiples editores. .

PD. Esta es una buena idea para un complemento.

Wyck
fuente