Agregue la base de categoría a la URL en el tipo de publicación / taxonomía personalizada

23

Estoy construyendo un sistema de tipo LMS en WordPress, controlado por Custom Post types.
El tipo de publicación se llama Lessons(con un slug de courses) y tiene una custom taxonomy(categoría) llamada courses.

La estructura de URL del dominio se muestra ahora como:

domain.com/courses/lesson-name.

Quiero que se convierta en:

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

o esencialmente:

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

Aquí está el complemento que escribí que controla el CPTsahora.

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
fuente
Recientemente, me enfrento a este problema. Resuelto! [# 188834] [1] [1]: wordpress.stackexchange.com/questions/94817/…
maheshwaghmare
¡SOLUCIÓN! (Después de una investigación interminable) <br/> <br/> debe modificar el post_type_linkfiltro. más en: wordpress.stackexchange.com/a/167992/33667 )
T.Todua

Respuestas:

36

Cambie su reescritura para agregar la consulta del curso var:

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

Luego filtre post_type_linkpara insertar el curso seleccionado en el enlace permanente:

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

También hay complementos como enlaces permanentes de tipo de publicación personalizada que pueden hacer esto por usted.

Milo
fuente
Gracias, agradezco su rápida respuesta. Esto tiene mucho sentido. Sin embargo, tengo curiosidad, ¿dónde inserto el filtro post_type_link en? ¿Puedo ir al final de todo el documento?
Zach Russell
Lo agregué al final y es la página 404.
Zach Russell el
1
tienes que vaciar las reescrituras, visita la página de configuración de enlaces permanentes.
Milo
También tenga en cuenta que probablemente tendrá un choque con una taxonomía y un tipo de publicación que comparten la misma babosa.
Milo
Donde estoy ahora es hacer los enlaces permanentes correctos, pero no se ejecuta correctamente (es 404ing suave). ¿Alguna recomendación sobre lo que puedo hacer para que esto funcione correctamente? Estoy lejos de las reescrituras de rubor de enlace permanente. Simplemente haga clic en 'guardar' y actualizará el archivo (es nginx, por lo que está controlado en el archivo nginx.conf)
Zach Russell el
1

¡Sí! Después de mucha investigación, obtuve el complemento ' Permalinks personalizados ' . Lo que cumple con mis requisitos se refiere - URL personalizada por ejemplo

  • para la categoría
  • para publicar
  • para publicaciones personalizadas
  • para taxonomía personalizada, etc.

Me gusta este tipo de mensaje personalizado - Mensaje :

ingrese la descripción de la imagen aquí

maheshwaghmare
fuente
1

¡Tengo la solución!

Para tener enlaces permanentes jerárquicos para el tipo de publicación personalizada, instale el complemento Enlace de tipo de publicación personalizada ( https://wordpress.org/plugins/custom-post-type-permalinks/ ).

Actualizar el tipo de publicación registrada. Tengo el nombre del tipo de publicación como centro de ayuda

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

Y aquí está la taxonomía registrada.

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

Esta línea hace que tu enlace permanente funcione

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

puedes quitar %post_id%y mantener/%help_centre_category%/%postname%/"

No olvides eliminar los enlaces permanentes del tablero de instrumentos.

Varsha Dhadge
fuente
1

La solución para mí tenía tres partes. En mi caso se llama el tipo de publicación trainings.

  1. Añadir 'rewrite' => array('slug' => 'trainings/%cat%')a la register_post_typefunción.
  2. Cambie la babosa para tener una categoría dinámica.
  3. "Escuche" la nueva URL dinámica y cargue la plantilla adecuada.

Así que aquí está cómo cambiar el enlace permanente dinámicamente para un tipo de publicación dado. Añadir 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 );

... y así es como cargar la plantilla adecuada en la nueva URL dinámica. Añadir 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' );

¡Eso es! Recuerde actualizar los enlaces permanentes guardando los enlaces permanentes nuevamente en el back-end. O usa la flush_rewrite_rules()función.

Floris
fuente
1

Debe actualizar la siguiente línea en la que ha registrado un tipo de publicación personalizado utilizando la función register_post_type.

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

Para cambiar el enlace permanente dinámicamente del tipo de publicación, debe agregar el código siguiente en el archivo 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' );

Después de eso, debe volver a escribir los enlaces permanentes, vaya a wp-admin> Configuración> enlaces permanentes . simplemente actualice la configuración del enlace permanente con el botón "Guardar cambios".

devolverá URL como a continuación:

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

¡Gracias!

Chetan Vaghela
fuente
0

Esto me funcionó:

'rewrite' => array(
        'slug' => 'portfolio',
        'with_front' => false,
        'hierarchical' => true // to display category/subcategroy
    ),
Malki Mohamed
fuente
55
Esto no hace uso de las categorías o su ruta, solo hace que el tipo de publicación personalizado sea jerárquico.
Joris Kroos
0

Para cualquiera que esté interesado en la solución, sin tener que jugar con el código PHP sin formato, recomiendo el complemento Permalink Manager Lite de Maciej Bis. Es un salvavidas.

Tiene un mecanismo visual para eliminar o agregar cualquier parte que desee en la URL del tipo de publicación personalizada basada en 'permastructs':

Captura de pantalla de Permalink Manager Lite

(Con todo el dolor involucrado en la estructuración de URL simple con tipos de publicación personalizados, estábamos a punto de renunciar a WP y pasar a otro CMS. Pero este complemento junto con ACF y CPTUI o Pods hace que Wordpress sea bastante profesional).

Khom Nazid
fuente