Come abilitare le modifiche suggerite?


19

Mi piace l'idea di consentire a qualsiasi utente del mio sito Web di suggerire modifiche a una pagina. Proprio come il sistema di modifica su Stack Exchange ma diverso in quanto chiunque dovrebbe essere in grado di modificare, non solo gli utenti registrati. Tutte le modifiche passerebbero attraverso un processo di approvazione.

Come potrei implementarlo?


1
Non so come farlo, ma penso che questo potrebbe essere davvero problematico. Penso che riceverai molto spam.
Martin Thoma,

3
Sei sicuro di aver bisogno di un'installazione WordPress per il tuo sito Web? La funzionalità che desideri sembra molto simile a un'installazione di MediaWiki . Dovresti valutare i pro e i contro di entrambe le installazioni. MediaWiki è una buona alternativa.
Marc Dingena,

Stavo rimbalzando con questa idea un po 'di tempo fa. Il più vicino ad una soluzione disponibile era questo plugin: wordpress.org/support/plugin/post-forking~~V~~singular~~3rd E 'comunque in molto fasi iniziali. Il plugin è riservato agli utenti registrati.
Christine Cooper

Abbiamo lavorato per qualcosa del genere. Avevamo immaginato un editing in stile Wikipedia per i post, insieme a un widget "Cronologia": github.com/publishpress/Revisionary/issues/13 Non ci siamo ancora del tutto, ma quasi tutta la struttura è a posto.
steveburge,

Risposte:


11

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 hiddencampo per comment_approvedcon un valore di 0per 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 :)


1
Do la grazia a questa domanda per l'idea di utilizzare il meta commento per memorizzare la modifica suggerita e wp_text_diff()per il confronto effettivo. Voti positivi per le altre risposte.
fuxia

8

La mia idea è semplice.

  • Puoi creare un Edit Suggestionlink in fondo ai post che ha un modello definito personalizzato, in cui utilizzare una casella di testo (magari con un editor) collegata a una tassonomia personalizzata con il valore predefinito di post content.

  • Eventuali modifiche contentverranno confrontate con original post contentdopo l'invio (come Bozza) e l'immissione CAPTCHA codecon algoritmi Diff come pacchetto PHP inline-diff o Text PE Diff o in alternativa utilizzando una funzione PHP in base a questo per testi non troppo lunghi con combinazione di CSS.

  • Quindi salvando i valori in 3 Meta Box personalizzate (in quella pagina di aggiunta / modifica del back-end di tassonomia) che mostrano

    1. Contenuto originale
    2. Versione modificata
    3. Soprannome dell'utente e sua e-mail

    e salvando Post IDforse con una update_option()funzione per un uso successivo.

  • Dopo aver letto la versione modificata e l'accettazione da parte dell'amministratore, quel post verrà sostituito da quello originale nel momento in cui è stato codificato in Functions.php.


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

4

Bene, questo è piuttosto complicato, una corretta risposta richiederebbe molto tempo per scrivere. Quindi questa non è una vera risposta solo alcuni pensieri ..

L'uso di WordPress integrato wp_update_posttramite Ajax ti darebbe la cronologia delle revisioni necessaria ma non la capacità necessaria per approvare le modifiche.

La creazione di bozze da modifiche non è possibile per impostazione predefinita, ma è stata discussa qui. Esiste un modo per redigere una revisione di una pagina o post pubblicato? Quali soluzioni alternative hai usato?

Puoi provare a utilizzare l' Editor front-end ma non avrai alcun controllo sulle modifiche pubblicate, quindi prova a mescolarlo con un altro plugin come Revisionary che consente modifiche basate sulle autorizzazioni, non ho idea se funzioneranno insieme.

In caso contrario, dovrai hackerare un plug-in basato sui 2 plug-in sopra o scrivere qualcosa da zero.

Il mio approccio graffiante sarebbe quello di avere un pulsante che va su un'altra pagina che genera il contenuto / dati del post usando JSON , che è più facile lavorare con gli editor Ajax e WYSIWYG. Il pulsante Salva verrà pubblicato come bozza anziché come pubblicazione e in questo modo avresti il ​​controllo sulle modifiche (vedi la discussione WPSE sopra su come eseguire questa operazione, è piuttosto scoraggiante).

Ci sono ulteriori complicazioni nel farlo come sanificazione, codifica, spam, gestione dei media, campi personalizzati, timestamp, memoria, ecc. La buona notizia è che wordpress ha già un sistema di revisione che puoi collegare e una discreta capacità di gestire più editor .

ps. Questa è una buona idea per un plugin.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.