在自定义帖子类型/分类中将类别库添加到url


23

我正在WordPress中构建LMS类型系统,由进行控制Custom Post types
帖子类型称为Lessons(带有courses),并且有一个custom taxonomy(类别)称为courses

域网址结构现在显示为:

domain.com/courses/lesson-name

我希望它成为:

domain.com/courses/[course-name{category}]/lesson-name

或本质上:

/[cpt]/%category%/%postname%/

这是我写的控制CPTs现在的插件。

function rflms_post_type() {
    $labels = array(
        'name'                => _x( 'Lessons', 'Post Type General Name', 'text_domain' ),
        'singular_name'       => _x( 'Lesson', 'Post Type Singular Name', 'text_domain' ),
        'menu_name'           => __( 'Lessons', 'text_domain' ),
        'parent_item_colon'   => __( 'Parent Product:', 'text_domain' ),
        'all_items'           => __( 'All Lessons', 'text_domain' ),
        'view_item'           => __( 'View Lesson', 'text_domain' ),
        'add_new_item'        => __( 'Add New Lesson', 'text_domain' ),
        'add_new'             => __( 'New Lesson', 'text_domain' ),
        'edit_item'           => __( 'Edit Lesson', 'text_domain' ),
        'update_item'         => __( 'Update Lesson', 'text_domain' ),
        'search_items'        => __( 'Search Lessions', 'text_domain' ),
        'not_found'           => __( 'No Lessons Found', 'text_domain' ),
        'not_found_in_trash'  => __( 'No Lessons Found in Trash', 'text_domain' ),
    );

    $args = array(
        'label'               => __( 'Lessons', 'text_domain' ),
        'description'         => __( 'Referable Lessons', 'text_domain' ),
        'labels'              => $labels,
        'hierarchical'        => false,
        'public'              => true,
        'show_ui'             => true,
        'show_in_menu'        => true,
        'show_in_nav_menus'   => true,
        'show_in_admin_bar'   => true,
        'supports'        => array('premise-member-access', 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments'),
        'menu_position'       => 5,
        'menu_icon'           => null,
        'can_export'          => true,
        'has_archive'         => true,
        'exclude_from_search' => false,
        'publicly_queryable'  => true,
        'capability_type'     => 'post',
        'rewrite'                    => array('slug' => 'courses'),
    );

    register_post_type( 'lessons', $args );


// Hook into the 'init' action

}
add_action( 'init', 'rflms_post_type', 0 );

// Register Custom Taxonomy
function custom_taxonomy()  {
    $labels = array(
        'name'                       => _x( 'Courses', 'Taxonomy General Name', 'text_domain' ),
        'singular_name'              => _x( 'Course', 'Taxonomy Singular Name', 'text_domain' ),
        'menu_name'                  => __( 'Courses', 'text_domain' ),
        'all_items'                  => __( 'All Courses', 'text_domain' ),
        'parent_item'                => __( 'Parent Course', 'text_domain' ),
        'parent_item_colon'          => __( 'Parent Course:', 'text_domain' ),
        'new_item_name'              => __( 'New Course Name', 'text_domain' ),
        'add_new_item'               => __( 'Add New Course', 'text_domain' ),
        'edit_item'                  => __( 'Edit Course', 'text_domain' ),
        'update_item'                => __( 'Update Course', 'text_domain' ),
        'separate_items_with_commas' => __( 'Separate Courses with commas', 'text_domain' ),
        'search_items'               => __( 'Search Courses', 'text_domain' ),
        'add_or_remove_items'        => __( 'Add or Remove Courses', 'text_domain' ),
        'choose_from_most_used'      => __( 'Choose from Most Used courses', 'text_domain' ),
    );

    $args = array(
        'labels'                     => $labels,
        'hierarchical'               => true,
        'public'                     => true,
        'show_ui'                    => true,
        'show_admin_column'          => true,
        'show_in_nav_menus'          => true,
        'show_tagcloud'              => false,
        'rewrite'                    => array('slug' => 'courses'),
    );

    register_taxonomy( 'course', 'lessons', $args );
}

// Hook into the 'init' action
add_action( 'init', 'custom_taxonomy', 0 );

最近,我面临这个问题。解决了![#188834] [1] [1]:wordpress.stackexchange.com/questions/94817/...
maheshwaghmare

解!(经过无休止的研究)<br/> <br/>您应该修改post_type_link过滤器。更多信息,请访问:wordpress.stackexchange.com/a/167992/33667
T.Todua

Answers:


36

更改您的重写以添加课程查询var:

'rewrite' => array('slug' => 'courses/%course%')

然后过滤post_type_link以将所选课程插入到永久链接中:

function wpa_course_post_link( $post_link, $id = 0 ){
    $post = get_post($id);  
    if ( is_object( $post ) ){
        $terms = wp_get_object_terms( $post->ID, 'course' );
        if( $terms ){
            return str_replace( '%course%' , $terms[0]->slug , $post_link );
        }
    }
    return $post_link;  
}
add_filter( 'post_type_link', 'wpa_course_post_link', 1, 3 );

还有一些插件,例如“ 自定义帖子类型”永久链接可以为您完成此操作。


谢谢,感谢您的迅速答复。这完全有道理。不过我很好奇,我应该在哪里插入过滤器post_type_link?我可以只浏览整个文档的底部吗?
Zach Russell

我将其添加到底部,它是404的页面。
Zach Russell

1
您必须清除重写,请访问永久链接设置页面。
米洛(Milo)

还请注意,您可能会与分类法和帖子类型发生冲突,两者均共享相同的标签。
米洛(Milo)2013年

我现在所处的位置是正确的永久链接,但执行不正确(它是软404ing)。关于如何使此工作正常的任何建议?我没有永久链接刷新重写。只需单击“保存”,它就会更新文件(它是nginx,因此在nginx.conf文件中进行了控制)
Zach Russell

1

是的 经过大量研究,我得到了插件Custom Permalinks。哪个满足我的要求-自定义URL例如

  • 对于类别
  • 邮寄
  • 自定义帖子
  • 用于自定义分类法等

像这样的自定义帖子类型-帖子

在此处输入图片说明


1

得到了解决方案!

要具有用于自定义帖子类型的分层永久链接,请安装“自定义帖子类型永久链接”(https://wordpress.org/plugins/custom-post-type-permalinks/)插件。

更新注册的帖子类型。我有帖子类型的名称作为帮助中心

function help_centre_post_type(){
    register_post_type('helpcentre', array( 
        'labels'            =>  array(
            'name'          =>      __('Help Center'),
            'singular_name' =>      __('Help Center'),
            'all_items'     =>      __('View Posts'),
            'add_new'       =>      __('New Post'),
            'add_new_item'  =>      __('New Help Center'),
            'edit_item'     =>      __('Edit Help Center'),
            'view_item'     =>      __('View Help Center'),
            'search_items'  =>      __('Search Help Center'),
            'no_found'      =>      __('No Help Center Post Found'),
            'not_found_in_trash' => __('No Help Center Post in Trash')
                                ),
        'public'            =>  true,
        'publicly_queryable'=>  true,
        'show_ui'           =>  true, 
        'query_var'         =>  true,
        'show_in_nav_menus' =>  false,
        'capability_type'   =>  'page',
        'hierarchical'      =>  true,
        'rewrite'=> [
            'slug' => 'help-center',
            "with_front" => false
        ],
        "cptp_permalink_structure" => "/%help_centre_category%/%post_id%-%postname%/",
        'menu_position'     =>  21,
        'supports'          =>  array('title','editor', 'thumbnail'),
        'has_archive'       =>  true
    ));
    flush_rewrite_rules();
}
add_action('init', 'help_centre_post_type');

这是注册分类法

function themes_taxonomy() {  
    register_taxonomy(  
        'help_centre_category',  
        'helpcentre',        
        array(
            'label' => __( 'Categories' ),
            'rewrite'=> [
                'slug' => 'help-center',
                "with_front" => false
            ],
            "cptp_permalink_structure" => "/%help_centre_category%/",
            'hierarchical'               => true,
            'public'                     => true,
            'show_ui'                    => true,
            'show_admin_column'          => true,
            'show_in_nav_menus'          => true,
            'query_var' => true
        ) 
    );  
}  
add_action( 'init', 'themes_taxonomy');

这行使您的永久链接起作用

"cptp_permalink_structure" => "/%help_centre_category%/%post_id%-%postname%/",

您可以删除%post_id%并可以保留/%help_centre_category%/%postname%/"

不要忘记从仪表板清除永久链接。


1

对我来说,解决方案包括三个部分。就我而言,帖子类型称为trainings

  1. 添加'rewrite' => array('slug' => 'trainings/%cat%')register_post_type功能。
  2. 将子弹更改为具有动态类别。
  3. “侦听”新的动态URL并加载适当的模板。

因此,这是如何动态更改给定帖子类型的永久链接。添加到functions.php

function vx_soon_training_post_link( $post_link, $id = 0 ) {
    $post = get_post( $id );
    if ( is_object( $post ) ) {
        $terms = wp_get_object_terms( $post->ID, 'training_cat' );
        if ( $terms ) {
            return str_replace( '%cat%', $terms[0]->slug, $post_link );
        }
    }

    return $post_link;
}

add_filter( 'post_type_link', 'vx_soon_training_post_link', 1, 3 );

...这就是如何在新的动态URL上加载适当的模板。添加到functions.php

function archive_rewrite_rules() {
    add_rewrite_rule(
        '^training/(.*)/(.*)/?$',
        'index.php?post_type=trainings&name=$matches[2]',
        'top'
    );
    //flush_rewrite_rules(); // use only once
}

add_action( 'init', 'archive_rewrite_rules' );

而已!请记住通过在后端再次保存永久链接来刷新永久链接。或使用flush_rewrite_rules()功能。


1

您需要在使用register_post_type函数注册自定义帖子类型的行下方更新。

'重写'=>数组('子弹'=>'课程/%cat%')

要动态更改帖子类型的永久链接,您必须在functions.php文件中添加以下代码:

function change_link( $post_link, $id = 0 ) {
    $post = get_post( $id );
    if( $post->post_type == 'courses' ) 
    {
       if ( is_object( $post ) ) {
          $terms = wp_get_object_terms( $post->ID, array('course') );
          if ( $terms ) {
             return str_replace( '%cat%', $terms[0]->slug, $post_link );
         }
      }
    }
    return   $post_link ;
}
add_filter( 'post_type_link', 'change_link', 1, 3 );

//load the template on the new generated URL otherwise you will get 404's the page

function generated_rewrite_rules() {
   add_rewrite_rule(
       '^courses/(.*)/(.*)/?$',
       'index.php?post_type=courses&name=$matches[2]',
       'top'
   );
}
add_action( 'init', 'generated_rewrite_rules' );

之后,您需要刷新重写永久链接,转到wp-admin>设置>永久链接。只需使用“保存更改”按钮更新永久链接设置。

它会返回如下网址:

  • domain.com/courses/ [课程名称{category}] /课程名称

谢谢!



0

对于对解决方案感兴趣的任何人,而不必修改原始的PHP代码,我强烈推荐Maciej Bis开发的Permalink Manager Lite插件。它可以拯救生命。

它具有可视化机制,可根据“永久结构”在自定义帖子类型的URL中删除或添加所需的任何部分:

Permalink Manager Lite的屏幕截图

(由于具有使用自定义帖子类型的简单URL结构所涉及的所有痛苦,我们将放弃WP而转到另一个CMS。但是,此插件与ACF和CPTUI或Pods结合使用,使Wordpress相当专业。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.