Removing leading zeros from custom permalink structure

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

Read More

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.

Related posts

3 comments

  1. 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).

  2. 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 );
    }
    
  3. 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.

Comments are closed.