0

I have a post type named services with the following permalink DOMAIN/services/investing/ (Single Page Permalink).

I want the permalink to be changed like DOMAIN/investing/. I don't want the POST_TYPE in my permalink.

I updated the permalink settings in WP Dashboad. But it only changed to blog posts, not to the custom post types.

How can I customize the permalink of custom post types?

The POST_TYPE is created using register_post_type as below.

function cp_services() {
  register_post_type('Services', array(
    'labels' => array(
        'name' => 'Services',
        'singular_name' => 'service',
        'add_new_item' => 'Add New Service',
        'edit_item' => 'Edit Service',
    ),
    'description' => 'Services',
    'public' => true,
    'has_archive' => true,
    'menu_position' => 20,
    'show_in_menu' => true,
    'show_in_nav_menus' => true,
    'supports' => array('title','editor','thumbnail')
  ));
}

add_action('init', 'cp_services');
  • How are you creating the custom post type? By plugin or register_post_type? – ChristopherJones Jul 2 at 15:06
  • @ChristopherJones register_post_type – Ramesh Jul 2 at 15:08
  • 1
    See wordpress.stackexchange.com/questions/203951/… - it's complicated, and you run the risk of conflicting with Pages or Posts if you create any of them with the same slugs. – WebElaine Jul 2 at 22:36
  • @WebElaine This worked in my case – Ramesh Jul 3 at 7:52
0

As @WebElaine commented on this question I tried the following code which worked for me.

First, remove the slug from the permalink

function na_remove_slug( $post_link, $post, $leavename ) {

  if ( 'services' != $post->post_type || 'publish' != $post->post_status ) {
      return $post_link;
  }

  $post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );

  return $post_link;
}

add_filter( 'post_type_link', 'na_remove_slug', 10, 3 );

Just removing the slug isn't enough. Right now, you'll get a 404 page because WordPress only expects posts and pages to behave this way. You'll also need to add the following:

function na_parse_request( $query ) {

  if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
      return;
  }

  if ( ! empty( $query->query['name'] ) ) {
      $query->set( 'post_type', array( 'post', 'services', 'page' ) );
  }
}

add_action( 'pre_get_posts', 'na_parse_request' );

Then refresh the permalink.

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.