Rigenerare gli URL dei post e delle categorie di WordPress

Per un motivo o per un altro potrebbero ritornarti utili queste due funzioni che ti permettono di rigenerare gli URL di un articolo e delle categorie.

In questi giorni ho dovuto migrare il database di un CMS poco conosciuto in quello di WordPress, importando principalmente i post con le varie categorie collegate. In tutto ciò mi son persa gli URL dei post, per cui la tabella wp_posts del database di WordPress era piena di post con titolo, contenuto e data, ma il campo post_name di ogni riga riguardante i post era vuoto. Il risultato è stato che avevo dei post senza URL, quindi l’anteprima del post era inesistente.

Avevo due opzioni: la prima di svuotare il database e riscrivere lo script che interessava quell’area oppure la seconda opzione cioè quella di rigenerare gli URL dei post.

La funzione che andrò a scrivere qui sotto è valida per qualunque tipo di post_type, sia quelli di default come “post” e “page” che quelli custom. Io precisamente sono andata a rigenerare tutti gli URL di un custom post type.

Rigenerare gli URL di un post

rigenerare url post wordpress

In verità con la funzione seguente riscriveremo lo slug di un post, perchè nella tabella wp_posts non viene riportato l’intero URL contenente anche il nome dominio, ma solo lo slug che viene creato partendo dal titolo.

Lo script modificherà o creerà tutte le voci del campo post_name della tabella wp_posts, quindi sovrascriverà anche quei permalink che avevi modificato manualmente. È uno script molto semplice, a cui però prestare molta attenzione, per tale motivo ti consiglio di fare il classico backup del database prima di proseguire.

Questa funzione va copiata ed incollata nel file functions.php presente all’interno del tema in uso.

function gi_regenerate_url_post() {
    $posts = get_posts( array ( 'numberposts' => -1, 'post_type' => 'post' ) );
    foreach ( $posts as $post ) { 
        $new_slug = sanitize_title( $post->post_title );
        if ( $post->post_name != $new_slug ) {
            wp_update_post(
                array (
                    'ID'        => $post->ID,
                    'post_name' => $new_slug
                )
            );
        }
    }
}
add_action( 'init', 'gi_regenerate_url_post' );

Come ho specificato all’inizio dell’articolo, con questa funzione puoi modificare gli URL di qualunque post type; puoi specificare il tipo di post nella seconda riga, esattamente dove c’è scritto 'post_type' => 'post'. Dunque puoi sostituire “post” con ad esempio “page” oppure “events” o qualunque altro post type che hai creato.

Non appena entrerai nel pannello amministrativo di WordPress o sul sito stesso ti accorgerai che tutti gli URL sono stati riscritti e quindi funzionano.

Attenzione!

  1. Prima di utilizzare la funzione qui sopra proposta è consigliabile effettuare il backup del database poichè lo script va a modificare il database in modo irreversibile.
  2. Una volta rigenerato tutti gli URL puoi mettere i doppi slash davanti ad add_action in questo modo:

    //add_action( 'init', 'gi_regenerate_url_post' );

Rigenerare gli URL delle voci delle taxonomy

rigenerare url post e taxonomy

In pratica quello che andremo a fare è rigenerare o creare ex novo gli slug dei terms delle taxonomies. Se non sai cosa sia una taxonomy (o le taxonomies al plurale), oltre ad invitarti a leggere la documentazione reperibile a questo link esterno ed in inglese, te lo spiego in breve:

La taxonomy, in italiano tassonomia, è utilizzata per raggruppare qualcosa. Per farti un esempio pratico di una taxonomy che certamente conoscerai sono le categorie, oppure ancora i tag. In entrambi i casi li ritroviamo sempre vicini all’editor quando stai scrivendo un nuovo articolo.

Senza scendere nei dettagli, così come i post_type, puoi creare tutte le taxonomy che vuoi. In ogni taxonomy vengono raggruppati i terms, cioè le voci.

La seguente funzione è molto simile a quella precedente, l’ho semplicemente riadattata sfruttando due funzioni importanti:

  1. wp_terms() grazie al quale otterremo la lista dei terms della taxonomy che si vuole modificare;
  2. wp_update_term() andrà ad aggiornare il campo slug della tabella wp_terms;

function gi_regenerate_url_terms() {
    $taxonomy = 'category';
    $terms = get_terms( $taxonomy, 'hide_empty=0' );
    foreach ( $terms as $term ) { 
        $new_slug = sanitize_title( $term->slug );
        if ( $term->name != $new_slug ) {
            wp_update_term( $term->term_id, $taxonomy, array ( 'slug' => $new_slug ) );
        }
    }
}
add_action( 'init', 'gi_regenerate_url_terms' );

Anche in questo è necessario effettuare una copia del database e di mettere il doppio slash davanti a add_action.

Nella seconda riga è possibile modificare la variabile $taxonomy = 'category' con la tassonomia di cui hai bisogno rigenerare gli URL o per meglio dire gli slug delle voci delle tassonomie.

P.S. questo articolo, semmai te lo stessi chiedendo, non ha nulla a che fare con “url rewrite“, cioè su come riscrivere gli URL di WordPress, ma semplicemente su come riscrivere gli slug dei post e dei terms di wordpress.

Commenti

  • Marco

    Ciao,

    ho bisogno di modificare i permalink dei miei post ‘product’ a partire dal post_name che sul database lo vedo correttamente mentre la colonna ‘Guid’ dei permalink non è aggiornata. Come posso fare in questo caso?

    Grazie mille,
    Marco

    • Gloria Ingrassia

      Ciao Marco,
      per popolare o rigenerare il campo “guid”, puoi lanciare una query sul db:

      UPDATE 'wp_posts' SET 'guid'= concat('http://nomesito.com/?post_type=product&p=',ID) WHERE 'post_status' = 'publish' AND 'post_type' = 'product';

      in questo modo stai rigenerando il Global Unique Identifier (GUID) del post “product”.
      Il permalink invece è un’altra cosa e non viene preso da guid.

  • Daniela

    Ho un problema…lo slug url delle pagine del mio sito nell’indicizzazione fatta da google non mantengono, lo slug originale composto dal nome dell’articolo nomesito/nomearticolo ma al nome sito segue la categoria in cui è stato pubblicato l’articolo nomesito/nomecategoria. A cosa è dovuto? Non sò come risolvere

  • Gloria Ingrassia

    Ciao Daniela,
    forse nei risultati di Google stai visualizzando le breadcrumbs? (In questo caso non sarebbe un problema).

    Esempio:
    https://www.nomesito.com > NOME CATEGORIA > titolo-articolo

    Ad ogni modo assicurati che in “Impostazioni” > “Permalink” sia selezionato “Nome articolo” con struttura: https://www.nomesito.com/articolo-di-esempio/

    Se hai bisogno, inviami una mail con l’URL del tuo sito.

  • mattia

    ciao Gloria! io ho una situazione un po’ atipica. dei Custom Post Type che includono articoli divisi per regione (quindi Abruzzo, Campania etc) e delle tassonomie personalizzate per ogni regione che saranno le province. Ora io vorrei che all’URL sito/abruzzo vengano elencati tutti i post della regione rispettiva, e fin qui ci siamo. Dove mi blocco è nel riuscire ad avere sito/regione/provincia.
    Sto usando CPTUI per la gestione, ma anche googlando non trovo hint..

  • Gloria Ingrassia

    Ciao Mattia,
    immagino che tu stia parlando di riscrivere gli URL.
    Ti scrivo un esempio che ho fatto diversi anni fa per un sito musicale dove c’era il post_type=CD e la taxonomy=cantanti
    Quindi volevo creare un url di questo genere: nomesito.it/cd/nome-cantante/titolo-cd

    Prima di tutto ho utilizzato il filtro post_type_link()

    add_filter( 'post_type_link', 'gi_cd_permalink_structure', 10, 4);
    function gi_cd_permalink_structure( $post_link, $post, $leavename, $sample ) {
    if ( false !== strpos( $post_link, '%cantanti%' ) ) {
    $cantanti_type_term = get_the_terms( $post->ID, 'cantanti' );
    $post_link = str_replace( '%cantanti%', array_pop( $cantanti_type_term )->slug, $post_link );
    }
    return $post_link;
    }

    Poi ho riscritto le regole con la funzione add_rewrite_rule()

    add_rewrite_rule( '^cd/([^/]*)/([^/]*)?', 'index.php?post_type=cd&cd=$matches[2]&cantanti=$matches[1]', 'top' );

    E per finire, nella registrazione del custom post type, nel rewrite > slug ho aggiunto ‘cd/%cantanti%’

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *