3

Può capitare di aver l’esigenza di effettuare il rewrite di un permalink per ottenere un url composto dallo slug del post type e da un term selezionato da una custom taxonomy. Nel nostro esempio:

http://www.dominio.it/negozio/sportivo/nike/

Abbiamo tre livelli che sono rispettivamente:

  • Custom post type: Negozi
  • Custom taxonomy: Categoria negozio
  • Articolo: Nike

Questo non è possibile con la costruzione dei permalink di default di WordPress ma possiamo sopperire piuttosto semplicemente andando ad agire sulla costruzione del Custom post type.

Come prima cosa creo la taxonomy:

add_action( 'init', 'create_store_type_taxonomy', 0 );
function create_store_type_taxonomy( ) {

	register_taxonomy( 'store_category', array( 'store' ), array(
		'hierarchical' => true,
		'labels'       => array(
			'name'          => _x( 'Categoria negozio', 'taxonomy general name' ),
			'singular_name' => _x( 'Categoria negozio', 'taxonomy singular name' ),
			'search_items'  => __( 'Cerca categoria negozio' ),
			'all_items'     => __( 'Tutte le categorie negozio' ),
			'edit_item'     => __( 'Modifica categoria negozio' ), 
			'update_item'   => __( 'Aggiorna categoria negozio' ),
			'add_new_item'  => __( 'Aggiungi categoria negozio' ),
			'new_item_name' => __( 'Nuova categoria negozio' ),
			'menu_name'     => __( 'Categorie negozio' )
		),
		'show_ui'      => true,
		'query_var'    => true,
		'rewrite'      => true,
		'capabilities' => array(
			'manage_terms' => 'manage_categories',
			'edit_terms'   => 'manage_categories',
			'delete_terms' => 'manage_categories',
			'assign_terms' => 'edit_posts'
		)
	));

}

Ora scriviamo una semplice funzione di supporto che ci permetta di inserire il term selezionato nell’url.

add_filter( 'post_type_link', 'store_type_link', 1, 3 );
function store_type_link( $post_link, $id = 0 ){

	$post = get_post( $id );

	$post_type = 'store';

	$taxonomy = 'store_category';

	if( !is_object( $post ) || $post->post_type != $post_type )
		return $post_link;

	$slug = 'default';	// Slug per negozi che non hanno nessuna categoria negozio impostata

	if( $terms = wp_get_object_terms( $post->ID, $taxonomy ) )
		$slug = $terms[0]->slug;

	return str_replace( '%'. $taxonomy .'%', $slug, $post_link );

}

Infine andiamo a vedere la costruzione del Custom post type.

add_action( 'init', 'create_store_post_type' );
function create_store_post_type() {

	register_post_type( 'store',
		array(
		'labels'      => array(
			'name'           => 'Negozi',
			'singular_name'  => 'Nuovo negozio',
			'add_new'        => 'Nuovo negozio',
			'all_items'      => 'Gestisci negozi',
			'edit_item'      => 'Modifica negozio',
			'add_new_item'   => 'Crea nuovo negozio',
			'new_item'       => 'Nuovo negozio',
			'view_item'      => 'Visualizza negozio',
			'search_items'   => 'Cerca negozio',
			'not_found'      => 'Nessun negozio trovato'
		),
		'public'      => true,
		'has_archive' => false,
		'rewrite'     => array( 'slug' => 'negozio/%store_category%' ),
		'supports'    => array( 'title', 'editor', 'thumbnail' )
		)
	);

}

Ricordate di fare un flush dei permalink quando avete finito di modificare il codice… ed è tutto!

Ps. Se invece di fare il rewrite di un custom post type dovessimo fare il rewrite di un post standard invece dell’hook post_type_link andremo ad usare post_link e setteremo il nostro %store_category% direttamente nel pannello di amministrazione di WordPress alla voce Impostazioni->Permalink.

  1. Questo mi è stato di grande aiuto, grazie mille!

    Solo una domanda – e se dovessi avere due diversi term – quindi aggiungere un altro post_type es.’products’ con un’altra taxonomy es.’prod-categories’ dopo questi:

    $post_type = ‘store’;
    $taxonomy = ‘store_category’;

    come sarebbe il codice?

    Grazie mille!

  2. Perfetto questo è esattamente quello che mi serve. Avevo trovato suggerimenti che usavano l’archivio nel permalink (es: ‘has_archive’ => ‘store’,) ma questo non mi è congeniale perché le pagine di “store” le faccio custom, quindi preferisco ‘has_archive’ => false. Il tuo codice funziona in queste condizioni.

Lascia un commento

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