Diff le contenu du post, le titre et l'auteur
Comme je devais faire quelque chose de connexe il y a un mois, voici le moyen le plus simple et le plus à l'épreuve du temps (que je pourrais bien) pour vérifier s'il y a eu une modification du contenu ou du titre ou si l'auteur a changé:
// 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'];
Pour expliquer brièvement mon scénario: je récupérais des publications à distance via une API distante. Ensuite, je suis retourné leglobal $post
, au cours d'une seule boucle de publication, contenant soit les données d'origine, soit les nouvelles données. De cette façon, je me suis déplacé en définissant toutes les autres valeurs de publication dont je n'avais pas besoin pour vérifier les modifications.
Proposer la modification
Le fait principal que l'on doit garder à l'esprit lors de la recherche d'un endroit où une copie-édition du contenu de la publication pourrait être (temporairement) enregistrée est que le contenu est une entrée db de longtext
. L'endroit où l'on souhaite enregistrer la modification suggérée doit donc répondre à cette exigence. Les commentaires font ça.
Ensuite, il y a le fait qu'ils offrent une API pour les placer bien dans une boucle, de sorte qu'il s'intègre facilement, est hautement personnalisable et peut être rapidement configuré. Enfin, la plupart des thèmes sont déjà livrés avec des commentaires intégrés, il est donc facile de se superposer au système et de se connecter à presque tous les thèmes disponibles.
Je suggère de simplement (soit) étendre ou modifier le formulaire de commentaire. Utilisez les éléments suivants ou ajoutez des champs supplémentaires avec un rappel accroché à 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
}
J'ai donc ajouté un hidden
champ pour comment_approved
avec une valeur de 0
pour le mettre dans la file d'attente. Je ne sais pas si cela fonctionnera ou si cette valeur (principale) est en fait des métadonnées de commentaire et doit être ajoutée en utilisant add_comment_meta()
lors de l'enregistrement. Sinon, vous pouvez utiliser quelque chose le long des lignes de code suivantes
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 );
}
Affichage des commentaires du côté administrateur
Ici, j'irais avec une extension de classe simple et une page d'administration personnalisée:
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
}
Plus d'informations peuvent être trouvées sur WPEngineer .
Approuver les modifications
Vous pouvez ensuite ajouter des actions personnalisées et traiter les modifications proposées à l'aide du premier code que j'ai montré pour vérifier s'il y a eu un changement, puis simplement mettre à jour la publication. Le commentaire lui-même contient une valeur avec une clé de comment_post_ID
, donc l'identification de l'ID des articles modifiés est simple.
Note finale
J'aimerais également voir le plugin final. Veuillez le lier ici :)