Czy sanitize_title wystarcza do wygenerowania ślimaków postowych?

16

Chcę wygenerować ślimak dla niektórych ciągów bez przechodzenia przez przepływ generowania ślimaka WordPress. Dlatego chcę wiedzieć, jakie funkcje wywołuje, aby uzyskać porządny ślimak. Próbowałem sanitize_title (), ale w rezultacie pozostawia% c2% a0.

a_fan
źródło

Odpowiedzi:

27

Jesteś prawie na miejscu. Potrzebna funkcja to sanitize_title_with_dash ($ title)

Brady
źródło
1
Chociaż zdecydowanie wydaje się to poprawne, jestem trochę niejasny, co sanitize_title_with_dash wydaje się robić inaczej niż sanitize_title. sanitize_title dodaje także myślniki tam, gdzie jest spacja ...
Tim Malone
7
Jeśli sprawdzisz Kodeks WordPress pod kątem sanitize_title_with_dash ($ title) , zobaczysz notatkę „nie zastępuje specjalnych znaków akcentowanych”, co oznacza, że ​​znaki takie jak èäçitp. Pozostaną na miejscu dzięki tej funkcji.
JHoffmann
Należy pamiętać, że sanitize_title_with_dashesoprócz sanitize_titlepozostawić znaki specjalne, które mogą uszkodzić niektóre systemy. Chciałbym, aby bardziej uniwersalne podejście do redukcji ciągów znakówsanitize_html_class
GDY
2

Cóż, jest już odpowiedź, ale chciałem ją trochę rozwinąć, więc oto moje ustalenia:

Jeśli przyjrzymy się wp_insert_post(), zobaczymy, że $post_namejest dezynfekowany za pomocą wp_sanitize_title()(patrz wp-includes/post.php)

W funkcji sanitize_title()mamy filtr sanitize_title. Jest to interesujące, ponieważ domyślnie filtry sanitize_title_with_dashes()są zaczepione w tym filtrze (patrz wp-includes/default-filters.php).

<?php
echo sanitize_title( 'Â+ÄÖßáèäç' ) // aaeoessaeaec
?>

Próbowałem sanitize_title (), ale w rezultacie pozostawia% c2% a0.

Brzmi dziwnie. Byłoby wspaniale poznać wartość wejściową, ale wp_insert_post() sanitize_title()wydaje się, że wystarczy.

websupporter
źródło
2

sanitize_title() wydaje się być jedynym, czego potrzebujesz.

W linii 211 wp-obejmuje / domyślny-filtry.php znajdziesz:

add_filter( 'sanitize_title', 'sanitize_title_with_dashes', 10, 3);

Oznacza to, że wywołanie sanitize_title()najpierw usunie wszystkie znaki specjalne, a następnie zastosuje sanitize_titlefiltr, wywołując w ten sposóbsanitize_title_with_dashes()

Jak zauważył @JHoffmann, zwykłe wywołanie sanitize_title_with_dashes()nie usunie znaków specjalnych.

Jules
źródło
To powinna być poprawna odpowiedź
bysanchy,
0

Oprócz świetnej odpowiedzi websupportera znalazłem poniżej:

W zależności od zastosowania będzie to zależało od potrzeb.

sanitize_title() jak mówi:

akcenty są usuwane (znaki akcentowane są zastępowane nieakcentowanymi odpowiednikami)

... i sanitize_title_with_dashesmówi:

Pamiętaj, że nie zastępuje on znaków akcentowanych specjalnie

Tak więc w tym przykładowym ciągu:Â+Ä Ö %%% ßá %20 oo %pp + -_^^#@!**()=[]|\/\'"<>?``~ èäç

sanitize_title() wynik:

aa-o-sa-% 20-oo-pp -_- eac

Jak widać zastąpił znaki akcentowane ich nieakcentowanymi odpowiednikami i usunął wszystkie inne znaki niealfanumeryczne oprócz tego, po %którym następuje cyfra, ale zobaczysz, że został usunięty, gdy nastąpiła po nim litera; być może dlatego, że postrzega to jako już zakodowane . Jest to wymuszane, gdy próbujesz wstawić %c3do swojego łańcucha, nie usuwa go, ponieważ %c3jest to poprawna sekwencja kodowania.

sanitize_title_with_dashes wynik:

% c3% a2% c3% a4-% c3% b6-% c3% 9f% c3% a1-% 20-oo-pp -_-% c3% a8% c3% a4% c3% a7

Jak widać, nie usunął znaków akcentowanych, ale je zakodował.

Teraz spójrzmy na ciąg bez znaków akcentowanych, aby zobaczyć, jak zachowują się oboje ...

Przykładowy ciąg: %%% building %20 oo %pp + -_^^#@!**()=[]|\/\'"<>?``~'

sanitize_title() wynik:

budynek-% 20-oo-pp-_

sanitize_title_with_dashes wynik:

budynek-% 20-oo-pp-_

Jak widać, są dokładnie takie same. Wydaje się więc, że jedyną różnicą jest to, że jeden koduje akcentowane karty, a drugi je zastępuje .

Brett
źródło