Posso atribuir um modelo a um tipo de postagem personalizado?

35

Posso atribuir um arquivo de modelo a um tipo de postagem personalizado?

Criei um tipo de postagem personalizado chamado itemse gostaria de atribuir modelos aos itens, como você pode fazer com as páginas.

Odyss3us
fonte
wpbeginner.com/wp-themes/… (isto é para postagens, mas você pode modificá-lo para CPTs ) nathanrice.net/blog/wordpress-single-post-templates (isto é para postagens, mas você pode modificá-lo para CPTs) boa ideia para um plugin, na verdade.
Wyck 22/07

Respostas:

50

A partir da versão 4.7 do WordPress, agora você pode atribuir modelos de página personalizados a outros tipos de postagens junto com a página.

Para isso, além do cabeçalho do arquivo Nome do modelo, os tipos de postagem suportados por um modelo podem ser especificados usando o Tipo de postagem do modelo: da seguinte maneira.

<?php
/*
Template Name: Full-width page layout
Template Post Type: post, page, product
*/

Você pode obter mais informações sobre isso nas páginas seguintes.

https://wptavern.com/wordpress-4-7-brings-custom-page-template-functionality-to-all-post-types https://make.wordpress.org/core/2016/11/03/post -type-templates-in-4-7 /

Vinod Dalvi
fonte
21

Você pode criar modelos para tipos de postagem personalizados criando arquivos, como por exemplo:

single-mycustomposttype.php

Consulte Hierarquia de modelos no codex.

PS : isso foi respondido.

mike23
fonte
2
Obrigado por isso, mas o que eu gostaria de saber é se é possível adicionar modelos personalizados a tipos de postagem personalizados. Por exemplo, posso criar dois modelos e atribuir cada modelo à sua respectiva postagem? Isso permite especificar apenas um arquivo de modelo para lidar com esse tipo de postagem específico, tanto quanto eu o entendo.
Odyss3us
Veja bem, se você precisar de modelos diferentes para postagens únicas, convém criar vários tipos de postagem personalizados, de acordo com cada modelo necessário. Eu acho que isso depende de quantos modelos diferentes você precisa. o que você fará nos modelos que precisam ser diferentes em cada postagem?
mike23
Esta resposta está desatualizada. Veja a resposta de Vinod Dalvi.
Simon East
8

Aqui está o que funciona para mim:

add_filter('single_template', function($original){
  global $post;
  $post_name = $post->post_name;
  $post_type = $post->post_type;
  $base_name = 'single-' . $post_type . '-' . $post_name . '.php';
  $template = locate_template($base_name);
  if ($template && ! empty($template)) return $template;
  return $original;
});

Assim, uma postagem do tipo de postagem personalizada foobare uma lesma do hello-worldcódigo acima carregariam o single-foobar-hello-world.phpmodelo, se ele existisse.

Chris Carson
fonte
4

Para aqueles que alcançam esse segmento pelo Google, o WP 4.7 introduziu modelos para todos os tipos de postagem. Consulte Make WP Core para obter uma explicação completa. Você não está mais restrito a um modelo para todo o seu CPT. Você pode atribuir modelos individuais post por post, da mesma forma que nas Páginas.

WebElaine
fonte
2

Isso é um pouco antigo, mas você também pode tentar o seguinte:

Crie um modelo para o tipo de postagem personalizada:

single-*custom-post-type-slug*.php

O arquivo deve verificar a lesma e verificar se existe um arquivo, se não houver, fallback para um arquivo de modelo padrão:

<?php 
    $slug = get_post_field( 'post_name', get_post() );
    $slug = ( locate_template( 'templates/*custom-post-type-slug*/' . $slug . '.php' ) ) ? $slug : 'default';

    get_template_part( 'templates/*custom-post-type-slug*/' . $slug  );
?>

Substitua todas as instâncias da lesma pós-tipo personalizada pela lesma real do seu tipo de postagem personalizado.

Faço isso para facilitar o uso e para fins organizacionais. Parece mais limpo para mim do que ter todos os arquivos na pasta raiz do tema.

estrutura de pastas de exemplo:

themeroot
| |single-cases.php
|-templates
| --cases
|   |default.php
|   |case-one.php
|   |case-two.php
eballeste
fonte
1

Primeiro crie na página denominada Itens conforme o seu desejo, que exibe o conteúdo dos tipos de postagem de itens, depois crie um arquivo de modelo como abaixo e nomeie esses itens de modelo. Selecione esse modelo para a página que você criou.

<div class="container">

    <div class="row">

        <div class="col-md-9">
            <div class="panel panel-default text-center">
                <?php $loop = new WP_Query( array( 'post_type' => 'items', 'posts_per_page' => 5 ) ); ?>                        

                        <?php while ( $loop->have_posts() ) : $loop->the_post(); ?>
                            <?php the_title();?>
                            <?php if(has_post_thumbnail() ) { the_post_thumbnail(); } ?>
                            <?php the_content();?>
                        <?php endwhile; ?>

                <?php wp_reset_query(); ?>                      
            </div>
        </div>

    </div>

</div>
aplaudir
fonte
1

Isso é muito simples de fazer.

Crie um novo arquivo PHP no diretório raiz do tema e adicione-o ao topo:

<?php /*
 * Template Name: My custom view
 * Template Post Type: Post_typename   // here you need to add the name of your custom post type
 */ ?>

O exemplo completo será o seguinte:

<?php /*
 * Template Name: My custom view
 * Template Post Type: Post_typename   // here you need to add the name of your custom post type
 */ ?>
<?php get_header();?>


<div class="container pt-5 pb-5">


    <?php if (has_post_thumbnail()):?>

      <img src="<?php the_post_thumbnail_url('largest');?>" class="img-fluid">

    <?php endif;?>




    <?php if (have_posts()) : while (have_posts()) : the_post();?>

        <?php the_content();?>

    <?php endwhile; endif;?>


</div>

<?php get_footer();?>
jerryurenaa
fonte