Cum să activez sugestiile de editare?
Î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?

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 :)

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 cuconținutul original al articolului
după trimitere (ca Ciornă) și introducereacodului 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ă:
- Conținutul Original
- Versiunea Editată
- Pseudonimul utilizatorului și Email-ul său
și salvarea
ID-ului Articolului
poate cu o funcțieupdate_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.

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.

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.
