कस्टम पोस्ट प्रकार / वर्गीकरण में url में श्रेणी का आधार जोड़ें


23

मैं वर्डप्रेस में एक एलएमएस टाइप सिस्टम बना रहा हूं, जिस पर नियंत्रण है 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 );

हाल ही में, मैं इस मुद्दे का सामना करता हूं। हल किया! [# 188,834] [1] [1]: wordpress.stackexchange.com/questions/94817/...
maheshwaghmare

समाधान! (अंतहीन शोध के बाद) <br/> <br/> आपको post_type_linkफ़िल्टर को संशोधित करना चाहिए । और अधिक: wordpress.stackexchange.com/a/167992/33667 )
T.Todua

जवाबों:


36

पाठ्यक्रम क्वेरी संस्करण जोड़ने के लिए अपना पुनर्लेखन बदलें:

'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 );

कस्टम पोस्ट प्रकार Permalinks जैसे प्लगइन्स भी हैं जो आपके लिए ऐसा कर सकते हैं।


धन्यवाद, मैं आपके तेज उत्तर की सराहना करता हूं। यह पूरी तरह समझ में आता है। हालांकि मैं उत्सुक हूं, मैं फ़िल्टर पोस्ट_टाइप_लिंक कहां डालूं? क्या मैं पूरे दस्तावेज़ के नीचे जा सकता हूँ?
जैच रसेल

मैंने इसे नीचे से जोड़ दिया और यह 404 पृष्ठ है।
जैच रसेल

1
आपको फिर से लिखना होगा, पर्मलिंक सेटिंग पेज पर जाना होगा।
मिलो

यह भी ध्यान दें कि आपके पास एक टैक्सोनॉमी और पोस्ट प्रकार दोनों के साथ एक ही स्लग साझा करने की संभावना होगी।
मिलो

जहां मैं अभी हूं, वह पर्मलिंक को सही बना रहा है, लेकिन यह सही तरीके से निष्पादित नहीं कर रहा है (यह नरम 404 है)। इस कार्य को सही करने के लिए मैं क्या कर सकता हूं, इस पर कोई सिफारिशें मैं पर्मलिंक फ्लश रीराइट्स से दूर हूं। बस 'सेव' पर क्लिक करें और यह फाइल को अपडेट करता है (यह नेगनेक्स है इसलिए इसे nginx.conf फाइल में नियंत्रित किया जाता है)
Zach Russell

1

हां! बहुत शोध के बाद मुझे प्लगइन मिला ' कस्टम पर्मलिंक्स ' । जो मेरी आवश्यकता को पूरा करता है - कस्टम URL उदा

  • श्रेणी के लिए
  • पोस्ट के लिए
  • कस्टम पोस्ट के लिए
  • कस्टम वर्गीकरण के लिए आदि।

इस कस्टम पोस्ट प्रकार की तरह - पोस्ट :

यहाँ छवि विवरण दर्ज करें


1

समाधान मिल गया!

कस्टम पोस्ट प्रकार के लिए पदानुक्रमित पर्मलिंक स्थापित करने के लिए कस्टम पोस्ट प्रकार Permalinks ( 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 फ़ंक्शन का उपयोग करके कस्टम पोस्ट प्रकार दर्ज किया है।

'फिर से लिखना' => सरणी ('स्लग' => 'पाठ्यक्रम /% कैट%')

गतिशील प्रकार के पोस्टलिंक को बदलने के लिए आपको नीचे दिए गए कोड को function.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> Settings> permalinks को फिर से पर्मलिंक फिर से लिखना होगा । बस "परिवर्तन सहेजें" बटन का उपयोग करके सेटिंग को अपडेट करें।

यह नीचे की तरह यूआरएल लौटाएगा:

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

धन्यवाद!


0

यह मेरे लिए काम किया है:

'rewrite' => array(
        'slug' => 'portfolio',
        'with_front' => false,
        'hierarchical' => true // to display category/subcategroy
    ),

5
यह श्रेणियों या उनके पथ का उपयोग नहीं करता है यह केवल कस्टम पोस्ट प्रकार को पदानुक्रमित बनाता है।
जॉरिस क्रोस

0

कच्चे PHP कोड के साथ छेड़छाड़ किए बिना, समाधान में रुचि रखने वाले किसी भी व्यक्ति के लिए, मैं अत्यधिक Macie Bis द्वारा प्लगइन Permalink प्रबंधक लाइट की सिफारिश करता हूं । यह एक जीवन रक्षक है।

इसमें 'पोस्टमास्ट्रक्ट्स' के आधार पर कस्टम पोस्ट प्रकार के URL में जो कुछ भी आप चाहते हैं उसे हटाने या जोड़ने के लिए एक दृश्य तंत्र है:

पर्मलिंक मैनेजर लाइट का स्क्रीनशॉट

(कस्टम पोस्ट प्रकारों के साथ सरल URL संरचना में शामिल सभी दर्द के साथ, हम WP पर हार मानने वाले थे और किसी अन्य CMS में चले गए। लेकिन ACF और CPTUI या पॉड्स के साथ संयोजन में यह प्लगइन Wordpress को काफी पेशेवर बनाता है।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.