Cum să activez sugestiile de editare?

12 mar. 2013, 13:52:38
Vizualizări: 2.06K
Voturi: 21

Îmi place ideea de a permite oricărui utilizator al site-ului meu să sugereze modificări pentru o pagină. Similar cu sistemul de editare de pe Stack Exchange, dar cu diferența că oricine ar trebui să poată edita, nu doar utilizatorii înregistrați. Toate modificările ar trece printr-un proces de aprobare.

Cum aș putea implementa acest lucru?

4
Comentarii

Nu știu cum să fac asta, dar cred că ar putea fi foarte problematic. Cred că vei primi mult spam.

Martin Thoma Martin Thoma
13 mar. 2013 20:39:52

Ești sigur că ai nevoie de o instalare WordPress pentru site-ul tău? Funcționalitatea pe care o dorești sună foarte asemănătoare cu o instalare MediaWiki. Ar trebui să cântărești avantajele și dezavantajele ambelor instalări. MediaWiki este o alternativă bună.

Marc Dingena Marc Dingena
15 mar. 2013 11:59:15

M-am tot gândit la această idee acum ceva timp. Cea mai apropiată soluție disponibilă a fost acest plugin: http://wordpress.org/support/plugin/post-forking Totuși, este în faze foarte timpurii de dezvoltare. Plugin-ul este restricționat doar la utilizatorii înregistrați.

Christine Cooper Christine Cooper
5 mai 2013 03:10:49

Am lucrat la ceva asemănător. Ne-am imaginat editarea articolelor în stil Wikipedia, împreună cu un widget "Istoric": https://github.com/publishpress/Revisionary/issues/13 Încă nu am ajuns acolo, dar aproape toată structura este deja pusă la punct.

steveburge steveburge
20 sept. 2019 18:59:53
Toate răspunsurile la întrebare 3
1
11

Comparați conținutul, titlul și autorul postării

Deoarece a trebuit să fac ceva similar acum câteva luni, iată cea mai ușoară și mai viabilă metodă (pe care am găsit-o) pentru a verifica dacă s-a făcut o modificare la conținut sau titlu sau dacă autorul s-a schimbat:

// Actualizare Titlu
'' !== wp_text_diff(
    $el['post_title'],
    $GLOBALS['post']->post_title
)
    AND $GLOBALS['post']->post_title = $el['post_title'];
// Actualizare Conținut
'' !== wp_text_diff(
    $el['post_content'],
    $GLOBALS['post']->post_content
)
    AND $GLOBALS['post']->post_content = $el['post_content'];
// Actualizare autor
$GLOBALS['post']->post_author !== $el['post_author']
    AND $GLOBALS['post']->post_author = $el['post_author'];

Pentru a explica pe scurt scenariul meu: preluam postări de la o locație îndepărtată prin intermediul unui API extern. Apoi returnam global $post, în timpul unei bucle de postare unică, conținând fie datele originale, fie noile date. Astfel am gestionat setarea tuturor celorlalte valori ale postării pe care nu trebuia să le verific pentru modificări.

Propunerea editării

Principalul aspect de reținut atunci când căutați un loc unde o editare propusă a conținutului postării ar putea fi salvată (temporar) este că conținutul este o intrare în baza de date de tip longtext. Deci locul unde doriți să salvați editarea propusă trebuie să îndeplinească această cerință. Comentariile fac acest lucru.

Apoi, există avantajul că oferă un API pentru a le plasa elegant într-o buclă, astfel încât să se integreze fără probleme, să fie foarte personalizabil și să poată fi configurat rapid. Last but not least, majoritatea temelor vin deja cu comentarii integrate, așa că este ușor să profitați de sistem și să vă conectați la aproape orice temă disponibilă.

Aș sugera să extindeți sau să modificați formularul de comentarii. Utilizați fie următoarea soluție, fie adăugați câmpuri suplimentare cu un callback conectat la comment_form_default_fields.

<?php
// Adăugați-l pentru utilizatorii autentificați și pentru vizitatori:
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( 'Propune Editare', '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
}

Am adăugat un câmp hidden pentru comment_approved cu valoarea 0 pentru a-l pune în coadă. Nu sunt sigur dacă acest lucru va funcționa sau dacă această valoare (din nucleu) este de fapt metadate ale comentariului și trebuie adăugată folosind add_comment_meta() în timpul salvării. Dacă nu, puteți folosi ceva similar cu următoarele linii de cod

add_filter( 'pre_comment_approved' , 'wpse_pre_suggest_edit', 100, 2 );
function wpse_pre_suggest_edit( $approved , $commentdata )
{
    // Poate fi necesar să inspectați $commentdata 
    // pentru a determina starea de aprobare, respingere sau spam
    if ( ! empty( $commentdata['wpse_propsed_edit'] ) )
    {
        # Adăugați acum un filtru la acțiunea de postare a comentariului, pentru a salva o intrare meta
        add_action( 'comment_post', 'wpse_set_proposed_edit' );
        return 0;
    }

    return 1;
}

// Această funcție ne ajută să identificăm comentariile după valoarea lor meta
function wpse_set_proposed_edit( $comment_id );
{
    // Rulează doar o dată
    remove_filter( current_filter(), __FUNCTION__ );

    add_comment_meta( $comment_id, 'proposed_edit', true, true );
}

Afisarea comentariilor în panoul de administrare

Aici aș opta pentru o simplă extensie de clasă și o pagină personalizată de administrare:

function wpse_add_proposed_edits_admin_page()
{
    add_menu_page(
        'Editări Propuse',
        'Editări Sugerate',
        '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
{
    // Suprascrieți aici logica implicită a tabelului de listă
}

Mai multe informații pot fi găsite pe WPEngineer.

Aprobarea editărilor

Ați putea adăuga acțiuni personalizate și procesa editările propuse folosind primul cod afișat pentru a verifica dacă a existat o modificare și apoi pur și simplu actualizați postarea. Comentariul în sine conține o valoare cu cheia comment_post_ID, astfel încât identificarea ID-ului postării editate este simplă.

Notă finală

Aș dori să văd și pluginul final. Vă rugăm să-l linkuiți aici :)

7 mai 2013 18:03:26
Comentarii

Acord premiul pentru această întrebare datorită ideii de a folosi meta-comentarii pentru a stoca editarea sugerată și wp_text_diff() pentru comparația efectivă. Voturi pozitive pentru celelalte răspunsuri.

fuxia fuxia
8 mai 2013 22:26:53
1

Ideea mea este ceva simplu.

  • Poți crea un link Sugestie de Editare în partea de jos a articolelor care are un șablon personalizat, folosind o casetă de text (poate cu un editor) care este legată de o taxonomie personalizată cu valoarea implicită conținutul articolului.

  • Orice modificări aduse conținutului vor fi comparate cu conținutul original al articolului după trimitere (ca Ciornă) și introducerea codului CAPTCHA cu algoritmi Diff precum pachetul PHP inline-diff sau pachetul PEAR Text-Diff sau alternativ folosind o funcție PHP conform acestui pentru texte nu prea lungi în combinație cu CSS.

  • Apoi, prin salvarea valorilor în 3 căsuțe Meta personalizate (în pagina de adăugare/editare a acelei taxonomii în back-end) care afișează:

    1. Conținutul Original
    2. Versiunea Editată
    3. Pseudonimul utilizatorului și Email-ul său

    și salvarea ID-ului Articolului poate cu o funcție update_option() pentru utilizare ulterioară.

  • După citirea versiunii editate și acceptarea de către administrator, acel articol va înlocui cel original așa cum ai codat în functions.php.

15 mar. 2013 11:56:57
Comentarii

Câteva observații: (A) "așa cum ai codat în functions.php" - nu sunt de acord cu aceasta. Aceasta este material pentru plugin. (B) "legat de o taxonomie personalizată cu valoarea implicită a conținutului postării" - Un termen/taxon de taxonomie are doar o singură valoare posibilă unde conținutul s-ar potrivi în orice caz: Descrierea. Și apoi ai avea nevoie de un loc pentru a stoca ID-ul postării. Unde ar fi acesta? Deoarece nu există un loc pentru asta datorită limitărilor sistemului de taxonomii din WP, ai putea salva doar ID-ul termenului. Atunci acesta este un sistem (limitat) unidirecțional doar: Postare > Datele termenului.

kaiser kaiser
9 mai 2013 18:05:03
0

Ei bine, acest lucru este destul de complicat, un răspuns adecvat ar necesita timp considerabil pentru a fi scris. Așadar, acesta nu este un răspuns real, ci doar câteva gânduri..

Folosirea funcției încorporate în WordPress wp_update_post prin intermediul ajax v-ar oferi istoricul necesar al reviziilor, dar nu și capacitatea necesară pentru a aproba modificările.

Crearea de schițe din modificări nu este posibilă în mod implicit, dar a fost discutată aici, Există vreo modalitate de a crea o schiță dintr-o revizie a unei pagini sau articol publicat? Ce soluții alternative ați folosit?

Puteți încerca să folosiți Front-end Editor, dar nu veți avea control asupra publicării modificărilor, așa că încercați să-l combinați cu un alt plugin precum Revisionary, care permite modificări bazate pe permisiuni. Nu am nicio idee dacă vor funcționa împreună.

Dacă nu funcționează, va trebui să modificați un plugin bazat pe cele două plugin-uri menționate mai sus sau să scrieți ceva de la zero.

Abordarea mea de la zero ar fi să aveți un buton care duce la o altă pagină care afișează conținutul/datelor postării folosind JSON, care este mai ușor de lucrat când folosiți Ajax și editoare WYSIWYG. Butonul de salvare ar posta ca o schiță în loc să publice și astfel ați avea control asupra modificărilor (vedeți discuția WPSE de mai sus pentru a afla cum să realizați acest lucru, este destul de descurajant).

Există complicații suplimentare atunci când faceți acest lucru, cum ar fi curățarea, codificarea, spam-ul, gestionarea fișierelor media, câmpurile personalizate, marcajele temporale, memoria, etc. Vestea bună este că WordPress are deja un sistem de revizii în care vă puteți conecta și o abilitate decentă de a gestiona mai mulți editori.

ps. Aceasta este o idee bună pentru un plugin.

2 mai 2013 02:13:51