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 hidden
campo para comment_approved
com um valor de 0
para 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 :)