Custom Post Type

Custom Post Type: Rimuovere slug dal permalink

Un Custom Post Type (CPT) permette di creare in WordPress un nuovo tipo di contenuto simile alle pagine o agli articoli e memorizzarlo nel database.

Per fare un CPT possiamo utilizzare un plugin (Custom Post Type UI) o farlo tramite codice. In questo articolo vedremo il secondo caso cioè uno snippet PHP nel file functions.php che registra le impostazioni del nuovo contenuto.

La situazione base quando si crea un nuovo Custom Post Type (ad esempio per i prodotti di un’azienda da visualizzare sul sito) è quella di avere una single page per ogni prodotto salvato con lo slug “prodotti” nel Url di ogni post.

Esempio:
https://www.sitoweb.com/prodotti/il-mio-primo-prodotto

Può capitare per richiesta del cliente o semplicemente per il restyling di un sito che ha già gli url esistenti senza lo slug di dover togliere dal indirizzo quella parte cioè nel nostro caso “prodotti”.

Esempio:
https://www.sitoweb.com/il-mio-primo-prodotto

Per fare questa trasformazione possiamo adoperare alcune operazioni nel nostro codice PHP del tema personalizzato. Per prima cosa quando dichiariamo il custom post type va indicato quanto segue.

// Prodotti -> Custom Post Type
function create_prodotti() {
    register_post_type( 'prodotti',
    // CPT Options
        array(
            'labels' => array(
                'name' => __( 'Prodotti' ),
                'singular_name' => __( 'Prodotto' )
            ),
            'public' => true,
            'has_archive' => true,
            'rewrite' => [
        		'slug'       => false,
		        'with_front' => false,
		        'pages'      => false,
		        'feeds'      => false,
    		],
            'show_in_rest' => true,
        )
    );
}
add_action( 'init', 'create_prodotti' );

Dopo questo passaggio ricordiamoci di aggiornare i permalink.

Impostazioni > Permalink > Struttura dei permalink > Nome articolo

Successivamente va rimosso lo slug dal url con una funzione che va ad agire con uno filtro sul link del post type andando a fare un semplice str_replace.

// Prodotti - Remove Slug
function prodotti_remove_slug( $post_link, $post, $leavename ) {
    if ( 'prodotti' != $post->post_type || 'publish' != $post->post_status ) {
        return $post_link;
    }
    $post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );
    return $post_link;
}
add_filter( 'post_type_link', 'prodotti_remove_slug', 10, 3 );

Infine come passaggio ulteriore va indicato subito dopo nel codice di riconoscere i prodotti dalle pagine/post (avendo la stessa struttura), altrimenti WordPress non riesce a distinguere ed indirizzare eventuali template di pagina.

// Prodotti - Parse Request
function prodotti_parse_request( $query ) {
    if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
        return;
    }
    if ( ! empty( $query->query['name'] ) ) {
        $query->set( 'post_type', array( 'post', 'prodotti', 'page' ) );
    }
}
add_action( 'pre_get_posts', 'prodotti_parse_request');

Fatti questi due ultimi passaggi andiamo ad aggiornare sempre i permalink ed otteniamo così il nostro url senza lo slug ben indirizzato ai prodotti.

Chiaramente si può sostituire a prodotti il titolo del post type desiderato.

Come fonte per questa soluzione ho trovato l’esempio su Stack Exchange:
Remove slug from custom post type post URLs

Attenzione questi ultimi due passaggi di codice (Remove Slug e Parse Request) sono validi solamente per i custom post type di primo livello, non funzionano per i post type gerarchici figli.

Come scritto appena sopra possiamo avere prodotti concatenati figli di prodotti principali per farlo dovremmo attivare quando creiamo il post type due opzioni cioè gerarchia => true ed attributi pagina => true.

// Prodotti -> Custom Post Type
function create_prodotti() {
    register_post_type( 'prodotti',
    // CPT Options
        array(
            'labels' => array(
                'name' => __( 'Prodotti' ),
                'singular_name' => __( 'Prodotto' )
            ),
            'public' => true,
            'hierarchical' => true, //IMPORTANT!!!
            'has_archive' => true,
            'rewrite' => [
        		'slug'       => false,
		        'with_front' => false,
		        'pages'      => false,
		        'feeds'      => false,
    		],
            'show_in_rest' => true,
            'supports' => array( 
                'title',
                'editor',
                'author',
                'thumbnail',
                'excerpt',
                'page-attributes' //IMPORTANT!!!
        	)
        )
    );
}
add_action( 'init', 'create_prodotti' );

Per risolvere questa situazione mi sono però avvalso di un plugin gratuito molto leggero e che fa esattamente la rimozione dello slug sia per i custom post type di primo livello che per quelli gerarchici di secondo o terzo livello.

Questo plugin si chiama Remove CPT base.

In questo caso se andiamo ad attivare il plugin troviamo una voce nel menu.

Impostazioni > Remove CPT base

Da qui possiamo selezionare il nostro Custom Post da disattivare. Molto più semplice ed elimina i passaggi di codice che ho scritto precedentemente.

Provare per credere.


Pubblicato

in

,

da