Özel yazı tipinde / taksonomide url'ye kategori tabanı ekle


23

WordPress'te LMS tipi bir sistem kuruyorum, kontrol ediyorum Custom Post types.
Gönderi tipine Lessonsbir sümüklü böcek denir ve bir coursestane custom taxonomy(kategori) denir courses.

Etki alanı URL'si yapısı şu anda şöyle gösterir:

domain.com/courses/lesson-name.

Olmasını istiyorum:

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

veya esasen:

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

işte yazdığım eklentiyi CPTsşimdi kontrol ediyor .

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

Son zamanlarda bu sorunla karşılaştım. Çözüldü! [# 188834] [1] [1]: wordpress.stackexchange.com/questions/94817/…
maheshwaghmare

ÇÖZÜM! (Sınırsız araştırmadan sonra) <br/> <br/> post_type_linkFiltreyi değiştirmelisiniz . daha fazla: wordpress.stackexchange.com/a/167992/33667 )
T.Todua

Yanıtlar:


36

Kurs sorgusu eklemek için yeniden yazınızı değiştirin:

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

Ardından post_type_link, seçilen rotayı kalıcı bağlantıya eklemek için filtreleyin :

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

Bunu sizin için yapabilen Özel Mesaj Tipi Permalink'ler gibi eklentiler de vardır .


Teşekkürler, hızlı cevabınızı takdir ediyorum. Bu tamamen mantıklı. Yine de merak ediyorum, post_type_link filtresini nereye eklerim? sadece belgenin en altına gidebilir miyim?
Zach Russell

Aşağıya ekledim ve sayfa 404.
Zach Russell

1
yeniden yazmaları temizlemeniz gerekir, kalıcı ayarlar ayarları sayfasını ziyaret edin.
Milo

Ayrıca, muhtemelen aynı taksiti paylaşan bir taksonomiyle ve bir gönderi türüyle çakışacağınızı unutmayın.
Milo

Şu anda olduğum yer, permakları doğru yapmak, ama doğru bir şekilde çalışmıyor (yumuşak 404ing). Bu işi doğru yapmak için ne yapabilirim? Kalıcı floş yeniden yazmalarından uzaktayım. 'Kaydet'i tıklamanız yeterlidir ve dosyayı günceller (nginx böylece nginx.conf dosyasında kontrol edilir)
Zach Russell

1

Evet! Çok fazla araştırmadan sonra ' Özel Permalinks ' eklentisini aldım . Bu benim gereksinimlerimi yerine getiriyor - özel URL örneğin

  • Kategori için
  • Post için
  • Özel Gönderi için
  • Özel Taksonomi vb. için

Bu Özel Yazı Tipini beğendim - Gönderi :

görüntü tanımını buraya girin


1

Çözümü aldım!

Özel gönderi türü için hiyerarşik bağlantılara sahip olmak için Özel Posta Türü Permalinkleri ( https://wordpress.org/plugins/custom-post-type-permalinks/ ) eklentisini yükleyin .

Kayıtlı yayın türünü güncelleyin. Yazı tipi adı yardım merkezi olarak var

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

Ve burada kayıtlı taksonomi

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

Bu çizgi, kalıcı bağlantınızın çalışmasını sağlar

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

kaldırabilir %post_id%ve tutabilirsiniz/%help_centre_category%/%postname%/"

Permalinkleri gösterge panelinden yıkamayı unutma.


1

Benim için çözüm üç bölümden oluşuyordu. Benim durumumda yazı tipi denir trainings.

  1. Ekle 'rewrite' => array('slug' => 'trainings/%cat%')için register_post_typeişlevi.
  2. Dinamik bir kategoriye sahip olmak için sümüklü böcek değiştirin.
  3. Yeni dinamik URL'yi "dinleyin" ve uygun şablonu yükleyin.

Yani burada belirli bir yazı tipi için permalink dinamik olarak nasıl değiştirilir. Ekle 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 );

... ve bu, uygun şablonun yeni dinamik URL'ye nasıl yükleneceğidir. Ekle 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' );

Bu kadar! Permalinkleri arka uçta tekrar kaydederek kalıcı bağlantıları yenilemeyi unutmayın. Veya flush_rewrite_rules()işlevi kullanın .


1

Register_post_type işlevini kullanarak özel bir gönderi türünü kaydettirdiğiniz satırın altını güncellemeniz gerekir.

'rewrite' => array ('slug' => 'kurslar /% cat%')

Permalink'i yazı tipinde dinamik olarak değiştirmek için functions.php dosyasına aşağıdaki kodu eklemeniz gerekir:

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

Bundan sonra, yeniden yazma permalarını yıkamanız gerekir, wp-admin> Settings> permalinks'e gidin . "Değişiklikleri Kaydet" düğmesini kullanarak kalıcı bağlantı ayarını güncellemeniz yeterli.

aşağıdaki gibi url’leri döndürür:

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

Teşekkür ederim!


0

Bu benim için çalıştı:

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

5
Bu, kategorileri veya yollarını kullanmaz, yalnızca özel yazı tipini hiyerarşik yapar.
Joris Kroos,

0

Çözümle ilgilenen herkes için, ham PHP kodu ile uğraşmak zorunda kalmadan, Maciej Bis'in Permalink Manager Lite eklentisini tavsiye ederim . Bu bir hayat kurtarıcı.

Özel yazı türünün URL'sinde, 'permastructs' temeline dayanarak istediğiniz bölümü kaldırmak veya eklemek için görsel bir mekanizma vardır:

Permalink Manager Lite ekran görüntüsü

(Özel gönderi türleriyle basit URL yapılandırmasına dahil olan tüm acılarla, WP'den vazgeçmek ve başka bir CMS'ye geçmek üzereydik. Ancak bu eklenti ACF ve CPTUI veya Pod'larla birlikte Wordpress'i oldukça profesyonel hale getiriyor.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.