Czy mogę przypisać szablon do niestandardowego typu postu?

35

Czy mogę przypisać plik szablonu do niestandardowego typu postu?

Utworzyłem niestandardowy typ postu o nazwie itemsi chciałbym przypisywać szablony do elementów, tak jak możesz to zrobić ze stronami.

Odyss3us
źródło
wpbeginner.com/wp-themes/… (dotyczy postów, ale możesz to zmodyfikować dla CPT) nathanrice.net/blog/wordpress-single-post-templates (dotyczy postów, ale możesz to zmodyfikować dla CPT) dobry pomysł na wtyczkę.
Wyck

Odpowiedzi:

50

Od wersji 4.7 WordPressa możesz teraz przypisywać niestandardowe szablony stron innym typom postów wraz ze stroną.

Aby to osiągnąć oprócz nagłówka pliku Nazwa szablonu, typy postów obsługiwane przez szablon można określić za pomocą Typu szablonu Szablon: w następujący sposób.

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

Możesz uzyskać więcej informacji na ten temat na następnych stronach.

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
źródło
21

Możesz utworzyć szablon dla niestandardowych typów postów, tworząc pliki, takie jak na przykład:

single-mycustomposttype.php

Zobacz Hierarchia szablonów w kodeksie.

PS : na to już odpowiedziano.

mike23
źródło
2
Dzięki za to, ale chciałbym wiedzieć, czy można dodać niestandardowe szablony do niestandardowych typów postów. Czy na przykład mogę utworzyć dwa szablony i przypisać każdy szablon do odpowiedniego postu? Pozwala to tylko na określenie jednego pliku szablonu do obsługi tego konkretnego typu postu, o ile go rozumiem.
Odyss3us
Widzisz, jeśli potrzebujesz różnych szablonów dla pojedynczych postów, możesz utworzyć kilka niestandardowych typów postów, zgodnie z każdym potrzebnym szablonem. Myślę, że to zależy od tego, ile różnych szablonów potrzebujesz. co zamierzasz zrobić w szablonach, które muszą się różnić w każdym poście?
mike23
Ta odpowiedź jest teraz nieaktualna. Zobacz odpowiedź Vinoda Dalvi.
Simon East
8

Oto, co działa dla mnie:

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

W ten sposób dany post o niestandardowym typie postu foobari informacja o hello-worldpowyższym kodzie załadowałyby single-foobar-hello-world.phpszablon, gdyby istniał.

Chris Carson
źródło
4

Dla osób docierających do tego wątku za pośrednictwem Google WP 4.7 wprowadził szablony dla wszystkich typów postów. Zobacz Make WP Core, aby uzyskać pełny przewodnik. Nie jesteś już ograniczony do jednego szablonu dla całego CPT, możesz przypisywać pojedyncze szablony pocztą, tak jak w przypadku Pages.

WebElaine
źródło
2

To jest trochę stare, ale możesz także spróbować:

Utwórz szablon dla niestandardowego typu postu:

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

Plik powinien sprawdzić informacje o pracy i sprawdzić, czy plik istnieje, jeśli nie, powrót do domyślnego pliku szablonu:

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

Zastąpić wszystkie wystąpienia niestandardowych typu Post-ślimak z rzeczywistą ślimak swojego niestandardowego typu post.

Robię to dla łatwości użycia i celów organizacyjnych. Wydaje mi się czystsze niż posiadanie wszystkich plików w folderze głównym motywu.

przykładowa struktura folderów:

themeroot
| |single-cases.php
|-templates
| --cases
|   |default.php
|   |case-one.php
|   |case-two.php
eballeste
źródło
1

Najpierw utwórz stronę o nazwie Pozycje jako twoje życzenie, która wyświetla treść z typów postów elementów, a następnie utwórz jeden plik szablonu, jak poniżej, i nazwij ten element szablonu. Wybierz szablon dla utworzonej strony.

<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>
klaskać
źródło
1

To jest bardzo proste do zrobienia.

Utwórz nowy plik PHP w katalogu głównym motywu i dodaj go do góry:

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

Pełny przykład będzie następujący:

<?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
źródło