Dodaj bazę kategorii do adresu URL w niestandardowym typie postu / taksonomii

23

Buduję system typu LMS w WordPress, kontrolowany przez Custom Post types.
Typ postu jest wywoływany Lessons(z informacją courses) i ma jeden custom taxonomy(kategoria) o nazwie courses.

Struktura adresu URL domeny pokazuje się teraz jako:

domain.com/courses/lesson-name.

Chcę, żeby stało się:

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

lub zasadniczo:

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

oto wtyczka, którą napisałem, która kontroluje CPTsteraz.

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 );
Zach Russell
źródło
Ostatnio mam do czynienia z tym problemem. Rozwiązany! [# 188834] [1] [1]: wordpress.stackexchange.com/questions/94817/…
maheshwaghmare
ROZWIĄZANIE! (Po niekończących się badaniach) <br/> <br/> powinieneś zmodyfikować post_type_linkfiltr. więcej na: wordpress.stackexchange.com/a/167992/33667 )
T.Todua

Odpowiedzi:

36

Zmień przepisywanie, aby dodać zapytanie o kurs var:

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

Następnie przefiltruj, post_type_linkaby wstawić wybrany kurs do bezpośredniego łącza:

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

Istnieją również wtyczki, takie jak Niestandardowe łącza typu Post, które mogą to zrobić za Ciebie.

Milo
źródło
Dziękuję, doceniam twoją szybką odpowiedź. Ma to całkowity sens. Ciekawe, gdzie mam wstawić filtr post_type_link? czy mogę po prostu przejść na dół całego dokumentu?
Zach Russell
Dodałem go na dole, a 404 to strona.
Zach Russell
1
musisz przepłukać przepisywania, odwiedź stronę ustawień permalinks.
Milo,
Zwróć też uwagę, że prawdopodobnie zderzysz się z taksonomią i typem postu, które dzielą ten sam ślimak.
Milo,
Teraz jestem w trakcie poprawiania permalinków, ale nie działa poprawnie (to jest miękkie 404). Wszelkie zalecenia dotyczące tego, co mogę zrobić, aby to działało prawidłowo? Brakuje mi przepisywania na stałe. Wystarczy kliknąć „zapisz”, aby zaktualizować plik (jest to nginx, więc jest kontrolowany w pliku nginx.conf)
Zach Russell
1

Tak! Po wielu badaniach dostałem wtyczkę Custom Permalinks . Który spełnia moje wymagania dotyczące - niestandardowy adres URL np

  • dla kategorii
  • na pocztę
  • dla niestandardowego postu
  • dla taksonomii celnej itp.

Jak ten niestandardowy typ postu - Post :

wprowadź opis zdjęcia tutaj

maheshwaghmare
źródło
1

Mam rozwiązanie!

Aby mieć hierarchiczne łącza bezpośrednie dla niestandardowego typu postu, zainstaluj wtyczkę Niestandardowe łącza bezpośrednie typu ( https://wordpress.org/plugins/custom-post-type-permalinks/ ).

Zaktualizuj zarejestrowany typ postu. Mam nazwę typu posta jako centrum pomocy

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

I tutaj jest zarejestrowana taksonomia

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

Ta linia sprawia, że ​​twój link bezpośredni działa

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

możesz usunąć %post_id%i zachować/%help_centre_category%/%postname%/"

Nie zapomnij opróżnić permalinków z deski rozdzielczej.

Varsha Dhadge
źródło
1

Rozwiązanie miało dla mnie trzy części. W moim przypadku nazywany jest typ postu trainings.

  1. Dodaj 'rewrite' => array('slug' => 'trainings/%cat%')do register_post_typefunkcji.
  2. Zmień ślimak, aby mieć kategorię dynamiczną.
  3. „Słuchaj” nowego dynamicznego adresu URL i załaduj odpowiedni szablon.

Oto, jak dynamicznie zmienić bezpośredni link dla danego typu posta. Dodaj do 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 );

... i oto jak załadować odpowiedni szablon do nowego dynamicznego adresu URL. Dodaj do 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' );

To jest to! Pamiętaj, aby odświeżyć permalinki, zapisując je ponownie w de backend. Lub użyj flush_rewrite_rules()funkcji.

Floris
źródło
1

Musisz zaktualizować poniższy wiersz, w którym zarejestrowałeś niestandardowy typ postu za pomocą funkcji register_post_type.

'rewrite' => array ('slug' => 'kursów /% cat%')

Aby dynamicznie zmienić bezpośredni link typu postu, musisz dodać poniższy kod w pliku 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' );

Następnie musisz opróżnić przepisz łącza bezpośrednie, przejdź do wp-admin> Ustawienia> permalinki . po prostu zaktualizuj ustawienie bezpośredniego łącza za pomocą przycisku „Zapisz zmiany”.

zwróci adresy URL jak poniżej:

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

Dziękuję Ci!

Chetan Vaghela
źródło
0

To działa dla mnie:

'rewrite' => array(
        'slug' => 'portfolio',
        'with_front' => false,
        'hierarchical' => true // to display category/subcategroy
    ),
Malki Mohamed
źródło
5
Nie korzysta z kategorii ani ich ścieżki, a jedynie hierarchizuje niestandardowy typ postu.
Joris Kroos,
0

Wszystkim zainteresowanym rozwiązaniem, bez konieczności majstrowania przy surowym kodzie PHP, gorąco polecam wtyczkę Permalink Manager Lite autorstwa Macieja Bisa. To ratownik życia.

Ma wizualny mechanizm do usuwania lub dodawania dowolnej części adresu URL niestandardowego typu postu na podstawie „permastruct”:

Zrzut ekranu programu Permalink Manager Lite

(Przy całym bólu związanym z prostą strukturą adresów URL z niestandardowymi typami postów, mieliśmy zamiar zrezygnować z WP i przejść do innego CMS. Ale ta wtyczka w połączeniu z ACF i CPTUI lub Pods sprawia, że ​​Wordpress jest dość profesjonalny.)

Khom Nazid
źródło