Come WordPress genera gli slug degli URL?

30 nov 2012, 04:24:15
Visualizzazioni: 36K
Voti: 25

Esiste una documentazione che spiega esattamente come WordPress genera gli slug per gli URL? Sto scrivendo uno script che deve generare slug URL identici a quelli generati da WordPress.

2
Commenti

Le risposte a questa domanda sono ora obsolete - utilizza https://codex.wordpress.org/Function_Reference/wp_unique_post_slug invece.

SinisterBeard SinisterBeard
5 mag 2016 12:33:11

@SinisterBeard Mi sono imbattuto in questo per caso oggi. Saresti stato il benvenuto se avessi aggiunto una nuova risposta o modificato quella accettata. La aggiornerò ora. Meglio tardi che mai. Grazie per aver sollevato un punto valido.

Johannes Pille Johannes Pille
30 ago 2020 15:39:37
Tutte le risposte alla domanda 5
3
25

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.

30 nov 2012 04:42:30
Commenti

@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.

Johannes Pille Johannes Pille
30 nov 2012 20:24:49

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.

kaiser kaiser
30 nov 2012 20:52:33

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

Tom Auger Tom Auger
9 dic 2014 18:17:47
2

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.

8 giu 2016 10:35:05
Commenti

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?

Johannes Pille Johannes Pille
30 ago 2020 15:35:57

@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 :)

Gwyneth Llewelyn Gwyneth Llewelyn
10 apr 2023 13:20:20
0

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".

Anteprima del plugin T5 Rewrite in WordPress

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.

30 nov 2012 04:38:24
0

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! :)

5 giu 2018 13:23:56
0

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(
26 set 2016 12:38:05