Custom Post Type: Rimuovere lo slug dal permalink

La situazione base quando si crea un Custom Post Type in WordPress (ad esempio per i prodotti da visualizzare sul sito) è quella di avere una single page con lo slug nel Url del post.
Esempio:
https://www.sitoweb.com/prodotto/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.
Esempio:
https://www.sitoweb.com/il-mio-primo-prodotto

Per fare questa trasformazione possiamo adoperare alcune operazioni nel codice PHP. 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' );

Successivamente va rimosso lo slug dal url con una funzione:

// 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 va indicato di riconoscere i prodotti dalle pagine/post (avendo la stessa struttura):

// 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');

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

Come fonte per questa soluzione ho trovato l’esempio su Stack Exchange.

Spero vi sia utile, buon lavoro.

Lascia un commento

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

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.