O sanitize_title é suficiente para gerar post slugs?

16

Quero gerar slug para algumas strings sem passar pelo fluxo de geração de slug do WordPress. Portanto, quero saber quais funções ele chama para obter uma lesma pura. Eu tentei sanitize_title (), mas deixa% c2% a0 no resultado.

um fã
fonte

Respostas:

27

Você está quase lá. A função que você precisa é sanitize_title_with_dashes ($ title)

Brady
fonte
11
Embora isso definitivamente pareça correto, não estou claro o que o sanitize_title_with_dashes parece fazer de maneira diferente com o sanitize_title. sanitize_title também está adicionando traços onde espaço em branco é ...
Tim Malone
7
Se você verificar o Codex do WordPress para sanitize_title_with_dashes ($ title) , verá a nota 'ele não substitui caracteres acentuados especiais', o que significa que caracteres como èäçetc. permanecerão no lugar com esta função.
JHoffmann
Observe que sanitize_title_with_dashes, além de sanitize_titledeixar alguns caracteres especiais que podem danificar alguns sistemas. I você quer uma abordagem mais universal na redução cordas dar uma olhadasanitize_html_class
GDY
2

Bem, já existe uma resposta, mas eu queria expandi-la um pouco, então aqui estão minhas descobertas:

Se dermos uma olhada wp_insert_post(), veremos que o $post_nameé higienizado usando wp_sanitize_title()(ver wp-includes/post.php)

Na função sanitize_title(), temos um filtro sanitize_title. Isso é interessante, já que nos filtros padrão sanitize_title_with_dashes()está associado a esse filtro (consulte wp-includes/default-filters.php).

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

Eu tentei sanitize_title (), mas deixa% c2% a0 no resultado.

Isso parece estranho. Seria ótimo saber o valor de entrada, mas o seguinte wp_insert_post() sanitize_title()parece ser suficiente.

websupporter
fonte
2

sanitize_title() parece ser o único que você precisa.

Na linha 211 do wp-includes / default-Filters.php, você encontrará:

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

Isto significa que chamado sanitize_title()irá primeiro remover todos os caracteres especiais, em seguida, aplicar o sanitize_titlefiltro, pondo assimsanitize_title_with_dashes()

Como apontou @JHoffmann, simplesmente chamar sanitize_title_with_dashes()não removerá caracteres especiais.

Jules
fonte
Esta deve ser a resposta correta
bysanchy
0

Além da ótima resposta do websupporter, encontrei o abaixo:

Dependendo do seu uso, isso dependerá do que você precisa.

sanitize_title() como diz:

acentos são removidos (caracteres acentuados são substituídos por equivalentes não acentuados)

... e sanitize_title_with_dashesdiz:

Observe que ele não substitui caracteres acentuados especiais

Portanto, com este exemplo de sequência:Â+Ä Ö %%% ßá %20 oo %pp + -_^^#@!**()=[]|\/\'"<>?``~ èäç

sanitize_title() resultado:

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

Como você pode ver, ele substituiu caracteres acentuados por seus equivalentes não acentuados e removeu todos os outros caracteres não alfanuméricos, além do %que é seguido por um número, mas você verá que ele foi removido quando foi seguido por uma letra; talvez seja porque o percebe como já codificado . Isso é aplicado quando você tenta inserir %c3sua string, não a tira, pois %c3é uma sequência de codificação válida.

sanitize_title_with_dashes resultado:

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

Então, como você pode ver, ele não removeu os caracteres acentuados, mas os codificou.

Agora, vamos ver uma sequência sem caracteres acentuados para ver como os dois se comportam ...

Sequência de exemplo: %%% building %20 oo %pp + -_^^#@!**()=[]|\/\'"<>?``~'

sanitize_title() resultado:

building-% 20-oo-pp-_

sanitize_title_with_dashes resultado:

building-% 20-oo-pp-_

Então, como você pode ver, eles são exatamente iguais. Portanto, parece que a única diferença neles é que um codifica cartas acentuadas enquanto o outro as substitui .

Brett
fonte