Rescrierea slug-ului articolului înainte de salvare

10 iul. 2013, 09:50:41
Vizualizări: 26.7K
Voturi: 12

Am nevoie să preiau un câmp ACF din articol și să modific slug-ul (permalink-ul) articolului înainte de a-l salva în baza de date. Care este abordarea pentru a realiza acest lucru? Am nevoie ca slug-ul să fie modificat la fiecare operațiune de creare/editare a articolului.

0
Toate răspunsurile la întrebare 2
3
26

Următoarele informații trebuie considerate mai mult ca un concept demonstrativ decât o soluție gata de copiat/lipește.
Cu toate acestea, iată cum ai putea aborda problema:

Acțiunea save_post action rulează de fiecare dată când un articol este actualizat sau creat. Poți conecta o funcție callback la ea folosind add_action.

Prin urmare, cazul tău ar trebui să arate cam așa:

// conectare inițială
add_action( 'save_post', 'wpse105926_save_post_callback' );

function wpse105926_save_post_callback( $post_id ) {

    // verifică dacă postarea nu este o revizie
    if ( ! wp_is_post_revision( $post_id ) ) {

        // deconectează această funcție pentru a preveni bucla infinită
        remove_action( 'save_post', 'wpse105926_save_post_callback' );

        // actualizează slug-ul postării
        wp_update_post( array(
            'ID' => $post_id,
            'post_name' => 'un-nou-slug' // faci modificarea ta aici
        ));

        // reconectează această funcție
        add_action( 'save_post', 'wpse105926_save_post_callback' );

    }
}

Ceea ce poate fi puțin confuz în exemplul de mai sus este deconectarea și reconectarea funcției din interiorul ei. Acest lucru este necesar deoarece apelăm wp_update_post pentru a actualiza slug-ul, ceea ce la rândul său va declanșa rularea acțiunii save_post din nou.

Ca o observație suplimentară, dacă dorești ca WordPress să genereze automat noul slug pe baza titlului postării, pur și simplu treci un șir gol:

wp_update_post( array(
    'ID' => $post_id,
    'post_name' => '' // slug-ul va fi generat de WP pe baza titlului postării
));
10 iul. 2013 11:46:23
Comentarii

mulțumesc pentru concept, m-a ajutat să înțeleg mai bine procesul

Vit Kos Vit Kos
10 iul. 2013 13:31:43

întrebarea se referă la ACF, mai exact la "preluarea" câmpului (valorii) iar conceptul tău funcționează în php și tocmai ce ai comentat ca "do your thing here" lipsește. Poți să arunci și o dovadă de concept pentru preluare? (ține minte că câmpul #postname nu există până când butonul "edit" (permalink) este apăsat. La fel și cu câmpul invizibil #new-post-slug)

sergio sergio
9 iul. 2015 09:54:00

Nu aș putea face asta și folosind filtrul wp_insert_post_data, care rulează după sanitarizare, chiar înainte de salvare? Care este cel mai mare beneficiu al acestei metode.

toni_lehtimaki toni_lehtimaki
3 sept. 2017 12:22:33
0

Am avut nevoie de același lucru, dar doar pentru crearea de articole.

Am implementat soluția de aici (aceasta este gata de copiat/lipește).

Doar elimină linia care verifică dacă ambele date sunt egale, și va actualiza slug-ul și pentru operațiunile de editare. Totuși, nu recomand acest lucru deoarece va schimba URL-ul articolului, iar acest lucru nu este bun pentru SEO, printre alte probleme precum legătruile stricate (404).

11 feb. 2016 01:15:37