I want to generate slug for some strings without going through WordPress slug generation flow. Therefore, I want to know which functions it calls to get a neat slug. I tried sanitize_title() but it leaves %c2 %a0 in result.
Leave a Reply
You must be logged in to post a comment.
You are almost there. The function you need is sanitize_title_with_dashes( $title )
sanitize_title()
seems to be the only one you need.In wp-includes/default-filters.php line 211 you will find:
This means that calling
sanitize_title()
will first remove all the special characters, then apply thesanitize_title
filter, thus callingsanitize_title_with_dashes()
As @JHoffmann pointed out, simply calling
sanitize_title_with_dashes()
will not remove special characters.Well, there is already an answer, but I wanted to expand it a bit, so here are my findings:
If we have a look in
wp_insert_post()
we see, the$post_name
is sanitized usingwp_sanitize_title()
( seewp-includes/post.php
)In the function
sanitize_title()
we have a filtersanitize_title
. This is interesting, since in the default filterssanitize_title_with_dashes()
is hooked into this filter (seewp-includes/default-filters.php
).This sounds strange. It would be great to know the input value, but following
wp_insert_post()
sanitize_title()
seems to be enough.In addition to websupporter’s great answer I found the below:
Depending on your usage it will depend what you need.
sanitize_title()
as it says:…and
sanitize_title_with_dashes
says:So, with this example string:
Ã+à à %%% Ãá %20 oo %pp + -_^^#@!**()=[]|/'"<>?``~ èäç
sanitize_title()
result:As you can see it has replaced accented characters with their non-accented equivalents and it has removed all other non-alphanumeric characters apart from the
%
which is followed by a number, but you will see it was removed when it was followed by a letter; perhaps this is because it perceives it as already encoded. This is enforced when you try inserting%c3
into your string, it doesn’t strip it as%c3
is a valid encoding sequence.sanitize_title_with_dashes
result:So as you can see it hasn’t removed the accented characters, but encoded them.
Now let’s look at a string with no accented characters to see how they both behave…
Example String:
%%% building %20 oo %pp + -_^^#@!**()=[]|/'"<>?``~'
sanitize_title()
result:sanitize_title_with_dashes
result:So as you can see they are exactly the same. So it appears the only difference in them is that one encodes accented charters whilst the other replaces them.