1

I've followed the code based off this and everything is working perfectly -How to create a permalink structure with custom taxonomies and custom post types like base-name/parent-tax/child-tax/custom-post-type-name

So I am able to browse taxonomy archives with

my/category
(or)
my/category/subcategory

and view a custom post associated with each term as

my/category/subcategory/custompost

However, I cannot view

my/category/page/2/
or
my/category/subcategory/page/2/

It gives me a 404.

Here is the code I am using.

posttype.my.php

function create_my_posttype() {
    register_post_type(
        'my',
    array(
        'labels' => array(
            'name' => _x( 'Mys', 'post type general name' ),
            'singular_name' => _x( 'My', 'post type singular name' ),
            'add_new' => _x( 'New My', 'add new singular name' ),
            'add_new_item' => __( 'Add New My' ),
            'edit_item' => __( 'Edit My' ),
            'new_item' => __( 'New My' ),
            'view_item' => __( 'View My' ),
            'search_items' => __( 'Search Mys' ),
            'not_found' =>  __( 'No Mys Found' ),
            'not_found_in_trash' => __( 'No Mys found in Trash' ),
            'parent_item_colon' => '-:-'
         ),

        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true,
        'query_var' => true,
        'rewrite' => array(
            'slug' => 'my/%mycategory%',
            'with_front' => true,
            'pages' => true
        ),
        'capability_type' => 'post',
        'hierarchical' => true,
        'show_in_nav_menus' => false,
        'menu_position' => 50,
        'supports' => array(
            'title',
            'editor',
            'comments',
            'shortlink'
        ),
    )
);
}

add_action( 'init', 'create_my_posttype');

taxonomy.my.php

add_action( 'init', 'create_my_taxonomies', 0 );

function create_my_taxonomies() {
    register_taxonomy(
            'mycategory',
            'my',
            array(
                    'labels' => array(
                            'name' => 'Mycategories',
            'singular_name' => 'Mycategory',
            'search_items' => 'Search Mycategories',
            'all_items' => 'All Mycategories',
            'parent_item' => 'Parent Mycategories',
                            'add_new_item' => 'Add New Mycategory',
                            'new_item_name' => "New Mycategory",
            'edit_item' => 'Edit Mycategory',
            'update_item' => 'Update Mycategory',
            'add_new_item' => 'Add New Mycategory',
            'new_item_name' => 'New MyCategory Name',
            'menu_name' => 'Mycategory'
                    ),

        'query_var' => true,
                    'show_ui' => true,
        'has_archive' => true,
                    'show_tagcloud' => false,
                    'hierarchical' => true,
                    'with_front' => true,
                    'rewrite' => array(
                            'slug' => 'my',
                            'with_front' => true,
            'hierarchical' => true,
                    )
            )
    );
}

main.php

include( 'posttype.my.php' );
include( 'taxonomy.my.php' );


add_filter('rewrite_rules_array', 'mmp_rewrite_rules');
function mmp_rewrite_rules($rules) {
$newRules  = array();
$newRules['my/(.+)/(.+)/(.+)/?$'] = 'index.php?my=$matches[3]';
$newRules['my/(.+)/?$']                = 'index.php?mycategory=$matches[1]';

return array_merge($newRules, $rules);
}

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

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


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;
}

class main_app {
    function __construct() {
    } // end class main_app


}

If anyone can help or point me in the right direction that'd be amazing. I don't want to resort to separate URL slugs for taxonomies and custom post types :\ Do I have to modify the rewrite rule to include something involving "paged" ?

Thanks

3
  • I know that if I rename my category to 'mys' it's ok, but that's not really what I'm going for.. So it's a slug conflict error but it only conflicts on page2, so I need to add more code in the app.php to recognise the page/2.... – tim daniels Sep 30 '14 at 14:23
  • according to your rewrite rules, my/category/page/2/ will try to load a my post named 2, so yes, you need additional rewrite rules to handle URLs containing page. try using this rewrite analyzer plugin to give you a look at how your URLs are being parsed. – Milo Sep 30 '14 at 15:40
  • Whay! That rewrite analyzer plugin was really helpful :) I added another rewrite rule as the first rule above the other two.. $newRules['my/(.+)/page/?([0-9]{1,})/?$'] = 'index.php?mycategory=$matches[1]&paged=$matches[2]'; Seems to have done the trick! – tim daniels Oct 1 '14 at 9:48
0

Maybe echoing the last query will help debug the problem.
Paste this on your 404 page:

global $wpdb;
echo "<pre>";
var_dump($wpdb->last_query);
die();
0

I ran into a problem with pagination for WordPress custom post types a few months ago. What really helped me was this article on Tuts+. The basic idea is to chain your custom page template (page-my.php) to the archive page template (archive-my.php). This enables pagination for Custom Posttypes, together with a small custom pagination function.

After following the steps in the article I no longer got the dreaded 404 when navigating to page 2 and beyond.

You can see a working example here

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.