Odpowiedzi:
Jesteś prawie na miejscu. Potrzebna funkcja to sanitize_title_with_dash ($ title)
èäç
itp. Pozostaną na miejscu dzięki tej funkcji.
sanitize_title_with_dashes
oprócz sanitize_title
pozostawić 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
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_name
jest 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.
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_title
filtr, 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.
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_dashes
mó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ć %c3
do swojego łańcucha, nie usuwa go, ponieważ %c3
jest 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 .