6

I have created a custom post type in Wordpress which is working great. The only thing I need to solve are the permalinks created by this CTP.

I currently have:

example.com/<custom-post-name>/<post-id>/<postname>/

I want it to only display the post-id:

example.com/<custom-post-name>/<post-id>/

The custom post type is registered with:

function create_post_type_mycustomname() {
    $args = array(
        'capability_type' => 'post',
        'has_archive' => 'mycustomname',
        'rewrite' => array(
            'slug' => '/mycustomname/%post_id%',
            'feeds' => false
        )
    );

    register_post_type('ctp_mycustomname', $args);
}
add_action('init', 'create_post_type_mycustomname');

And the %post_id in the slug is getting replaced with the following:

function custom_post_mycustomname_link($post_link, $post = 0, $leavename = false) {
    if($post->post_type == 'ctp_mycustomname') {
        return str_replace('%post_id%', $post->ID, $post_link);
    }
    else {
        return $post_link;
    }
}
add_filter('post_type_link', 'custom_post_mycustomname_link', 1, 3);

Any hints on how to strip the postname from these kinds of URLs?

7

I found the answer myself - so here is the update to above problem:

Custom post type registration:

function create_post_type_mycustomname() {
    $args = array(
        'capability_type' => 'post',
        'has_archive' => 'mycustomname',
        'rewrite' => array(
            'slug' => '/mycustomname',
            'feeds' => false
        )
    );

    register_post_type('ctp_mycustomname', $args);
}
add_action('init', 'create_post_type_mycustomname');

Change the links:

function mycustomname_links($post_link, $post = 0) {
    if($post->post_type === 'ctp_mycustomname') {
        return home_url('mycustomname/' . $post->ID . '/');
    }
    else{
        return $post_link;
    }
}
add_filter('post_type_link', 'mycustomname_links', 1, 3);

Add the correct rewrites rules:

function mycustomname_rewrites_init(){
    add_rewrite_rule('mycustomname/([0-9]+)?$', 'index.php?post_type=ctp_mycustomname&p=$matches[1]', 'top');
}
add_action('init', 'mycustomname_rewrites_init');

Flush rewrite-rules in Wordpress backend afterwards and you are good to go!

| improve this answer | |
  • great work on solving this yourself. Don't forget to mark it as accepted (the tick on the left of the answer). This way it won't come up in the unanswered lists here :) – Tim Malone May 22 '16 at 10:32

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.