Adicionar base de categoria ao URL no tipo de postagem personalizada / taxonomia

23

Estou criando um sistema do tipo LMS no WordPress, controlado por Custom Post types.
O tipo de postagem é chamado Lessons(com um slug de courses) e possui um custom taxonomy(categoria) chamadocourses .

A estrutura de URL do domínio é exibida agora como:

domain.com/courses/lesson-name.

Eu quero que ele se torne:

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

ou essencialmente:

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

aqui está o plugin que escrevi que está controlando o CPTsagora.

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
fonte
Recentemente, enfrento esse problema. Resolvido! [# 188834] [1] [1]: wordpress.stackexchange.com/questions/94817/…
maheshwaghmare
SOLUÇÃO! (Após pesquisas intermináveis) <br/> <br/> você deve modificar o post_type_linkfiltro. Para mais
informações

Respostas:

36

Altere sua reescrita para adicionar a consulta de curso var:

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

Em seguida, filtre post_type_linkpara inserir o curso selecionado no link 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 );

Também existem plugins, como os Permalinks de tipo de postagem personalizados, que podem fazer isso por você.

Milo
fonte
Obrigado, agradeço sua resposta rápida. Isso faz total sentido. Estou curioso, onde insiro o filtro post_type_link? posso ir na parte inferior de todo o documento?
Zach Russell
Eu adicionei na parte inferior e 404 é a página.
Zach Russell
1
você precisa liberar as reescritas, visite a página de configurações de links permanentes.
Milo
Observe também que você provavelmente terá um conflito com uma taxonomia e um tipo de postagem que compartilham a mesma lesma.
Milo
Onde estou agora é fazer os permalinks corretos, mas não está sendo executado corretamente (é 404ing suave). Alguma recomendação sobre o que posso fazer para que isso funcione corretamente? Estou longe das reescritas do permalink flush. Basta clicar em 'salvar' e atualiza o arquivo (nginx é tão é controlado no arquivo nginx.conf)
Zach Russell
1

Sim! Depois de muita pesquisa, obtive o plugin ' Custom Permalinks ' . O que atende aos meus requisitos - URL personalizado, por exemplo

  • para Categoria
  • para Post
  • para postagem personalizada
  • para taxonomia personalizada etc.

Como este tipo de postagem personalizada - Postagem :

insira a descrição da imagem aqui

maheshwaghmare
fonte
1

Tem a solução!

Para ter links permanentes hierárquicos para o tipo de postagem personalizado, instale link permanente de tipos de postagem personalizados ( https://wordpress.org/plugins/custom-post-type-permalinks/ plug-in ).

Atualize o tipo de postagem registrada. Tenho o nome do tipo de postagem como centro de ajuda

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

E aqui está taxonomia 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 linha faz seu permalink funcionar

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

você pode remover %post_id%e pode manter/%help_centre_category%/%postname%/"

Não se esqueça de liberar permalinks do painel.

Varsha Dhadge
fonte
1

A solução para mim tinha três partes. No meu caso, o tipo de postagem é chamado trainings.

  1. Adicione 'rewrite' => array('slug' => 'trainings/%cat%')à register_post_typefunção.
  2. Mude a lesma para ter uma categoria dinâmica.
  3. "Ouça" o novo URL dinâmico e carregue o modelo apropriado.

Então, aqui está como alterar o link permanente dinamicamente para um determinado tipo de postagem. Adicionar 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 é assim que você carrega o modelo apropriado no novo URL dinâmico. Adicionar 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' );

É isso aí! Lembre-se de atualizar os links permanentes salvando-os novamente no back-end. Ou use a flush_rewrite_rules()função

Floris
fonte
1

Você precisa atualizar a linha abaixo, onde registrou um tipo de postagem personalizado usando a função register_post_type.

'reescrever' => matriz ('slug' => 'cursos /% cat%')

Para alterar o permalink dinamicamente do tipo de postagem, você deve adicionar o código abaixo no arquivo 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' );

Depois disso, é necessário liberar reescritas os permalinks, vá para wp-admin> Configurações> permalinks . basta atualizar a configuração de permalink usando o botão "Salvar alterações".

retornará URLs como abaixo:

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

Obrigado!

Chetan Vaghela
fonte
0

Isso é trabalhado para mim:

'rewrite' => array(
        'slug' => 'portfolio',
        'with_front' => false,
        'hierarchical' => true // to display category/subcategroy
    ),
Malki Mohamed
fonte
5
Isso não utiliza as categorias ou seu caminho, apenas torna o tipo de postagem personalizado hierárquico.
Joris Kroos
0

Para qualquer pessoa interessada na solução, sem precisar mexer no código PHP bruto, recomendo o plugin Permalink Manager Lite, de Maciej Bis. É um salva-vidas.

Possui um mecanismo visual para remover ou adicionar qualquer parte que você desejar na URL do tipo de postagem personalizado com base em 'permastructs':

Captura de tela do Permalink Manager Lite

(Com toda a dor envolvida na estruturação simples de URL com tipos de postagem personalizados, estávamos prestes a desistir do WP e mudar para outro CMS. Mas esse plug-in em conjunto com ACF e CPTUI ou Pods torna o Wordpress bastante profissional.)

Khom Nazid
fonte