#THE QUESTION Hello! Currently, my permalink settings are set to *"Post Name"* so that the default wordpress posts which are used for articles will have a pretty urls. But then, I have this job post (custom post type as "thjb_job") that needs to have these kinds for permalink structures: For viewing a single job post 1.) **(rootURI) / job-post / %job_id%** and for listing based on employers (employer as a kind of taxonomy) 2.) **(rootURI) / %taxonomy% / job-post / %job_id%** My priority is the item no. 1 as I haven't added the employer taxonomy yet. I have already used wordpress methods like add_rewrite_tag() and add_permastruct() but they seems to not work properly. I have also tried using add_filter('post_type_link') wordpress hook but it seems to just manipulate the permalink string record as it returns 404 when I tried to view the post (by clicking on the permalink while editing the custom post thjb_job). Also, I have read a lot of answers that involves modification of .htaccess. I'm hoping that I won't need to touch .htaccess just to achieve this custom permalink structure. **Thanks in advance for your help on how to achieve the permalink structures above.** --- #THE CODES Here are the ways I'm using the methods mentioned above /** * AddCustomPostJob = Add Custom Post labeled as Job * : this class registers a new custom post type called thjb_job (Job) */ class AddCustomPostJob { /** * init() = Initializer Method * : this method is the class engine starter * */ public static function init() { // Register the custom post type add_action( 'init', array(get_called_class(), 'registerPostType') ); // Register custom rewrite rules for this custom post type add_action( 'init', array(get_called_class(), 'rewriteRules') ); // Register custom url tag translations add_filter( 'post_type_link', array(get_called_class(), 'translateTags'), 10, 2 ); } /** * registerPostType = Register Post Type callback * : this method defines the properties for the custom post type */ public static function registerPostType() { // Define custom type child options // Labels $labels = array( 'name' => __( 'Jobs' ), 'singular_name' => __( 'Job' ) ); // Default fields $supports = array( 'title', 'editor' ); // Turn off wordpress permalink rewrite $rewrite = false; // Define the options for the custom post type $opts = array( 'labels' => $labels, 'public' => true, 'has_archive' => true, 'show_ui' => true, 'show_in_menu' => false, 'show_in_nav_menus' => false, 'show_in_admin_bar' => true, 'supports' => $supports, 'rewrite' => $rewrite, ); // Register the post type with key => thjb_job register_post_type( 'thjb_job', $opts); } // registerPostType() /** * rewriteRules() = Custom rewrite rules method * : this method creates a custom rewrite rules exclusively for thjb_job post type * */ public static function rewriteRules() { // Define the custom permalink structure $structure = '/job-post/%job_id%'; // Map the equivalent query var add_rewrite_tag("%job_id%", '([^/]+)', "p="); // Add the custom permalink structure to wordpess add_permastruct('thjb_job', $structure, false); } /** * translateTags() = Translate url tags method * : this method translates tags (%tags%) to its original value * * @param $url * : this param is the current url to be modified * * @param $post * : this param is the current post being processed * * @return modified $url * */ public static function translateTags($url, $post) { // Apply only for thjb_job post type if ( $post->post_type == 'thjb_job') { // If %job_id% exists, then insert the original value if ( strpos($url, '%job_id%') ) { return str_replace('%job_id%', $post->ID, $url); } } return $url; } } // AddCustomPostJob class AddCustomPostJob::init();