8

My WordPress website currently uses this custom permalink structure: %author%/%year%/%monthnum%/%day%/%postname%

In this case, %monthnum% instantiates numbered dates with a leading zero -- e.g., "09" for September. So, a sample URL might look like this:
mywebsite.com/username/2012/09/12/post-name

Is there a function I can add or .htaccess change that I can make which will remove the leading zeros from my permalink stucture? So, using the example above, my URLs would ideally look like this:
mywebsite.com/username/2012/9/12/post-name

Thank you! I've read up on WordPress' structure tags documentation (http://codex.wordpress.org/Using_Permalinks), but I can't find any solutions or plugins for the above-mentioned problem.

1
  • Added code to htaccess, still it didn't work, moreover it broke all my images.
    – dh47
    Commented Mar 6, 2019 at 7:34

3 Answers 3

8
+50

How about using custom rewrite tags/structure?

So we'll be using these two rewrite/structure tags:

  1. %monthnum2% does the same thing as the %monthnum% tag, but without a leading zero; e.g. 3 and not 03 for March.

  2. %day2% does the same thing as the %day% tag, but without a leading zero; e.g. 7 and not 07.

The steps:

  1. In the theme functions file (functions.php), add:

    add_action( 'init', function(){
        add_rewrite_tag( '%monthnum2%', '([0-9]{1,2})', 'monthnum=' );
        add_rewrite_tag( '%day2%',      '([0-9]{1,2})', 'day=' );
    } );
    

    That will generate the %monthnum2% and %day2% (rewrite) tags and be used when WordPress (re-)generates the rewrite rules.

    And then add this:

    add_filter( 'post_link', function( $permalink, $post ){
        if ( preg_match( '/%(?:monthnum2|day2)%/', $permalink ) ) {
            $time = strtotime( $post->post_date );
            $date = explode( ' ', date( 'n j', $time ) );
    
            $permalink = str_replace( [
                '%monthnum2%',
                '%day2%',
            ], [
                $date[0],
                $date[1],
            ], $permalink );
    
            $permalink = user_trailingslashit( $permalink, 'single' );
        }
        return $permalink;
    }, 10, 2 );
    

    That will replace the rewrite tags in the permalink.

  2. Go to the permalink settings page and then in the "Custom Structure" box, enter this structure: /%year%/%monthnum2%/%day2%/%postname%/ or /%author%/%year%/%monthnum2%/%day2%/%postname%, whichever applies.

    The point is, use %monthnum2% to display the month number without a leading zero and %day2% to display the day number without a leading zero.

  3. Save your changes — both the theme functions file and the permalink settings — and go to the "Posts" page (wp-admin/edit.php) and just check everything (mouse-over the post permalink and visit the post).

6
  • I just tried this on plain wp install and it doesn't work. I have tested the $permalink value being returned, and that's good. It's just that wordpress still puts 0s in. Perhaps it's .htaccess, not sure
    – errorous
    Commented Nov 6, 2020 at 6:00
  • 1
    @Milos, I tested the code on a default WordPress 5.5.3 install, and the code worked fine for me. So, are you aware that the answer is for the default post post type only? Have you followed all of the steps like using %monthnum2% in place of %monthnum% - note the 2.
    – Sally CJ
    Commented Nov 7, 2020 at 8:35
  • yes, as I said, tested on plain install, no plugins whatsoever. Used the code in twentytwenty theme, used monthnum2 and day2, and it still shows original urls. Also, I have tested your code, just before permalink is returned, the proper permalink is returned, that's for sure.
    – errorous
    Commented Nov 7, 2020 at 11:39
  • 1
    Ok, to add to this. Not sure why, but on this server, apparently, setting callbacks as anonymous functions doesn't work. So yeah, it's all good now.
    – errorous
    Commented Nov 7, 2020 at 11:51
  • 2
    @CrandellWS not sure if you're still looking.. but you can do that using a filter hook named available_permalink_structure_tags. See example here. PS: Sorry for the late reply..
    – Sally CJ
    Commented Dec 9, 2022 at 8:43
4

Filter 'month_link' and 'day_link', WordPress will find the matching posts then without further work.

Sample code:

add_filter( 'month_link', 't5_strip_leading_zeros_in_url' );
add_filter( 'day_link',   't5_strip_leading_zeros_in_url' );

function t5_strip_leading_zeros_in_url( $url )
{
    // no pretty permalinks
    if ( ! $GLOBALS['wp_rewrite']->get_month_permastruct() )
    {
        return $url;
    }

    return str_replace( '/0', '/', $url );
}
6
  • Sorry, it is not obvious to me: What file should this code be placed in? Thank you!
    – user20783
    Commented Sep 24, 2012 at 16:54
  • @DinaDadian This should go into a new plugin.
    – fuxia
    Commented Sep 24, 2012 at 16:55
  • @toscho Thank you! I tried using this code in a new plugin (my plugin activated just fine), but I'm not seeing a change in my permalinks structure. Also tried adding the code to my functions.php file, but this didn't work either. Sorry! Any ideas? In case this matters, one more detail -- my website is built on top of BuddyPress 1.6.
    – user20567
    Commented Sep 26, 2012 at 19:30
  • Ah, someone helped me pinpoint the issue here. The solution above applies to month and day links. In order to have it apply to the entire post link, add this to the beginning of @toscho's code: add_filter( 'the_permalink', 't5_strip_leading_zeros_in_url' ); Works great for me. Thanks for your help!
    – user20567
    Commented Oct 3, 2012 at 1:39
  • Tick the check mark (✔) below the vote buttons if my answer solved your problem. :)
    – fuxia
    Commented Oct 3, 2012 at 1:49
0

htaccess solution

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^/.*?/.*?/[0][1-9]/.*?/.*?$
RewriteRule ^(.*?)/(.*?)/[0]([1-9])/ /$1/$2/$3/ [R=301]
</IfModule>

I created a working example for you to test here

What this does is check for the path structure provided if the third path contains, a leading 0 and number 1-9, eg /03/, then applies the rewrite rule to the third-path, leaving the first two paths and additional paths intact (.*?)/(.*?)/. The rule only changes the third path if that path matches (01-09) [0]([1-9]) from eg /03/ to /3/.

Does not affect /uploads/ month images path because the uploads structure does not match the structure provided. Please test using above link to see if it suits your needs.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.