In che modo WordPress genera slug URL?


Risposte:


16

Non posso darti una pagina / tutorial / documentazione su come vengono generate le lumache WP, ma dai un'occhiata alla sanitize_title()funzione.

Non dare un'impressione sbagliata dal nome della funzione, non ha lo scopo di disinfettare un titolo per un ulteriore utilizzo come titolo di pagina / post . Prende una stringa del titolo e la restituisce per essere utilizzata in un URL:

  • elimina HTML e PHP
  • spoglia caratteri speciali
  • converte tutti i caratteri in caratteri minuscoli
  • sostituisce spazi bianchi, caratteri di sottolineatura e punti con trattini / trattini
  • riduce più trattini consecutivi a uno

Ci potrebbero essere casi limite in cui il nucleo fa qualcosa in più (che avrebbe dovuto guardare la fonte per verificare che sanitize_title()la volontà sempre sufficiente a generare esattamente la stessa che ci si aspetta), ma questo dovrebbe coprire almeno il 99%, se non tutti, i casi .


1
@kaiser: ho pensato che fossi semplicemente innamorato di T5 Rewrite :) (che è nella mia agenda per il check-out) | e in generale: se un titolo è davvero lungo, WP taglia anche le lumache ad una certa lunghezza massima. Questo è uno di quei casi in cui non sono del tutto sicuro se sia stato fatto anche dal sanitize_titlefiltro applicato nella funzione, o se sia gestito da qualcos'altro dopo l'esecuzione della funzione.
Johannes Pille,

Immagino sia il sanitize_titlefiltro che bisogna controllare. Ma ci sono anche altre funzioni correlate . Non ne ho davvero idea. A volte sembra SimplePiepiù facile da capire della WP_Rewritecosa. A proposito: Toscho lavora sull'integrazione della funzionalità "Monkeyman Rewrite Analyzer" nel suo plugin. Ecco dove le cose iniziano a diventare davvero interessanti.
Kaiser

1
Considera anche sanitize_title_with_dashes () se vuoi essere un po 'più esplicito sulla generazione di una lumaca compatibile con l'URL.
Tom Auger,

5

Puoi usare questa funzione:

static public function slugify($text)
{
  // replace non letter or digits by -
  $text = preg_replace('~[^\pL\d]+~u', '-', $text);

  // transliterate
  $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);

  // remove unwanted characters
  $text = preg_replace('~[^-\w]+~', '', $text);

  // trim
  $text = trim($text, '-');

  // remove duplicate -
  $text = preg_replace('~-+~', '-', $text);

  // lowercase
  $text = strtolower($text);

  if (empty($text)) {
    return 'n-a';
  }

  return $text;
}

È esattamente come funziona la funzione di sanificazione dell'url wp.


4

Core al tuo servizio

Non esiste una modalità sviluppatore integrata in WordPress a parte WP_DEBUG, il che non ti aiuta molto in questo caso. Fondamentalmente WP usa "Rewrite API" , che è un wrapper di basso livello basato sulla funzione per la WP_Rewriteclasse, di cui puoi leggere in Codex . Ilglobal $wp_rewrite oggetto è al tuo servizio per ispezionarlo o interagire con la classe.

Plugin che aiutano a guardarci dentro.

Toschos "T5 Rewrite" -Plugin e Jan Fabrys "Monkeyman Rewrite Analyzer" -Plugin ti guideranno. Ho scritto una piccola estensione per "T5 Rewrite" per integrarla senza problemi con "Monkeyman Rewrite Analyzer", che puoi trovare nella wiki dei repository "T5 Rewrite" qui su GitHub .

Il plug-in "Monkeyman" aggiunge una nuova pagina, archiviata nel menu dell'interfaccia utente di amministrazione in Strumenti . Il plug-in "T5 Rewrite" aggiunge una nuova scheda di aiuto alla pagina Impostazioni > Permalink . La mia estensione aggiunge le schede della guida agli strumenti citati pagina .

Ecco uno screenshot di come appaiono i plug-in "T5 Rewrite" che aiutano il contenuto della scheda.

inserisci qui la descrizione dell'immagine

Vorlage = Pattern | Beschreibung = Spiegazione | Beispiele = Esempi

Appunti

Il plug-in "T5 Rewrite" fa un ottimo lavoro aiutandoti a ispezionare l'oggetto di riscrittura. E lo fa ancora di più: aggiunge nuove possibilità. Pertanto fa parte (almeno nelle mie installazioni) del mio pacchetto di plugin di base.


2

In realtà, se sembri la funzione principale wp_insert_post (post.php), vedrai che fa quanto segue:

$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( 

0

Perdona per aver ripreso una vecchia domanda, ma avevo la stessa necessità di scoprire 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.

Il primo usa il save modalità, in cui i tag HTML e PHP vengono rimossi e gli accenti vengono rimossi (i caratteri accentati vengono sostituiti con equivalenti non accentati).

La seconda querymodalità assicura che tutti gli spazi vengano sostituiti con trattini- e altri segni di punteggiatura rimossi.

Spero che questo aiuti qualcuno! :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.