Create a permalink structure with custom taxonomies and custom post types gives 404

Based on topic How to create a permalink structure with custom taxonomies and custom post types like base-name/parent-tax/child-tax/custom-post-type-name

My code is

Read More
// register the new post type
    register_post_type( 'vehicles_listing',
        array( 'labels' => array(
            'name' => __( 'Vehicles' ),
            'singular_name' => __( 'Vehicle' ),
            'add_new' => __( 'Add New' ),
            'add_new_item' => __( 'Create New Vehicle' ),
            'edit' => __( 'Edit' ),
            'edit_item' => __( 'Edit Vehicle' ),
            'new_item' => __( 'New Vehicle' ),
            'view' => __( 'View Vehicles' ),
            'view_item' => __( 'View Vehicles' ),
            'search_items' => __( 'Search Vehicles' ),
            'not_found' => __( 'No vehicles found' ),
            'not_found_in_trash' => __( 'No vehicles found in trash' ),
            'parent' => __( 'Parent vehicle' ),
            ),
            'description' => __( 'This is where you can create new vehicles on your site.' ),
            'public' => true,
            'show_ui' => true,
            'capability_type' => 'post',
            'publicly_queryable' => true,
            'exclude_from_search' => false,
            'menu_position' => 2,
            'menu_icon' => get_stylesheet_directory_uri() . '/images/tag_orange.png',
            'hierarchical' => true,
          '_builtin' => false, // It's a custom post type, not built in!
            'rewrite' => array( 'slug' => 'vehicles/%vehicle_cat%', 'with_front' => true ),
            'query_var' => true,
            'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'custom-fields' ),
            )
);



//hook into the init action and call create_book_taxonomies when it fires
add_action( 'init', 'create_vehicle_taxonomies', 0 );
add_action('admin_init', 'flush_rewrite_rules');

//create two taxonomies, genres and writers for the post type "book"
function create_vehicle_taxonomies() 
{
  // Add new taxonomy, make it hierarchical (like categories)
  $labels = array(
    'name' => _x( 'Vehicle Categories', 'taxonomy general name' ),
    'singular_name' => _x( 'Vehicle Category', 'taxonomy singular name' ),
    'search_items' =>  __( 'Search Vehicle Category' ),
    'all_items' => __( 'All Vehicle Categories' ),
    'parent_item' => __( 'Parent Vehicle Category' ),
    'parent_item_colon' => __( 'Parent Vehicle Category:' ),
    'edit_item' => __( 'Edit Vehicle Category' ), 
    'update_item' => __( 'Update Vehicle Category' ),
    'add_new_item' => __( 'Add New Vehicle Category' ),
    'new_item_name' => __( 'New Vehicle Category Name' ),
    'menu_name' => __( 'Vehicle Categories' ),
  );    

  register_taxonomy('vehicle_cat',array('vehicles_listing'), array(
    'hierarchical' => true,
    'labels' => $labels,
    'show_ui' => true,
    'query_var' => true,
    //'rewrite' => true,
    'rewrite' => array( 'slug' => 'vehicles', 'with_front' => true, 'hierarchical' => true ),
  )); 
}

add_action('vehicle_cat_add_form', 'qtrans_modifyTermFormFor');
add_action('vehicle_cat_edit_form', 'qtrans_modifyTermFormFor');

add_filter('rewrite_rules_array', 'mmp_rewrite_rules');
function mmp_rewrite_rules($rules) {
    $newRules  = array();
    $newRules['/(.+)/(.+)/?$'] = 'index.php?custom_post_type_name=$matches[3]';
    $newRules['/(.+)/?$'] = 'index.php?custom_taxonomy=$matches[1]';
    return array_merge($newRules, $rules);
}

function filter_post_type_link($link, $post)
{
    if ($post->post_type != 'vehicles_listing')
        return $link;

    if ($cats = get_the_terms($post->ID, 'vehicle_cat'))
    {
        $link = str_replace('%vehicle_cat%', get_taxonomy_parents(array_pop($cats)->term_id, 'vehicle_cat', false, '/', true), $link); // see custom function defined below
    }
    return preg_replace('#/+#', '/', $link);
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);


// my own function to do what get_category_parents does for other taxonomies
function get_taxonomy_parents($id, $taxonomy, $link = false, $separator = '/', $nicename = false, $visited = array()) {    
    $chain = '';   
    $parent = &get_term($id, $taxonomy);

    if (is_wp_error($parent)) {
        return $parent;
    }

    if ($nicename)    
        $name = $parent -> slug;        
    else    
        $name = $parent -> name;

    if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) {    
        $visited[] = $parent -> parent;    
        $chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited);

    }

    if ($link) {
        // nothing, can't get this working :(
    } else    
        $chain .= $name. $separator; 
    return $chain;   
}

In wp-admin shows link “http:/mydomain.com/vehicles/truck/man/a4/”
But it generates real link like “http://mydomain.com/mydomain.com/vehicles/truck/man/ret/” and “http:/mydomain.com/vehicles/truck/man/a4/” gives 404. What I’m doing wrong.

Regards.

PART 2.
I have another example according this solution placed in github (https://gist.github.com/kasparsd/2924900)

///////////////////////////////////////////////////////////////////
add_action('init', '_init_recipe_post_type');

function _init_recipe_post_type() {

    // Create taxonomy (ingredients i.e. tags)
    // -------------------------------------------------------------
    register_taxonomy(
        'recipe_ingredient',
        array( 'recipe' ),
        array(
            'labels' => array(
                'name' => __( 'Ingredients' ),
                'singular_name' => __( 'Ingredient' ),
                'search_items' => __( 'Search Ingredients' ),
                'popular_items' => __( 'Popular Ingredients' ),
                'all_items' => __( 'All Ingredients' ),
                'edit_item' => __( 'Edit Ingredient' ),
                'update_item' => __( 'Update Ingredient' ),
                'add_new_item' => __( 'Add New Ingredient' ),
                'new_item_name' => __( 'New Ingredient' ),
            ),
            'public' => true,
            'show_in_nav_menus' => true,
            'show_ui' => true,
            'publicly_queryable' => true,
            'exclude_from_search' => false,
            'hierarchical' => true,
            'query_var' => true,
            // this sets the taxonomy view URL (must have tag base i.e. /with)
            // this can be any depth e.g. food/cooking/recipes/with
            'rewrite' => array( 'slug' => 'recipes', 'with_front' => false ),
        )
    );

    // Create taxonomy (cuisines i.e. categories)
    // -------------------------------------------------------------
    register_taxonomy(
        'recipe_cuisine',
        array( 'recipe' ),
        array(
            'labels' => array(
                'name' => __( 'Cuisines' ),
                'singular_name' => __( 'Cuisine' ),
                'search_items' => __( 'Search Cuisines' ),
                'popular_items' => __( 'Popular Cuisines' ),
                'all_items' => __( 'All Cuisines' ),
                'parent_item' => __( 'Parent Cuisine' ),
                'parent_item_colon' => __( 'Parent Cuisine:' ),
                'edit_item' => __( 'Edit Cuisine' ),
                'update_item' => __( 'Update Cuisine' ),
                'add_new_item' => __( 'Add New Cuisine' ),
                'new_item_name' => __( 'New Cuisine' ),
            ),
            'public' => true,
            'show_in_nav_menus' => true,
            'show_ui' => true,
            'publicly_queryable' => true,
            'exclude_from_search' => false,
            'hierarchical' => true,
            'query_var' => true,
            // this sets the taxonomy view URL (must have category base i.e. /type)
            // this can be any depth e.g. food/cooking/recipes/type
            'rewrite' => array( 'slug' => 'recipes', 'with_front' => false ),
        )
    );  


    // Create post type (recipes i.e. posts)
    // -------------------------------------------------------------
    register_post_type( 'recipe',
        array(
            'capability_type' => 'post',
            'hierarchical' => false,
            'public' => true,
            'show_ui' => true,
            'publicly_queryable' => true,
            'exclude_from_search' => false,
            'menu_position' => 30,
            'labels' => array(
                'name' => __( 'Recipes' ),
                'singular_name' => __( 'Recipe' ),
                'add_new' => __( 'Add New' ),
                'add_new_item' => __( 'Add New Recipe' ),
                'edit' => __( 'Edit Recipe' ),
                'edit_item' => __( 'Edit Recipe' ),
                'new_item' => __( 'New Recipe' ),
                'view' => __( 'View Recipe' ),
                'view_item' => __( 'View Recipe' ),
                'search_items' => __( 'Search Recipe' ),
                'not_found' => __( 'No Recipes found' ),
                'not_found_in_trash' => __( 'No Recipes found in Trash' )
            ),
            'has_archive' => true,
            'supports' => array('title', 'editor', 'excerpt', 'thumbnail'),
            'query_var' => true,
            // this sets where the Recipes section lives and contains a tag to insert the Cuisine in URL below
            // this can be any depth e.g. food/cooking/recipes/%recipe_cuisines%
            'rewrite' => array( 'slug' => 'recipes/%recipe_cuisine%', 'with_front' => true,'hierarchical' => true, ),
        )
    );

    // Make permalinks for Recipes pretty (add Cuisine to URL)
    // -------------------------------------------------------------
    add_filter('post_type_link', 'recipe_permalink_filter_function', 1, 3);
    function recipe_permalink_filter_function( $post_link, $id = 0, $leavename = FALSE ) {
        if ( strpos('%recipe_cuisine%', $post_link) === 'FALSE' ) {
          return $post_link;

        }
        $post = get_post($id);
        if ( !is_object($post) || $post->post_type != 'recipe' ) {
          return $post_link;
        }
        // this calls the term to be added to the URL
        $terms = wp_get_object_terms($post->ID, 'recipe_cuisine');
        if ( !$terms ) {
          return str_replace('recipes/%recipe_cuisine%/', '', $post_link);
        }
        return str_replace('%recipe_cuisine%', $terms[0]->slug, $post_link);
    }


    // -------------------------------------------------------------
    // FIX - Makes permalinks work!
    // This must come at the end of your LAST custom post type
    // REMOVE after development (when everything's working!)
    // -------------------------------------------------------------
///flush_rewrite_rules(); 
    // -------------------------------------------------------------

}

All looks well, but “Error 404 – page not found” stays.
Please help to understand how to solve this issue.

Regards to all who read and reply.

Related posts

Leave a Reply

1 comment

  1. I believe you need to make sure your custom taxonomy does not have a capital letter in the name parameter. It took me quite a while to realize that on a site a few months ago.

    edit:
    My comment refers to the use of register taxonomy, which in second review it looks like you are using the proper naming convention for the taxonomy name parameter.