Using WordPress ‘post_type_link’ PHP filter

The post_type_link WordPress PHP filter allows you to modify the permalink of a custom post type.

Usage

add_filter('post_type_link', 'your_custom_function', 10, 4);

function your_custom_function($post_link, $post, $leavename, $sample) {
    // your custom code here
    return $post_link;
}

Parameters

  • $post_link (string) – The post’s permalink.
  • $post (WP_Post) – The post in question.
  • $leavename (bool) – Whether to keep the post name.
  • $sample (bool) – Is it a sample permalink.

More information

See WordPress Developer Resources: post_type_link

Examples

Remove the date from the permalink for a custom post type called ‘events’.

add_filter('post_type_link', 'remove_date_from_permalink', 10, 4);

function remove_date_from_permalink($post_link, $post, $leavename, $sample) {
    if ('events' === $post->post_type) {
        $post_link = str_replace('%year%/%monthnum%/', '', $post_link);
    }
    return $post_link;
}

Add a custom prefix

Add a custom prefix to the permalink for a custom post type called ‘products’.

add_filter('post_type_link', 'add_custom_prefix', 10, 4);

function add_custom_prefix($post_link, $post, $leavename, $sample) {
    if ('products' === $post->post_type) {
        $post_link = str_replace('/products/', '/custom-prefix/products/', $post_link);
    }
    return $post_link;
}

Remove post type slug

Remove the post type slug from the permalink for a custom post type called ‘recipes’.

add_filter('post_type_link', 'remove_post_type_slug', 10, 4);

function remove_post_type_slug($post_link, $post, $leavename, $sample) {
    if ('recipes' === $post->post_type) {
        $post_link = str_replace('/recipes/', '/', $post_link);
    }
    return $post_link;
}

Add a custom post type base

Add a custom base to the permalink for a custom post type called ‘portfolio’.

add_filter('post_type_link', 'add_custom_post_type_base', 10, 4);

function add_custom_post_type_base($post_link, $post, $leavename, $sample) {
    if ('portfolio' === $post->post_type) {
        $post_link = str_replace('/portfolio/', '/our-work/portfolio/', $post_link);
    }
    return $post_link;
}

Append query string

Append a query string parameter to the permalink for a custom post type called ‘movies’.

add_filter('post_type_link', 'append_query_string', 10, 4);

function append_query_string($post_link, $post, $leavename, $sample) {
    if ('movies' === $post->post_type) {
        $post_link .= '?source=website';
    }
    return $post_link;
}