Come abilitare le modifiche suggerite?
Mi piace l'idea di permettere a qualsiasi utente del mio sito web di suggerire modifiche a una pagina. Simile al sistema di modifica di Stack Exchange, ma con la differenza che chiunque dovrebbe poter modificare, non solo gli utenti registrati. Tutte le modifiche passerebbero attraverso un processo di approvazione.
Come potrei implementarlo?

Confronta il contenuto, il titolo e l'autore del post
Avendo dovuto affrontare una situazione simile alcuni mesi fa, ecco il modo più semplice e duraturo (che ho trovato) per verificare se ci sono state modifiche al contenuto, al titolo o all'autore:
// Aggiorna Titolo
'' !== wp_text_diff(
$el['post_title'],
$GLOBALS['post']->post_title
)
AND $GLOBALS['post']->post_title = $el['post_title'];
// Aggiorna Contenuto
'' !== wp_text_diff(
$el['post_content'],
$GLOBALS['post']->post_content
)
AND $GLOBALS['post']->post_content = $el['post_content'];
// Aggiorna autore
$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. Poi restituivo il global $post
, durante un loop di singolo post, contenente i dati originali o i nuovi dati. In questo modo ho gestito l'impostazione di tutti gli altri valori del post che non dovevo verificare per cambiamenti.
Proporre la modifica
Il fatto principale da tenere a mente quando si cerca un luogo dove salvare (temporaneamente) una modifica proposta del contenuto del post è che il contenuto è un'entrata del database di tipo longtext
. Quindi il luogo dove si vuole salvare la modifica proposta dovrebbe soddisfare questo requisito. I commenti lo fanno.
Poi c'è il bel fatto che offrono un'API per posizionarli comodamente in un loop, quindi si integrano facilmente, sono altamente personalizzabili e possono essere configurati rapidamente. Ultimo ma non meno importante, la maggior parte dei temi ha già i commenti integrati, quindi è facile sfruttare il sistema e agganciarsi a quasi qualsiasi tema disponibile.
Suggerirei di estendere o modificare il modulo dei commenti. Usa il seguente codice o aggiungi campi aggiuntivi con un callback agganciato a comment_form_default_fields
.
<?php
// Aggiungilo per utenti loggati e ospiti:
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( 'Proponi Modifica', '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
}
Ho aggiunto un campo hidden
per comment_approved
con un valore di 0
per metterlo in coda. Non sono sicuro se funzionerà o se questo valore (del core) è in realtà un meta dato del commento e deve essere aggiunto usando add_comment_meta()
durante il salvataggio. Altrimenti, potresti usare qualcosa simile alle seguenti righe di codice:
add_filter( 'pre_comment_approved' , 'wpse_pre_suggest_edit', 100, 2 );
function wpse_pre_suggest_edit( $approved , $commentdata )
{
// Potresti dover ispezionare $commentdata
// per determinare approvazione, disapprovazione o stato spam
if ( ! empty( $commentdata['wpse_propsed_edit'] ) )
{
# Ora aggiungi un filtro all'azione di pubblicazione del commento, così salviamo un meta dato
add_action( 'comment_post', 'wpse_set_proposed_edit' );
return 0;
}
return 1;
}
// Questa funzione rende più facile identificare i commenti dal loro meta valore
function wpse_set_proposed_edit( $comment_id );
{
// Esegui solo una volta
remove_filter( current_filter(), __FUNCTION__ );
add_comment_meta( $comment_id, 'proposed_edit', true, true );
}
Mostrare i commenti nell'area di amministrazione
Qui opterei per una semplice estensione di classe e una pagina personalizzata di amministrazione:
function wpse_add_proposed_edits_admin_page()
{
add_menu_page(
'Modifiche Proposte',
'Modifiche Suggerite',
'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
{
// Sovrascrivi la logica predefinita della tabella qui
}
Maggiori informazioni possono essere trovate su WPEngineer.
Approvare le modifiche
Potresti poi aggiungere azioni personalizzate e processare le modifiche proposte usando il primo codice che ho mostrato per verificare se c'è stato un cambiamento e poi semplicemente aggiornare il post. Il commento stesso contiene un valore con una chiave comment_post_ID
, quindi identificare l'ID del post modificato è semplice.
Nota finale
Mi piacerebbe vedere anche il plugin finale. Per favore, linkalo qui :)

La mia idea è qualcosa di semplice.
Puoi creare un link
Suggerisci Modifica
in fondo agli articoli che ha un template personalizzato, dove utilizzare una casella di testo (magari con un editor) collegata a una tassonomia personalizzata con il valore predefinito delcontenuto dell'articolo
.Qualsiasi modifica al
contenuto
verrà confrontata con ilcontenuto originale dell'articolo
dopo l'invio (come Bozza) e l'inserimento delcodice CAPTCHA
con algoritmi di Diff come il pacchetto PHP inline-diff oppure Text-Diff di PEAR o in alternativa utilizzando una funzione PHP secondo questo per testi non troppo lunghi, combinato con CSS.Poi salvando i valori in 3 Meta Box personalizzati (nella pagina di aggiunta/modifica della tassonomia nel backend) che mostrano
- Contenuto Originale
- Versione Modificata
- Nickname dell'utente e la sua Email
e salvando l'
ID dell'articolo
magari con una funzioneupdate_option()
per un uso successivo.Dopo aver letto la versione modificata e l'accettazione da parte dell'amministratore, quell'articolo sostituirà quello originale come hai codificato in functions.php.

Alcune note: (A) "come hai codificato in functions.php" - non sono d'accordo con questo. Questo è materiale per plugin. (B) "collegato a una tassonomia personalizzata con il valore predefinito del contenuto del post" - Un termine/tasson di tassonomia ha solo un possibile valore in cui il contenuto si adatterebbe in ogni caso: La descrizione. E poi avresti bisogno di un posto per memorizzare l'ID del post. Dove sarebbe questo? Poiché non c'è spazio per questo a causa dei limiti del sistema di tassonomie di WP, potresti solo salvare l'ID del termine. Quindi questo è un sistema (limitato) a senso unico solo: Post > Dati del termine.

Beh, questo è piuttosto complicato, una risposta adeguata richiederebbe molto tempo per essere scritta. Quindi questa non è una vera risposta, solo alcuni pensieri...
Usare la funzione integrata di WordPress wp_update_post
via ajax ti darebbe la cronologia delle revisioni necessaria ma non la capacità di approvare le modifiche.
Creare bozze dalle modifiche non è possibile di default ma è stato discusso qui, È possibile creare una bozza di revisione per una pagina o articolo già pubblicato? Quali soluzioni alternative avete usato?
Puoi provare a usare Front-end Editor ma non avrai controllo sulle modifiche che vengono pubblicate, quindi prova a combinarlo con un altro plugin come Revisionary che permette modifiche basate su permessi, non ho idea se funzioneranno insieme.
Se non funzionano, dovrai modificare un plugin basato sui 2 plugin sopra o scrivere qualcosa da zero.
Il mio approccio da zero sarebbe avere un pulsante che va a un'altra pagina che restituisce il contenuto/dati del post usando JSON, che è più facile da gestire quando si usa Ajax e editor WYSIWYG. Il pulsante salva creerebbe una bozza invece di pubblicare e in questo modo avresti controllo sulle modifiche (vedi sopra la discussione su WPSE su come realizzarlo, è piuttosto complesso).
Ci sono ulteriori complicazioni quando si fa questo come sanitizzazione, codifica, spam, gestione media, campi personalizzati, timestamp, memoria, ecc. La buona notizia è che WordPress ha già un sistema di revisioni a cui puoi collegarti e una discreta capacità di gestire più editor.
PS. Questa è una buona idea per un plugin.
