W jaki sposób WordPress generuje ślimaki adresów URL?

17

Czy jest gdzieś strona, która szczegółowo opisuje, w jaki sposób WordPress generuje ślimaki dla adresów URL? Piszę skrypt, który musi generować kopie adresów URL identyczne z tymi generowanymi przez WordPress.

George Edison
źródło
Odpowiedzi na to pytanie są już nieaktualne - zamiast tego użyj codex.wordpress.org/Function_Reference/wp_unique_post_slug .
SinisterBeard

Odpowiedzi:

16

Nie mogę powiedzieć, że nie mam strony / samouczka / dokumentacji na temat generowania ślimaków WP, ale spójrz na tę sanitize_title()funkcję.

Nie odbieraj złego wrażenia na podstawie nazwy funkcji, nie ma ona na celu odkażania tytułu do dalszego użycia jako tytułu strony / postu . Pobiera ciąg tytułu i zwraca go do użycia w adresie URL:

  • usuwa HTML i PHP
  • usuwa znaki specjalne
  • konwertuje wszystkie znaki na dolne czapki
  • zastępuje białe spacje, podkreślenia i kropki łącznikami / myślnikami
  • redukuje wiele kolejnych myślników do jednego

Nie może być przypadki brzegowe gdzie rdzeń robi coś dodatkowego (trzeba by szukać u źródła, aby upewnić się, że sanitize_title()będzie zawsze wystarczają na generowanie dokładnie to samo można się spodziewać), ale to powinno obejmować co najmniej 99%, jeśli nie wszystkie przypadki .

Johannes Pille
źródło
1
@kaiser: Doszedłem do wniosku, że po prostu zakochałeś się w przepisaniu T5 :) (co jest moim planem do sprawdzenia) | i ogólnie: jeśli tytuł jest naprawdę długi, WP przycina również ślimaki do pewnej maksymalnej długości. Jest to jeden z tych przypadków, w których nie jestem do końca pewien, czy robi to również sanitize_titlefiltr zastosowany w funkcji, czy też jest to obsługiwane przez coś innego po uruchomieniu funkcji.
Johannes Pille,
Myślę, że to sanitize_titlefiltr należy sprawdzić. Ale są też inne powiązane funkcje . Naprawdę nie mam o tym pojęcia. Czasami wydaje się SimplePieto łatwiejsze do zrozumienia niż WP_Rewriterzecz. Btw: Toscho pracuje nad zintegrowaniem funkcji „Monkeyman Rewrite Analyzer” ze swoją wtyczką. Właśnie tam rzeczy stają się naprawdę interesujące.
kaiser
1
Weź również pod uwagę sanitize_title_with_dash (), jeśli chcesz być bardziej precyzyjny w kwestii generowania ślimaka przyjaznego adresowi URL.
Tom Auger,
5

Możesz użyć tej funkcji:

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;
}

Dokładnie tak działa funkcja odkażania adresu URL ur.

Vivek Sancheti
źródło
4

Rdzeń do usług

Poza WordPress nie ma wbudowanego trybu programistyWP_DEBUG , co w tym przypadku nie pomaga. Zasadniczo WP używa „Rewrite API” , które jest opakowującą funkcje WP_Rewriteklasą niskiego poziomu , o której można przeczytać w Kodeksie . global $wp_rewriteObiekt stoi do Państwa dyspozycji, aby sprawdzić go lub interakcji z klasą.

Wtyczki, które pomagają w tym zaglądać.

Toschos „T5 Rewrite” -Plugin i Jan Fabrys „Monkeyman Rewrite Analyzer” -Plugin poprowadzą Cię po Twojej drodze. Napisałem małe rozszerzenie do „T5 Rewrite”, aby bezproblemowo zintegrować je z „Monkeyman Rewrite Analyzer”, który można znaleźć w wiki repozytorium „T5 Rewrite” tutaj na GitHub .

Wtyczka „Monkeyman” dodaje nową stronę, umieszczoną w menu interfejsu administratora w menu Narzędzia . Wtyczka „T5 Rewrite” dodaje nową kartę pomocy do strony Ustawienia > Permalinks . Moje rozszerzenie dodaje także karty pomocy do wspomnianej strony Narzędzia .

Oto zrzut ekranu przedstawiający zawartość karty pomocy „T5 Rewrite”.

wprowadź opis zdjęcia tutaj

Vorlage = Wzór | Beschreibung = Objaśnienie | Beispiele = Przykłady

Notatki

Wtyczka „T5 Rewrite” wykonuje wspaniałą pracę, pomagając w inspekcji obiektu przepisującego. I robi jeszcze więcej: dodaje nowe możliwości. Dlatego jest to (przynajmniej w moich instalacjach) część mojego podstawowego pakietu wtyczek.

kajzer
źródło
2

W rzeczywistości, jeśli spojrzysz na podstawową funkcję wp_insert_post (post.php), zobaczysz, że wykonuje ona następujące czynności:

$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 );

Najważniejszą rzeczą do odnotowania jest to, że używa zarówno wp_unique_post_slug, jak i sanitize_title:

wp_unique_post_slug( sanitize_title( 
Jahmic
źródło
0

Wybacz, że wznowiłem stare pytanie, ale miałem taką samą konieczność, jak się okazało, ta metoda działa dla mnie idealnie:

$some_string = "DON'T STOP ME NOW!";
$slug = sanitize_title(sanitize_title($some_string, '', 'save'), '', 'query');
echo $slug; // dont-stop-me-now

Ta metoda wykorzystuje podwójne odkażanie.

Pierwszy wykorzystuje savetryb, w którym tagi HTML i PHP są usuwane, a akcenty są usuwane (znaki akcentowane są zastępowane nieakcentowanymi odpowiednikami).

Drugi querytryb zapewnia, że ​​wszystkie spacje zostaną zastąpione myślnikami -i inne znaki interpunkcyjne zostaną usunięte.

Mam nadzieję, że to komuś pomoże! :)

GigiSan
źródło