7

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.

  • Added code to htaccess, still it didn't work, moreover it broke all my images. – dh47 Mar 6 '19 at 7:34
6
+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).

| improve this answer | |
  • 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 – Milos Nov 6 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 Nov 7 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. – Milos Nov 7 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. – Milos Nov 7 at 11:51
3

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 );
}
| improve this answer | |
  • Sorry, it is not obvious to me: What file should this code be placed in? Thank you! – user20783 Sep 24 '12 at 16:54
  • @DinaDadian This should go into a new plugin. – fuxia Sep 24 '12 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 Sep 26 '12 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 Oct 3 '12 at 1:39
  • Tick the check mark (✔) below the vote buttons if my answer solved your problem. :) – fuxia Oct 3 '12 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.

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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