¿Cómo habilitar las ediciones sugeridas?

18

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 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?

    
pregunta Patrick Klug 12.03.2013 - 12:52

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

    
respondido por el kaiser 07.05.2013 - 17:03
8

Mi idea es algo simple.

  • Puede crear un enlace Edit Suggestion en la parte inferior de las publicaciones que tiene una plantilla personalizada, en ese caso, 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 en content se comparará con original post content después de enviar (como borrador) e ingresar CAPTCHA code con algoritmos Diff como PHP inline-diff paquete o Text-Diff PEAR Package o alternativamente usando una función PHP según this para textos no muy largos con una combinación de CSS.

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

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

    y guardar Post ID tal vez con una función update_option() 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 como se codificó en functions.php.

respondido por el revo 15.03.2013 - 10:56
4

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

El uso de WordPress en wp_update_post a través de ajax le brindará el historial de revisión 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 tratado aquí, ¿Hay alguna forma de redactar una revisión de una página o publicación publicada? ¿Qué soluciones has utilizado?

Puede probar y usar Editor de front-end pero no tendrá control sobre las ediciones. publicado, así que intente combinarlo con otro complemento como Revisionary que permite realizar ediciones basadas en permisos, no tengo idea si van a trabajar juntos.

Si no lo hacen, tendrás 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 , con el que es más fácil trabajar cuando se usa Ajax y editores WYSIWYG. El botón Guardar se publicaría como un borrador en lugar de publicarse 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).

Al hacer esto, existen complicaciones adicionales, como el saneamiento, la codificación, el correo no deseado, el manejo de medios, los campos personalizados, las marcas de tiempo, la memoria, etc. La buena noticia es que WordPress ya tiene un sistema de revisión que se puede conectar y una capacidad decente para manejar varios editores.

ps. Esta es una buena idea para un complemento.

    
respondido por el Wyck 02.05.2013 - 01:13

Lea otras preguntas en las etiquetas