Aggiungi la categoria di base all'URL nel tipo di posta / tassonomia personalizzati


23

Sto costruendo un sistema di tipo LMS in WordPress, controllato da Custom Post types.
Il tipo di post viene chiamato Lessons(con una lumaca di courses) e ha una custom taxonomy(categoria) chiamata courses.

La struttura dell'URL del dominio si presenta in questo momento come:

domain.com/courses/lesson-name.

Voglio che diventi:

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

o essenzialmente:

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

ecco il plugin che ho scritto che controlla CPTsora.

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

Di recente, ho riscontrato questo problema. Risolto! [# 188834] [1] [1]: wordpress.stackexchange.com/questions/94817/…
maheshwaghmare

SOLUZIONE! (Dopo infinite ricerche) <br/> <br/> dovresti modificare il post_type_linkfiltro. altro su: wordpress.stackexchange.com/a/167992/33667 )
T.Todua,

Risposte:


36

Modifica la riscrittura per aggiungere la query del corso var:

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

Quindi filtrare post_type_linkper inserire la rotta selezionata nel permalink:

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

Ci sono anche plugin come permalink di tipo di posta personalizzato che possono farlo per te.


Grazie, apprezzo la tua rapida risposta. Questo ha perfettamente senso. Sono curioso però, dove devo inserire il filtro post_type_link? posso andare in fondo all'intero documento?
Zach Russell,

L'ho aggiunto in fondo e la pagina è 404.
Zach Russell,

1
devi cancellare le riscritture, visitare la pagina delle impostazioni dei permalink.
Milo,

nota anche che probabilmente avrai uno scontro con una tassonomia e un tipo di post che condividono entrambi la stessa lumaca.
Milo,

Dove sono ora sta facendo i permalink giusti, ma non sta eseguendo correttamente (è morbido 404ing). Qualche consiglio su cosa posso fare per farlo funzionare bene? Sono lontano dalle riscritture del permalink flush. Basta fare clic su "Salva" e aggiorna il file (è nginx quindi è controllato nel file nginx.conf)
Zach Russell,

1

Sì! Dopo molte ricerche ho ottenuto il plugin " Permalink personalizzati " . Che soddisfa i miei requisiti per quanto riguarda - URL personalizzato ad es

  • per categoria
  • per posta
  • per posta personalizzata
  • per tassonomia personalizzata ecc.

Come questo tipo di post personalizzato - Posta :

inserisci qui la descrizione dell'immagine


1

Hai la soluzione!

Per avere permalink gerarchici per il tipo di posta personalizzato installare il plug-in Permalink del tipo di posta personalizzato ( https://wordpress.org/plugins/custom-post-type-permalinks/ ).

Aggiorna il tipo di posta registrata. Ho il nome del tipo di post come centro assistenza

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

Ed ecco la tassonomia registrata

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

Questa linea fa funzionare il tuo permalink

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

puoi rimuovere %post_id%e mantenere/%help_centre_category%/%postname%/"

Non dimenticare di svuotare i permalink dal cruscotto.


1

La soluzione per me aveva tre parti. Nel mio caso viene chiamato il tipo di post trainings.

  1. Aggiungi 'rewrite' => array('slug' => 'trainings/%cat%')alla register_post_typefunzione.
  2. Cambia la lumaca per avere una categoria dinamica.
  3. "Ascolta" il nuovo URL dinamico e carica il modello appropriato.

Ecco quindi come modificare il permalink in modo dinamico per un determinato tipo di post. Aggiungi a 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 );

... e questo è come caricare il modello appropriato sul nuovo URL dinamico. Aggiungi a 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' );

Questo è tutto! Ricorda di aggiornare i permalink salvando nuovamente i permalink nel de backend. Oppure usa la flush_rewrite_rules()funzione.


1

Devi aggiornare sotto la riga in cui hai registrato un tipo di post personalizzato utilizzando la funzione register_post_type.

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

Per cambiare il permalink in modo dinamico del tipo di post devi aggiungere il codice qui sotto nel file 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' );

Successivamente, è necessario svuotare i permalink riscrivibili, andare su wp-admin> Impostazioni> permalink . basta aggiornare le impostazioni del permalink usando il pulsante "Salva modifiche".

restituirà gli URL come di seguito:

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

Grazie!


0

Questo ha funzionato per me:

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

5
Questo non fa uso delle categorie o del loro percorso, ma rende gerarchico solo il tipo di post personalizzato.
Joris Kroos,

0

A chiunque sia interessato alla soluzione, senza dover armeggiare con codice PHP non elaborato, consiglio vivamente il plugin Permalink Manager Lite di Maciej Bis. È un salvavita.

Ha un meccanismo visivo per rimuovere o aggiungere qualsiasi parte desiderata nell'URL del tipo di post personalizzato in base a "permastrotti":

Schermata di Permalink Manager Lite

(Con tutto il dolore legato alla semplice strutturazione di URL con tipi di post personalizzati, stavamo per rinunciare a WP e passare a un altro CMS. Ma questo plugin in combinazione con ACF e CPTUI o Pods rende Wordpress abbastanza professionale.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.