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.
You are almost there. The function you need is sanitize_title_with_dashes( $title )
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 using
wp_sanitize_title() ( see
In the function
sanitize_title() we have a filter
sanitize_title. This is interesting, since in the default filters
sanitize_title_with_dashes() is hooked into this filter (see
<?php echo sanitize_title( 'Â+ÄÖßáèäç' ) // aaeoessaeaec ?>
I tried sanitize_title() but it leaves %c2 %a0 in result.
This sounds strange. It would be great to know the input value, but following
sanitize_title() seems to be enough.
sanitize_title() seems to be the only one you need.
In wp-includes/default-filters.php line 211 you will find:
add_filter( 'sanitize_title', 'sanitize_title_with_dashes', 10, 3);
This means that calling
sanitize_title() will first remove all the special characters, then apply the
sanitize_title filter, thus calling
As @JHoffmann pointed out, simply calling
sanitize_title_with_dashes() will not remove special characters.
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:
accents are removed (accented characters are replaced with non-accented equivalents)
Note that it does not replace special accented characters
So, with this example string:
Â+Ä Ö %%% ßá %20 oo %pp + -_^^#@!**()=|\/\'"<>?``~ èäç
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.
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...
%%% building %20 oo %pp + -_^^#@!**()=|\/\'"<>?``~'
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.