Diffondi il contenuto, il titolo e l'autore del post
Come abbiamo dovuto fare qualcosa in relazione qualche mese fa, ecco il modo più semplice e più a prova di futuro (che potrei fare bene) per verificare se c'è una modifica apportata al contenuto o al titolo o se l'autore è cambiato:
// 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'];
Per spiegare brevemente il mio scenario: stavo recuperando post da una posizione remota tramite un'API remota. Quindi ho restituito il global $post
, durante un singolo ciclo di post, contenente i dati originali o i nuovi dati. In questo modo mi sono spostato impostando tutti gli altri valori dei post che non avevo bisogno di verificare le modifiche.
Proponendo la modifica
Il fatto principale da tenere a mente quando si cerca un luogo in cui una copia del contenuto del post potrebbe essere (temporaneamente) salvato è che il contenuto è una voce db di longtext
. Quindi il luogo in cui si desidera salvare la modifica suggerita dovrebbe soddisfare tale requisito. I commenti lo fanno.
Poi c'è il bello fatto che offrono un'API per inserirli in un ciclo, quindi si integra senza problemi, è altamente personalizzabile e può essere rapidamente configurato. Ultimo ma non meno importante, la maggior parte dei temi include già commenti integrati, quindi è facile spostarsi sulle spalle del sistema e agganciarsi a quasi tutti i temi disponibili.
Suggerirei di estendere o modificare il modulo di commento. Utilizzare i seguenti o aggiungere campi aggiuntivi con un callback agganciato 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
}
Quindi ho aggiunto un hidden
campo per comment_approved
con un valore di 0
per impostarlo in coda. Non sono sicuro che funzionerà o se questo valore (core) è in realtà un commento sui metadati e deve essere aggiunto utilizzando add_comment_meta()
durante il salvataggio. Altrimenti, potresti usare qualcosa lungo le seguenti righe di codice
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 );
}
Visualizzazione dei commenti sul lato amministratore
Qui andrei con una semplice estensione di classe e una pagina di amministrazione personalizzata:
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
}
Ulteriori informazioni sono disponibili su WPEngineer .
Approvazione delle modifiche
È quindi possibile aggiungere azioni personalizzate ed elaborare le modifiche proposte utilizzando il primo codice che ho mostrato per verificare la presenza di una modifica e quindi semplicemente aggiornare il post. Il commento stesso contiene un valore con una chiave di comment_post_ID
, quindi l'identificazione dell'ID dei post modificati è semplice.
Nota finale
Mi piacerebbe vedere anche il plugin finale. Collegalo qui :)