Suporte » Desenvolvendo com WordPress » Custom Post Type com Custom Taxonomies

  • Resolvido RTCADMIN

    (@rtcadmin)



    Criei um custom post type ja com taxonomies de categoria, a categoria aparece na lista de categorias mas quando clica no link não carrega nenhum post.

    o problema é na forma de registar ou no loop?

    Functions.php

     register_post_type('videos',
    		array(
    			'labels' => array(
    				'name' => 'Vídeos',
    				'singular_name' => 'Video',
    				'add_new' => 'Adicionar Vídeo',
    				'edit_item' => 'Editar Vídeo',		
    		        'all_items' =>  'Todos os Vídeos',				
    				'add_new_item' => 'Adicionar Novo Vídeo',
    				'search_items' => 'Procurar Vídeo',
                  
    		
    			),
    			'public' => true,
                'taxonomies'            => array( 'category', 'post_tag' ),
                'hierarchical' => true,
                'menu_icon' => 'dashicons-video-alt3',
                'has_archive' => true,
    			'supports' => array('title', 'editor', 'thumbnail', 'comments'),
    		    'menu_position' => 5,
                'exclude_from_search'   => false,
                'capability_type'       => 'post',
    		
                
    		)

    LoopMain

    <?php if ( have_posts() ) : while( have_posts() ) : the_post(); ?>
    <?php if ( ! get_post_format() ) : ?>
    <?php get_template_part('partials/content', 'default');  ?>
    <?php else: ?>
    <?php get_template_part('partials/content', get_post_format() );  ?>
    <?php endif; ?>
    <?php endwhile;  else: ?>
    <?php get_template_part('partials/content', 'none');   endif; ?>
Visualizando 10 respostas - 1 até 10 (de um total de 10)
  • Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Olá, tudo bem?

    Por padrão CPT (custom posts) não aparecem nas listagens de categorias e tags.
    Você precisa adicioná-los ao Loop usando o filtro pre_get_posts:

    function rtcadmin_show_cpt_archives( $query ) {
        if ( ! empty( $query->query_vars['suppress_filters'] ) ) return;
        if ( ! is_category() || ! is_tag() ) return;
        if ( ! $query->is_main_query() ) return;
    
        $post_types = $query->get( 'post_type' );
        $query->set( 'post_type', array_merge( $post_types, 'videos' ) );
    }
    
    add_action( 'pre_get_posts', 'rtcadmin_show_cpt_archives' );

    Explicando:
    – O primeiro IF checa se estamos ignorando os filtros
    – O segundo IF checa se estamos realmente numa página de categoria ou tag
    – O terceiro IF checa se estamos falando do Loop principal
    – Se passar por todos, adicionamos videos à post_type.

    Não testei, mas creio que deve funcionar.
    Por favor, me avise se precisar ajustar algo.

    Abraços

    • Esta resposta foi modificada 3 semanas atrás por  Mário Valney. Razão: Melhoria do Código

    Olá, Mario obrigado pela ajuda

    Eu testei como você disse mas não tive resultados, ainda não carrega os posts type pelo link das categorias localhost/site/categoria/videos/, testei nos dois post-types que criei videos e depoimentos. Também mudei os links permanentes para testar

    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    1 – Existem posts desses Custom Post Types publicados dentro dessa categoria?
    Ou seja, precisa ter um post “videos” dentro da categoria “videos”.

    2 – Consegue testar isso usando o tema padrão do WordPress e sem plugins ativos?

    1 – Existem posts desses Custom Post Types publicados dentro dessa categoria?
    Ou seja, precisa ter um post “videos” dentro da categoria “videos”.

    Existem os custom post types publicados e com as categorias, videos e depoimentos

    2 – Consegue testar isso usando o tema padrão do WordPress e sem plugins ativos?
    Testei em um tema padrão sem plugin ativo e com os post types ja com categoria também não carregam quando clico no link das categorias, aparece nada encontrado

    Isso com o código no functions:

    function rtcadmin_show_cpt_archives( $query ) {
        if ( ! empty( $query->query_vars['suppress_filters'] ) ) return;
        if ( ! is_category() || ! is_tag() ) return;
        if ( ! $query->is_main_query() ) return;
    
        $post_types = $query->get( 'post_type' );
        $query->set( 'post_type', array_merge( $post_types, 'videos' ) );
    }
    
    add_action( 'pre_get_posts', 'rtcadmin_show_cpt_archives' );
    • Esta resposta foi modificada 2 semanas, 6 dias atrás por  RTCADMIN.
    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Antes da linha $query->set coloca:

    echo "OK"; exit;

    Iremos testar se chega lá. Ao carregar o site deve aparecer esse “OK” e parar o carregamento.

    Ficou assim

    function rtcadmin_show_cpt_archives( $query ) {
        if ( ! empty( $query->query_vars['suppress_filters'] ) ) return;
        if ( ! is_category() || ! is_tag() ) return;
        if ( ! $query->is_main_query() ) return;
         
        $post_types = $query->get( 'post_type' );
        
        echo "OK"; exit;
        $query->set( 'post_type', array_merge( $post_types, 'videos' ) );
    }
    
    add_filter( 'pre_get_posts', 'rtcadmin_show_cpt_archives' );

    Não apareceu o “OK” quando carrega em nenhuma pagina
    Testei com tema padrão sem plugin ativo

    • Esta resposta foi modificada 2 semanas, 6 dias atrás por  RTCADMIN.
    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Altera a segunda linha (&& no lugar de ||).
    Não tem como uma página ser category e tag ao mesmo tempo… deixei essa passar rsrsrs

    function rtcadmin_show_cpt_archives( $query ) {
        if ( ! empty( $query->query_vars['suppress_filters'] ) ) return;
        if ( ! is_category() && ! is_tag() ) return;
        if ( ! $query->is_main_query() ) return;
         
        $post_types = $query->get( 'post_type' );
        
        $query->set( 'post_type', array_merge( $post_types, 'videos' ) );
    }
    
    add_filter( 'pre_get_posts', 'rtcadmin_show_cpt_archives' );

    Agora apareceu o “ok”
    Mas deu erro
    Warning: array_merge(): Argument #1 is not an array in functions.php on line 25

    Que seria essa linha:
    $query->set( 'post_type', array_merge( $post_types, 'videos' ) );

    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Troca todo o código por esse aqui:

    function rtcadmin_show_cpt_archives( $query ) {
        if ( ! empty( $query->query_vars['suppress_filters'] ) ) return;
        if ( ! is_category() && ! is_tag() ) return;
        if ( ! $query->is_main_query() ) return;
    
        $post_types = $query->get( 'post_type' );
        $post_types = ( empty( $post_types ) ) ? [ 'post' ] : $post_types;
        $post_types = array_merge( (array) $post_types, [ 'videos' ] );
    
        $query->set( 'post_type', $post_types );
    }
    
    add_filter( 'pre_get_posts', 'rtcadmin_show_cpt_archives' );

    Funcionou perfeitamente
    Adicionei 2 post type videos e depoimentos ambos funcionaram 100%

    function rtcadmin_show_cpt_archives( $query ) {
        if ( ! empty( $query->query_vars['suppress_filters'] ) ) return;
        if ( ! is_category() && ! is_tag() ) return;
        if ( ! $query->is_main_query() ) return;
    
        $post_types = $query->get( 'post_type' );
        $post_types = ( empty( $post_types ) ) ? [ 'post' ] : $post_types;
        $post_types = array_merge( (array) $post_types, [ 'videos', 'depoimentos' ] );
    
        $query->set( 'post_type', $post_types );
    }
    
    add_filter( 'pre_get_posts', 'rtcadmin_show_cpt_archives' );

    Muito obrigado @mariovalney
    Pela ajuda e pela atenção!

Visualizando 10 respostas - 1 até 10 (de um total de 10)
  • Você deve estar logado para responder a este tópico.