2

I'm trying to remove the Category URI from the WordPress URL and have a custom pagination rewrite. I'll explain exactly what's happening below:

So I have a blog.

We have two (main) categories: "bar-talk" and "tutorials". I'll use "Bar Talk" for the example.

I've found with WordPress, I can actually visit both of these URLs without doing anything custom:

- Current: https://scotch.io/category/bar-talk
- Want: https://scotch.io/bar-talk

However, the pagination that is automatically created breaks:

- Current: https://scotch.io/category/bar-talk/page/2 (works)
- Want: https://scotch.io/bar-talk/page/2 (doesn't work)

This makes sense as we haven't done any custom rewrite yet. How do I get the second structure though? Then, following this, I'd like to do a rewrite on "page" so that we can do:

- Super want: https://scotch.io/bar-talk/drink-number/2

Some additional notes:

Thanks!

3
  • Do you use yoast for SEO? This comes with it: "Strip the category base (usually /category/) from the category URL."
    – Dan
    Commented Jan 20, 2016 at 21:00
  • Love Yoast and read that earlier, but I have a custom SEO implementation on the site.
    – envysea
    Commented Jan 20, 2016 at 21:01
  • I have similar problem. What solution did you end up going with and do you mind sharing it here as an answer? Commented Oct 28, 2016 at 13:48

3 Answers 3

2

Hm. Have you thought about doing some URL rewrites in .htaccess? RewriteRule ^category/bar-talk/page/([0-9]+)$ /bar-talk/drink-number/$1 [L,R=301] RewriteRule ^bar-talk/drink-number/([0-9]+)$ /index.php?category_name=bar-talk&page=$1 [L]

// @drizzlyowl

1
  • Thanks but prefer not to use an .htaccess rewrite for this
    – envysea
    Commented Jan 20, 2016 at 20:53
0

Okay, currently using this craziness. A combination of the "page" rewrite and modified WP No Category Base plugin. Seems to be working perfectly.

/*===========================================================
=            REMOVE CATEGORY / CUSTOM PAGINATION            =
===========================================================*/
register_activation_hook(__FILE__, 'no_category_base_refresh_rules');
add_action('created_category', 'no_category_base_refresh_rules');
add_action('edited_category', 'no_category_base_refresh_rules');
add_action('delete_category', 'no_category_base_refresh_rules');
function no_category_base_refresh_rules() {
    global $wp_rewrite;
    $wp_rewrite -> flush_rules();
}

register_deactivation_hook(__FILE__, 'no_category_base_deactivate');
function no_category_base_deactivate() {
    remove_filter('category_rewrite_rules', 'no_category_base_rewrite_rules');
    // We don't want to insert our custom rules again
    no_category_base_refresh_rules();
}

// Remove category base
add_action('init', 'no_category_base_permastruct');
function no_category_base_permastruct() {
    global $wp_rewrite, $wp_version;
    if (version_compare($wp_version, '3.4', '<')) {
        // For pre-3.4 support
        $wp_rewrite -> extra_permastructs['category'][0] = '%category%';
    } else {
        $wp_rewrite -> extra_permastructs['category']['struct'] = '%category%';
    }
}

// Add our custom category rewrite rules
add_filter('category_rewrite_rules', 'no_category_base_rewrite_rules');
function no_category_base_rewrite_rules($category_rewrite) {
    //var_dump($category_rewrite); // For Debugging

    $category_rewrite = array();
    $categories = get_categories(array('hide_empty' => false));
    foreach ($categories as $category) {
        $category_nicename = $category -> slug;
        if ($category -> parent == $category -> cat_ID)// recursive recursion
            $category -> parent = 0;
        elseif ($category -> parent != 0)
            $category_nicename = get_category_parents($category -> parent, false, '/', true) . $category_nicename;
        $category_rewrite['(' . $category_nicename . ')/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$'] = 'index.php?category_name=$matches[1]&feed=$matches[2]';
        $category_rewrite['(' . $category_nicename . ')/drink-number/?([0-9]{1,})/?$'] = 'index.php?category_name=$matches[1]&paged=$matches[2]';
        $category_rewrite['(' . $category_nicename . ')/?$'] = 'index.php?category_name=$matches[1]';
    }
    // Redirect support from Old Category Base
    global $wp_rewrite;
    $old_category_base = get_option('category_base') ? get_option('category_base') : 'category';
    $old_category_base = trim($old_category_base, '/');
    $category_rewrite[$old_category_base . '/(.*)$'] = 'index.php?category_redirect=$matches[1]';

    //var_dump($category_rewrite); // For Debugging
    return $category_rewrite;
}

// Add 'category_redirect' query variable
add_filter('query_vars', 'no_category_base_query_vars');
function no_category_base_query_vars($public_query_vars) {
    $public_query_vars[] = 'category_redirect';
    return $public_query_vars;
}

// Redirect if 'category_redirect' is set
add_filter('request', 'no_category_base_request');
function no_category_base_request($query_vars) {
    //print_r($query_vars); // For Debugging
    if (isset($query_vars['category_redirect'])) {
        $catlink = trailingslashit(get_option('home')) . user_trailingslashit($query_vars['category_redirect'], 'category');
        status_header(301);
        header("Location: $catlink");
        exit();
    }
    return $query_vars;
}


register_activation_hook(   __FILE__ , 'pagination_flush' );
register_deactivation_hook( __FILE__ , 'pagination_flush' );

add_action('init', function() {
    $GLOBALS['wp_rewrite']->pagination_base = 'drink-number';
});

function pagination_flush() {
    add_action( 'init', 'flush_rewrite_rules', 11 );
}
0

No need to write any code u can just install Remove CPT base plugin and do some settings in this plugin and activate. link: https://wordpress.org/plugins/remove-cpt-base/

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.