自定义永久链接结构使用自定义分类名称,自定义分类术语和默认帖子名称(非CPT)

时间:2017-07-26 13:49:46

标签: wordpress

我正在建立一个根本不使用网页的网站,而是使用帖子(这里的旧学校WP用法)。但是,我不会使用内置的'类别,而是使用四种自定义分类法中的一种。同样,这些自定义分类法将附加到默认帖子,而不是自定义帖子类型。我遇到的问题是永久链接结构。我希望我的帖子永久链接包括分配给它的第一个分类术语,以及分类法的名称。例如:

我有一个名为“学术界”的自定义分类法,其中包含“教育”一词。如果帖子被归类为' education',该帖子的网址应为' / academics / education / postname /'。

即使这篇文章被分类为多个自定义分类术语,我也只想找到第一个在网址中显示的帖子。

以下是我设置分类法的方法:

register_taxonomy( 'academics', 'post', array(
    'labels' => array(
        'name' => __( 'Academics' ),
        'singular_name' => __( 'Academics' ),
        'search_items' => __( 'Search Academics' ),
        'popular_items' => __( 'Popular Academics' ),
        'all_items' => __( 'All Academics' ),
        'parent_item' => null,
        'parent_item_colon' => null,
        'edit_item' => __( 'Edit Academics' ),
        'update_item' => __( 'Update Academics' ),
        'add_new_item' => __( 'Add New Academics' ),
        'new_item_name' => __( 'New Academics Name' ),
        'separate_items_with_commas' => __( 'Separate Academics With Commas' ),
        'add_or_remove_items' => __( 'Add or Remove Academics' ),
        'choose_from_most_used' => __( 'Choose From the Most Used Academics' )
    ),
    'public' => true,
    'hierarchical' => false,
    'show_ui' => true,
    'show_in_quick_edit' => false,
    'meta_box_cb' => false,
    'show_in_nav_menus' => true,
    'show_admin_column' => true,
    'args' => array( 'orderby' => 'term_order' ),
    'rewrite' => true,
    'query_var' => true
) );

然后,我的固定链接结构(在管理区域中)设置如下:

/%custom_category%/%postname%/

然后我有两个函数......第一个函数用与帖子相关的第一个自定义分类法中的第一个术语替换%custom_category%

/**
 * replace the '%custom_category%' tag with the first
 * term slug found for the post
 *
 * @wp-hook post_link
 * @param string $permalink
 * @param WP_Post $post
 * @return string
 */
add_filter( 'post_link', 'custom_taxonomy_permalink', 10, 3 );
add_filter( 'post_type_link', 'custom_taxonomy_permalink', 10, 3 );
function custom_taxonomy_permalink( $permalink, $post_id, $leavename ) {
    if ( strpos( $permalink, '%custom_category%' ) === false ) {
        return $permalink;
    }
    // Get post
    $post = get_post( $post_id );
    if ( ! $post ) {
        return $permalink;
    }
    // Get taxonomy terms
    $terms = wp_get_object_terms( $post->ID, array(
        'academics',
        'art-performance',
        'on-campus-announcements',
        'student-life-events'
    ) );
    if ( ! is_wp_error( $terms ) && ! empty( $terms ) && is_object( $terms[0] ) ) {
        $taxonomy = $terms[0]->taxonomy . '/';
        $taxonomy_slug = $terms[0]->slug;
    } else {
        $taxonomy = '';
        $taxonomy_slug = '';
    }
    return str_replace('%custom_category%', $taxonomy . $taxonomy_slug, $permalink);
}

所有上述工作都很棒,前端的永久链接结构完全匹配我想要的...但是每个帖子都以404的形式返回。所以我假设我需要创建自定义重写。所以我有另一个应该添加重写规则的函数:

    // Function to create custom rewrite rules
    function custom_rewrite_rules( $rules ) {
        $newRules  = array();
        $newRules['academics/(.+)/?$'] = 'index.php?academics=$matches[1]';
        $newRules['academics/(.+)/(.+)/?$'] = 'index.php?pagename=$matches[2]';
        return array_merge( $newRules, $rules );
    }
    add_filter( 'rewrite_rules_array', 'custom_rewrite_rules' );

这是我猜测出错的地方因为我对自定义重写不太熟悉。目前,该功能仅处理学术界的问题。自定义分类法因为我认为如果我使用了这个,我可以对其余的使用相同的逻辑。

任何人都有任何关于为什么我的永久链接无法工作的想法?每次我更改重写时,我都会访问永久链接设置页面以刷新规则。我也使用旧的Monkeyman Rewrite Analyzer插件来查看我的规则生效,所以我知道它们在那里......它们只是不起作用。

0 个答案:

没有答案