为特定类别指定其永久链接结构

时间:2018-03-13 作者:user3183717

就我的网站而言,我将永久链接设置为/blog/%postname%/ 对于所有帖子。

然而,我需要为具有特定类别(在本例中为“推荐”)的帖子提供自己的永久链接结构,其中每个分配了类别“推荐”的帖子返回如下/testimonials/%postname%/ 类别存档页返回为/testimonials/.

以下是我目前掌握的代码:

//Rewrite URLs for "testimonial" category
add_filter( \'post_link\', \'custom_permalink\', 10, 3 );
function custom_permalink( $permalink, $post, $leavename ) {
    // Get the category for the post
    $category = get_the_category($post->ID);
    if (  !empty($category) && $category[0]->cat_name == "Testimonials" ) {
        $cat_name = strtolower($category[0]->cat_name);
        $permalink = trailingslashit( home_url(\'/\'. $cat_name . \'/\' . $post->post_name .\'/\' ) );
    }
    return $permalink;
}

add_action( \'init\', \'custom_rewrite_rules\' );
function custom_rewrite_rules() {
    add_rewrite_rule(
        \'testimonials/([^/]+)(?:/([0-9]+))?/?$\',
        \'index.php?category_name=testimonials&name=$matches[1]&page=$matches[2]\',
        \'top\' // The rule position; either \'top\' or \'bottom\' (default).
    );
}
这将成功返回每个带有“推荐”类别的帖子,如下所示/testimonials/%postname%/. 但是,“类别存档”页面返回为/blog/category/testimonials. 我需要这个作为/testimonials/, 同时仍然返回所有其他帖子/blog/%postname%/

我试着使用这个插件,https://wordpress.org/plugins/custom-permalinks/, 它解决了类别归档页面的问题,但破坏了每个个人的推荐帖子,并将其作为404错误返回。

在这种情况下,我无法将推荐注册为自定义帖子类型,因为它会影响其他网站功能,

2 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

尝试以下步骤:

Step #1: 替换此:

add_action( \'init\', \'custom_rewrite_rules\' );
function custom_rewrite_rules() {
    add_rewrite_rule(
        \'testimonials/([^/]+)(?:/([0-9]+))?/?$\',
        \'index.php?category_name=testimonials&name=$matches[1]&page=$matches[2]\',
        \'top\' // The rule position; either \'top\' or \'bottom\' (default).
    );
}
。。使用此选项:

add_filter( \'category_link\', \'custom_category_permalink\', 10, 2 );
function custom_category_permalink( $link, $cat_id ) {
    $slug = get_term_field( \'slug\', $cat_id, \'category\' );
    if ( ! is_wp_error( $slug ) && \'testimonials\' === $slug ) {
        $link = home_url( user_trailingslashit( \'/testimonials/\', \'category\' ) );
    }
    return $link;
}

add_action( \'init\', \'custom_rewrite_rules\' );
function custom_rewrite_rules() {
    add_rewrite_rule(
        \'testimonials(?:/page/?([0-9]{1,})|)/?$\',
        \'index.php?category_name=testimonials&paged=$matches[1]\',
        \'top\' // The rule position; either \'top\' or \'bottom\' (default).
    );

    add_rewrite_rule(
        \'testimonials/([^/]+)(?:/([0-9]+))?/?$\',
        \'index.php?category_name=testimonials&name=$matches[1]&page=$matches[2]\',
        \'top\' // The rule position; either \'top\' or \'bottom\' (default).
    );
}
Step #2: 转到永久链接设置页面,单击保存更改按钮,而不进行任何更改。

SO网友:tom

为什么不直接添加帖子id呢?如果你只需要这些?你可以用query_vars

add_filter(\'query_vars\', \'my_query_vars\' );
您只需检查您是否属于“特殊”类别,如果是,则添加var。然后利用pre_get_posts 钩子,检查您的帖子是否包含ID,如果是,则更改查询以获得所需的帖子。

结束

相关推荐

GET_CATEGORIES返回顶级类别而不是子类别

我用下面的代码制作了一个基本的子类别导航菜单。问题出在一个类别上(没有子类别),它将顶级类别作为子类别返回,例如:新闻、未分类等(我尝试分配子类别,但它实际上从菜单中消失,而不是修复内容)这可能是什么原因造成的?function display_category_breadcrumbs () { $current_cat_id = get_cat_id( single_cat_title(\"\",false) ); $parent_cats = get_categ