Como ativar as edições sugeridas?

19

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 porque qualquer pessoa deve poder editar, não apenas usuários registrados. Todas as edições passariam por um processo de aprovação.

Como eu poderia implementar isso?

Patrick Klug
fonte
1
Não sei como fazê-lo, mas acho que isso pode ser realmente problemático. Eu acho que você receberá muito spam.
Martin Thoma 13/03
3
Você tem certeza de que precisa de uma instalação do WordPress para o seu site? A funcionalidade que você deseja soa muito como uma instalação do MediaWiki . Você deve ponderar os prós e os contras de ambas as instalações. O MediaWiki é uma boa alternativa.
Marc Dingena
Eu estava pulando com essa idéia há um tempo. O mais próximo de uma solução disponível foi este plugin: wordpress.org/support/plugin/post-forking No entanto, está em estágios muito iniciais. O plugin é restrito a usuários registrados.
Christine Cooper
Estamos trabalhando para algo assim. Previmos a edição no estilo Wikipedia para posts, juntamente com um widget "Histórico": github.com/publishpress/Revisionary/issues/13 Ainda não chegamos lá, mas quase toda a estrutura está em vigor.
steveburge 20/09

Respostas:

11

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

Como tive que fazer algo relacionado há um mês, aqui está a maneira mais fácil e mais futura de provar (que eu poderia multar) para verificar se há uma alteração feita no conteúdo ou 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 brevemente meu cenário: eu estava buscando postagens de um local remoto por meio de uma API remota. Depois, retornei o global $post, durante um único ciclo de postagem, contendo os dados originais ou os novos dados. Dessa maneira, mudei para definir todos os outros valores de postagem que não precisavam verificar alterações.

Propor a edição

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

Depois, há o fato agradável de que eles oferecem uma API para colocá-los perfeitamente em um loop, para que se integre sem problemas, seja altamente personalizável e possa ser configurada rapidamente. Por último, mas não menos importante, a maioria dos temas já vem com comentários integrados, por isso é fácil pegar carona no sistema e conectar-se a praticamente qualquer tema disponível.

Sugiro apenas estender ou alterar o formulário de comentários. Use o seguinte ou adicione campos adicionais com um retorno de chamada conectado 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, eu adicionei um hiddencampo para comment_approvedcom um valor de 0para defini-lo na fila. Não tenho certeza se isso vai funcionar ou se esse valor (principal) é realmente comentar metadados e precisa ser adicionado usando add_comment_meta()durante o salvamento. Caso contrário, você pode 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 iria com uma extensão de classe simples e uma página de administrador 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 .

Aprovando 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 simplesmente atualizar a postagem. O próprio comentário contém um valor com uma chave de comment_post_ID, portanto, identificar o ID das postagens editadas é direto.

Nota final

Eu gostaria de ver o plugin final também. Por favor, vincule-o aqui :)

kaiser
fonte
1
Dou a recompensa a esta pergunta para a idéia de usar a meta de comentário para armazenar a edição sugerida e wp_text_diff()a comparação real. Votos positivos para as outras respostas.
fuxia
8

Minha ideia é algo simples.

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

  • Quaisquer alterações contentserão comparadas original post contentapós o envio (como Rascunho) e a Entrada CAPTCHA codecom Diff, como o pacote PHP inline-diff ou o Pacote Text-Diff PEAR ou, alternativamente, o uso de uma função PHP de acordo com isso para textos não muito longos com combinação de CSS.

  • Em seguida, salvando os valores em três meta boxes personalizados (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 email

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

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

revo
fonte
Algumas notas: (A) "como você codificou em functions.php" - não concordo com este. Este é o material do plugin. (B) "vinculado a uma taxonomia customizada com o valor padrão do conteúdo da postagem" - Um termo / taxon de taxonomia possui apenas um valor possível em que o conteúdo caberia em qualquer caso: A descrição. E então você precisaria de um local para armazenar o ID da postagem. Onde isso seria? Como não há lugar para isso devido aos limites do sistema tributário dos WPs, você só pode salvar o termo ID. Então este é um sistema unidirecional (limitado): Post> Data term.
Kaiser #
4

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

Usando o WordPress construído wp_update_postvia ajax forneceria o histórico de revisões necessário, mas não a capacidade necessária para aprovar edições.

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

Você pode tentar usar o Front-end Editor, mas não terá controle sobre as edições publicadas, então tente mash-lo com outro plug-in como o Revisionary. que permite edições baseadas em permissões, não tenho idéia se elas funcionarão juntas.

Caso contrário, você precisará hackear um plug-in com base nos 2 plug-ins 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 , mais fácil de trabalhar ao usar os editores Ajax e WYSIWYG. O botão salvar seria publicado como rascunho em vez de publicado e, dessa forma, você teria controle sobre as edições (veja a discussão acima da WPSE sobre como fazer isso, é bastante assustador).

Existem complicações adicionais ao fazer isso, como higienização, codificação, spam, manipulação de mídia, campos personalizados, carimbos de data e hora, memória, etc. A boa notícia é que o wordpress já possui um sistema de revisão ao qual você pode se conectar e uma capacidade decente de lidar com vários editores .

ps. Esta é uma boa ideia para um plugin.

Wyck
fonte