Come WordPress genera gli slug degli URL?
Come sottolineato dal @SinisterBeard nel suo commento molto valido alla domanda già un paio d'anni fa, questa risposta è da tempo obsoleta e le funzioni menzionate sono state sostituite da una nuova API:
Vedi wp_unique_post_slug
.
Risposta Originale
Inizialmente, non posso fornirti una pagina/tutorial/documentazione su come vengono generati gli slug in WP, ma dai un'occhiata alla funzione sanitize_title()
.
Non farti un'impressione sbagliata dal nome della funzione, non è pensata per sanificare un titolo per un successivo utilizzo come titolo di pagina/post. Prende una stringa di titolo e la restituisce per essere usata in un URL:
- rimuove HTML & PHP
- rimuove caratteri speciali
- converte tutti i caratteri in minuscolo
- sostituisce spazi bianchi, underscore e punti con trattini
- riduce più trattini consecutivi a uno solo
Potrebbero esserci casi limite in cui il core fa qualcosa in più (dovresti guardare il codice sorgente per verificare che sanitize_title()
sarà sempre sufficiente a generare esattamente ciò che ti aspetti), ma questo dovrebbe coprire almeno il 99%, se non tutti, i casi.

@kaiser: Immagino che tu sia semplicemente innamorato di T5 Rewrite :) (che è nella mia lista di cose da verificare) | e in generale: Se un titolo è veramente lungo, WP tronca anche gli slug a una certa lunghezza massima. Questo è uno di quei casi in cui non sono del tutto sicuro se sia gestito dal filtro sanitize_title
applicato nella funzione, o se sia gestito da qualcos'altro dopo che la funzione è stata eseguita.

Credo sia il filtro sanitize_title
quello che bisogna verificare. Ma ci sono anche altre funzioni correlate. Non ne ho davvero idea. A volte sembra che SimplePie
sia più facile da capire rispetto alla questione WP_Rewrite
. A proposito: Toscho sta lavorando all'integrazione della funzionalità "Monkeyman Rewrite Analyzer" nel suo plugin. È qui che le cose iniziano a diventare davvero interessanti.

Considera anche sanitize_title_with_dashes() se vuoi essere un po' più esplicito nella generazione di uno slug adatto agli URL.

Puoi utilizzare questa funzione:
static public function slugify($text)
{
// sostituisce caratteri non alfanumerici con -
$text = preg_replace('~[^\pL\d]+~u', '-', $text);
// traslitterazione
$text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
// rimuove caratteri indesiderati
$text = preg_replace('~[^-\w]+~', '', $text);
// elimina - dagli estremi
$text = trim($text, '-');
// rimuove - duplicate
$text = preg_replace('~-+~', '-', $text);
// converte in minuscolo
$text = strtolower($text);
if (empty($text)) {
return 'n-a'; // nessun testo valido
}
return $text;
}
Funziona praticamente esattamente come la funzione di sanitizzazione degli URL di WordPress.

Mi sono imbattuto in questo per caso oggi. Tu dici: "Funziona più o meno esattamente come la funzione wp url sanitize." Allora, dato che uno si trova già nel contesto di esecuzione PHP agganciato a WordPress tramite una catena di chiamate da un tema o un plugin, Per quale motivo immaginabile non si dovrebbe semplicemente usare una delle funzioni rilevanti della nativa API sanitize*
? Già disponibile come funzione gratuita nello spazio dei nomi globale, nel bene e nel male. Perché raccomandare di aggiungere ulteriori 503 byte al codice sorgente distribuito che duplica una funzionalità esistente? Solo perché è possibile?

@JohannesPille per come la capisco io, l'OP voleva avere un generatore di slug
al di fuori di WP, ma assicurandosi comunque che gli slug generati fossero compatibili con WP. È vero che questa funzionalità esiste già nel codice di WP, tuttavia, per usarla al di fuori di WordPress, significherebbe praticamente includere quasi tutto il codice di WP — che è sostanzialmente più di 503 byte di codice :)

Il nucleo al tuo servizio
Non esiste una modalità sviluppatore integrata in WordPress a parte WP_DEBUG
, che in questo caso non ti aiuta molto. Fondamentalmente WP utilizza l'"API Rewrite", che è un wrapper di basso livello basato su funzioni per la classe WP_Rewrite, di cui puoi leggere nel Codex</a>. L'oggetto <code>global $wp_rewrite
è a tua disposizione per ispezionarlo o interagire con la classe.
Plugin che aiutano ad analizzarlo
Il plugin "T5 Rewrite" di Toschos e il plugin "Monkeyman Rewrite Analyzer" di Jan Fabry ti guideranno nella giusta direzione. Ho scritto una piccola estensione per "T5 Rewrite" per integrarlo agevolmente con il "Monkeyman Rewrite Analyzer", che puoi trovare nella wiki del repository di "T5 Rewrite" qui su GitHub.
Il plugin "Monkeyman" aggiunge una nuova pagina, posizionata nel menu dell'interfaccia di amministrazione sotto Strumenti. Il plugin "T5 Rewrite" aggiunge una nuova scheda di aiuto alla pagina Impostazioni > Permalink. La mia estensione aggiunge le schede di aiuto anche alla pagina Strumenti menzionata.
Ecco uno screenshot che mostra come appare il contenuto della scheda di aiuto del plugin "T5 Rewrite".
Vorlage = Modello | Beschreibung = Descrizione | Beispiele = Esempi
Note
Il plugin "T5 Rewrite" fa un lavoro eccellente nell'aiutarti a ispezionare l'oggetto rewrite. E fa anche di più: aggiunge nuove possibilità. Per questo motivo è (almeno nelle mie installazioni) parte del mio pacchetto di plugin di base.

Scusate se riprendo una vecchia domanda, ma avevo la stessa necessità e ho scoperto che questo metodo funziona perfettamente per me:
$some_string = "DON'T STOP ME NOW!";
$slug = sanitize_title(sanitize_title($some_string, '', 'save'), '', 'query');
echo $slug; // dont-stop-me-now
Questo metodo utilizza una doppia sanificazione.
La prima utilizza la modalità save
, dove i tag HTML e PHP vengono rimossi e gli accenti eliminati (i caratteri accentati vengono sostituiti con equivalenti non accentati).
La seconda modalità query
assicura che tutti gli spazi vengano sostituiti con trattini -
e rimuove altri segni di punteggiatura.
Spero possa essere utile a qualcuno! :)

In effetti, se osservi la funzione core wp_insert_post (post.php), vedrai che esegue le seguenti operazioni:
$data['post_name'] = wp_unique_post_slug( sanitize_title( $data['post_title'], $post_ID ), $post_ID, $data['post_status'], $post_type, $post_parent );
$wpdb->update( $wpdb->posts, array( 'post_name' => $data['post_name'] ), $where );
La cosa fondamentale da notare è che utilizza sia wp_unique_post_slug che sanitize_title:
wp_unique_post_slug( sanitize_title(
