Include Post Format in permalink

I’m running the latest version of WordPress with pretty permalinks enabled.

I’m looking for a way to include the Post Format type (eg: link, status, quote) in the post’s permalink. When the post has no format assigned, or uses the ‘standard’ format, I want that part of the permalink to empty.

Read More

Example using the link post format:

http://example.com/link/look-at-this-cool-site/

Example using the quote post format:

http://example.com/quote/example-quote-post

Example using no post format:

http://example.com/just-another-post

Edit: See my answer for progress

Related posts

Leave a Reply

2 comments

  1. While researching this topic myself, I found a plugin called Post Format Permalink. However, this plugin is not compatible with recent versions of WordPress; it is also filled with unnecessary code.

    I forked the plugin’s repository on GitHub, and improved the code greatly. I can now use a %post_format% tag in my permalink structure, and that works fine. Mostly.

    The problem is, posts with no post format are displaying as http://example.com/standard/just-another-post, which is not the desired outcome. I’ll keep working on this, and post an update here.

    Here is the code I used. It can also be found on GitHub:

    <?php
    /**
     * Plugin Name: Post Format Permalink
     * Plugin URI: https://wordpress.stackexchange.com/q/70627/19726
     * Description: Include the post format slug in your permalinks. Simply use the <code>%post_format%</code> tag as part of your custom permalink.
     * Version: 1.2
     * Author: shea
     * Author URI: https://wordpress.stackexchange.com/users/19726
     */
    
    add_filter( 'post_link', 'post_format_permalink', 10, 2 );
    add_filter( 'post_type_link', 'post_format_permalink', 10, 2 );
    
    function post_format_permalink( $permalink, $post_id ) {
    
        // if we're not using the %post_format% tag in our permalinks, bail early
        if ( strpos($permalink, '%post_format%') === FALSE ) return $permalink;
    
        // get the post object
        $post = get_post( $post_id );
        if ( ! $post ) return $permalink;
    
        // get post format slug
        $format = get_post_format( $post->ID );
    
        // set the slug for standard posts
        if ( empty( $format ) )
            $format = apply_filters( 'post_format_standard_slug', 'standard' );
    
        // apply the post format slug to the permalink
        return str_replace( '%post_format%', $format, $permalink );
    }
    
  2. You can add a custom slug to the permalinks via plugin and use this inside your custom permalinks; dont forgett to update the permalinks. It is important, that the rules was refreshed. The follow source is a exmaple for use post format with the string %postformat%, but not perfectly code. Better is to load on hook plugins_loaded and not create a new class, but enough to test and use it now.

    Please check this, current untested. I have write this for long time.

    <?php
    /**
     * Plugin Name: Post Format Permalink
     * Description: Allow to use Post Format as Permalink; inlcude %postformat% in custom permalink
     */
    
    class Fb_Add_Post_Format_Permalink {
    
        function __construct() {
    
            add_filter( 'pre_post_link', array( $this, 'generate_permalink' ), 10, 2 );
            add_filter( 'post_rewrite_rules', array( $this, 'rewrite_rules' ) );
            add_filter( 'generate_rewrite_rules', array( $this, 'generate_rewrite_rules' ) );
        }
    
        function generate_permalink( $permalink, $post ) {
            global $standard_slug;
    
            if ( FALSE === strpos( $permalink, '%postformat%' ) )
                return $permalink;
    
            if ( ! is_object( $post ) )
                $post = get_post( $post_id );
    
            $postformat = get_post_format( $post->ID );
            if ( empty( $postformat ) )
                $postformat = ! empty($standard_slug) ? $standard_slug : 'standard';
    
            return str_replace( '%postformat%', $postformat, $permalink );
        }
    
        function generate_rewrite_rules( $wp_rewrite ) {
            global $clean_post_rewrites;
    
            $wp_rewrite->rules = $wp_rewrite->rules + $clean_post_rewrites;
        }
    
        function rewrite_rules( $post_rewrite ) {
            global $clean_post_rewrites, $wp_rewrite, $standard_slug;
    
            $wp_rewrite->use_verbose_page_rules = TRUE;
    
            $post_format_slugs = implode( '|', get_post_format_slugs() );
            if ( ! empty($standard_slug) )
                $post_format_slugs = preg_replace( '|standard|', $standard_slug, $post_format_slugs, 1 );
    
            while ( list($k, $v) = each( $post_rewrite ) ) {
                $new_k = preg_replace( '|%postformat%|', '(' . $post_format_slugs . ')', $k, 1 );
                $clean_post_rewrites[$new_k] = $v;
            }
    
            return $post_rewrite;
        }
    
    }
    $post_format = new Fb_Add_Post_Format_Permalink();