Como ativar as edições sugeridas?

18

Eu gosto da ideia de permitir que qualquer usuário do meu site sugira edições em uma página. Muito parecido com o sistema de edição no Stack Exchange, mas diferente em que alguém deve ser capaz de editar, não apenas usuários registrados. Todas as edições passariam por um processo de aprovação.

Como eu poderia implementar isso?

    
por Patrick Klug 12.03.2013 / 12:52

3 respostas

11

Difere o conteúdo, o título e o autor da postagem

Como tive que fazer algo relacionado há alguns meses, aqui está a maneira mais fácil e mais futura de testar (que eu posso fazer bem) para verificar se houve alguma alteração no conteúdo ou no título ou se o autor mudou:

// 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 meu cenário rapidamente: eu estava buscando postagens de um local remoto por meio de uma API remota. Em seguida, retornei o global $post , durante um único loop de postagem, contendo os dados originais ou os novos dados. Dessa forma, movi-me para definir todos os outros valores de postagem que não precisei verificar as alterações.

Propondo a edição

O principal fato que se deve ter em mente ao procurar um lugar onde uma cópia-edição do conteúdo da postagem pode ser (temporariamente) salva é que o conteúdo é uma entrada db de longtext . Portanto, o local em que alguém deseja salvar a edição sugerida deve atender a esse requisito. Comentários fazem isso.

Depois, há o bom fato de que eles oferecem uma API para colocá-los em um loop, para que eles se integrem facilmente, sejam altamente personalizáveis e possam ser rapidamente configurados. Por último, mas não menos importante, a maioria dos temas já vem com os comentários integrados, por isso é fácil utilizar o sistema e ligar-se a praticamente qualquer tema disponível.

Eu sugeriria apenas (ou) estender ou alterar o formulário de comentários. Use o seguinte ou adicione campos adicionais com um retorno de chamada conectado 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
}

Então, adicionei um campo hidden para comment_approved com um valor de 0 para defini-lo na fila. Não tenho certeza se isso funcionará ou se esse valor (principal) é realmente metadados de comentários e precisa ser adicionado usando add_comment_meta() durante o salvamento. Se não, você poderia usar algo ao longo das seguintes linhas 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 );
}

Exibindo os comentários no lado do administrador

Aqui eu usaria uma extensão de classe simples e uma página de administração 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
}

Mais informações podem ser encontradas no WPEngineer .

Aprovar edições

Você pode adicionar ações personalizadas e processar as edições propostas usando o primeiro código que mostrei para verificar se houve uma alteração e, em seguida, simplesmente atualize a postagem. O comentário em si contém um valor com uma chave de comment_post_ID , por isso, a identificação do ID das postagens editadas é direta.

Nota final

Também gostaria de ver o plug-in final. Por favor, ligue aqui:)

    
por kaiser 07.05.2013 / 17:03
8

Minha ideia é algo simples.

  • Você pode criar um link Edit Suggestion na parte inferior das postagens que tem um modelo personalizado, usando uma caixa de texto (talvez com um editor) vinculada a uma taxonomia personalizada com o valor padrão post content .

  • Quaisquer alterações em content serão comparadas a original post content após o envio (como rascunho) e a inserção de CAPTCHA code com algoritmos Diff como PHP inline-diff pacote ou Text-Diff Pacote PEAR ou alternativamente usando uma função PHP de acordo com isto para textos não muito longos com combinação de CSS.

  • Em seguida, salve os valores em três Meta Boxes personalizadas (na página de adição / edição de back-end de taxonomia) que mostram

    1. Conteúdo original
    2. Versão editada
    3. Apelido do usuário e seu e-mail

    e salvando Post ID talvez com uma função update_option() para uso posterior.

  • Depois de ler a versão editada e a aceitação por admin, essa postagem será substituída pela original, conforme você codificou em functions.php.

por revo 15.03.2013 / 10:56
4

Bem, isso é bastante complicado, uma resposta adequada levaria um tempo considerável para escrever. Então esta não é uma resposta real apenas alguns pensamentos ..

O uso do WordPress em wp_update_post via ajax fornecerá o histórico de revisão necessário, mas não o recurso necessário para aprovar as edições.

A criação de rascunhos a partir de edições não é possível por padrão, mas foi discutida aqui, Existe alguma maneira de redigir uma revisão de uma página publicada ou postar? Quais soluções alternativas você usou?

Você pode tentar usar Editor de front-end , mas não terá controle sobre edições. publicado, então tente misturá-lo com outro plugin como o Revisionary que permite edições baseadas em permissões, não tenho ideia se eles vão trabalhar juntos.

Se eles não o fizerem, você terá que hackear um plugin baseado nos 2 plugins acima ou escrever algo do zero.

Minha abordagem inicial seria ter um botão que vá para outra página que produza o conteúdo / dados da postagem usando JSON , que é mais fácil de usar ao usar Ajax e editores WYSIWYG. O botão salvar seria postado como rascunho em vez de publicar e, dessa forma, você teria controle sobre as edições (veja acima a discussão da WPSE sobre como fazer isso, é bastante assustador).

Há complicações adicionais ao fazer isso, como sanitização, codificação, spam, manuseio de mídia, campos personalizados, timestamps, memória etc. A boa notícia é que o wordpress já tem um sistema de revisão que você pode conectar e uma capacidade decente de lidar com vários editores.

ps. Essa é uma boa ideia para um plugin.

    
por Wyck 02.05.2013 / 01:13