Recentemente abbiamo realizzato con Prepress Genova un sito che pensiamo potrà essere utile a molti ristoratori. Il sito si chiama Menù+ e permetterà ai ristoratori di digitalizzare i loro menù: i clienti potranno poi visualizzarli direttamente sul loro smartphone scansionando un QRcode. 

https://menuplus.biz

Fin qui tutto facile: abbiamo realizzato il sito con WordPress, tramite un tema personalizzato. Abbiamo quindi creato un custom post type per la gestione dei menù ed abbiamo utilizzato ACF per la creazione dei campi personalizzati del menù. Il risultato è ottimo e performante, ma quando dico performante intendo:

Ad un certo punto però ci siamo chiesti: e se un cliente non ha una app per scansionare i QRcode? Dovrà inserire a mano l’URL del menù nel browser del proprio smartphone… e qui arriva il problema. In WordPress di default l’URL associato ad un post di tipo personalizzato è composto dal nome del custom post type e dallo slug del post. Lo slug a sua volta è creato usando il titolo del post. Per fare un esempio, l’URL del menù del ristorante “Al Porto” è:

www.sito.it/cpt_menu/ristorante-al-porto

Decisamente troppo lungo affinché un cliente possa digitarlo per intero sul proprio smartphone senza commettere nessun errore. Che fare allora? I punti da toccare sono due:

  • La prima parte del url, ovvero quella associata al custom post type (nel nostro caso cpt_menu)
  • Lo slug del post

Il primo punto è semplice: quando si registra un custom post type in WordPress è possibile definire un attributo rewrite, per modificare la keyword degli URL associati al custom post type stesso. Nel nostro caso, per rendere l’URL più breve possibile abbiamo deciso di utilizzare come keyword semplicemente “m”, in modo che gli URL relativi al custom post type abbiano la forma:

www.sito.it/m/…

<?php

function my_custom_post_type()
{

	register_post_type('cpt_menu',
		[
			// ...
			'rewrite'     => ['slug' => 'm'],
			// ...
		]
	);
}
add_action('init', 'my_custom_post_type');

Il secondo punto invece è più complicato: WordPress di default genera gli slug a partire dal titolo del post e l’autore può eventualmente modificare a mano lo slug. Il nostro obiettivo è quello di rendere il processo completamente automatico, magari creando degli slug alfanumerici casuali ma brevi, qualcosa così:

www.sito.it/m/abc1

A questo proposito analizzando il codice di WordPress (viva l’open source!) Abbiamo trovato un filtro che ci permette di inserirci nel flusso di creazione degli slug:

wp_unique_post_slug

Ora non ci resta che generare gli slug casuali, ma attenzione: il filtro viene invocato più volte per lo stesso post quindi è importante che un singolo post id generi sempre lo stesso slug, altrimenti ad ogni salvataggio del post lo slug verrebbe modificato!

Dopo una breve ricerca su GitHub (ho già detto viva l’open source?) Abbiamo trovato questa piccola libreria che sembra fare proprio al caso nostro:

https://github.com/vinkla/hashids

A questo punto non ci resta che unire il tutto: nel file functions.php del nostro tema abbiamo aggiunto la nostra callback al filtro di calcolo dello slug. L’implementazione della callback è molto semplice: per prima cosa verifichiamo che la tipologia di post sia quella di nostro interesse, dopodiché usiamo la libreria per generare lo slug casuale a partire dal post id, così che lo slug resti sempre lo stesso ad ogni invocazione del filtro. La libreria è molto completa, quindi abbiamo potuto specificare anche una stringa di salt da utilizzare nel calcolo degli slug, la lunghezza minima dello slug e l’alfabeto da utilizzare per la generazione degli slug (di default l’alfabeto è composto da lettere maiuscole, minuscole e numeri, nel nostro caso abbiamo preferito togliere le lettere maiuscole e alcune lettere che non appartengono strettamente alla nostra lingua, il tutto per ridurre al minimo la possibilità di errore durante la digitazione dell’URL sullo smartphone).

<?php

function my_custom_menu_slug($slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug) {
    if($post_type != 'cpt_menu') return $slug;
    $hashids = new Hashids\Hashids('my_salt', 4, 'abcdefghilmnopqrstuvz123456789');
    return $hashids->encode($post_ID);
}

add_filter('wp_unique_post_slug', 'my_custom_menu_slug', 10, 6);


Alla fine il risultato è esattamente quello che ci siamo posti come obiettivo iniziale:

Che dire quindi? Ad oggi abbiamo realizzato con WordPress più di 50 siti: alcuni molto semplici, altri più elaborati. Anche nei casi più complessi siamo sempre riusciti a raggiungere i nostri obiettivi sfruttando le infinite possibilità di personalizzazione che WordPress offre, senza contare poi lo sconfinato ecosistema di plugin a disposizione. Oggi il compito non era semplice: modificare la generazione degli URL non è una cosuccia da poco, ma è bastato trovare il filtro giusto ed il resto è venuto da sé.