5

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 at 7:34
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 );
}
  • 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
3
+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).

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, privacy policy and cookie policy

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