Odpowiedzi:
Jesteś prawie na miejscu. Potrzebna funkcja to sanitize_title_with_dash ($ title)
èäçitp. Pozostaną na miejscu dzięki tej funkcji.
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
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.
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.
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 .