Creează o pagină 'single' pentru un Custom Post Type

27 apr. 2012, 00:25:03
Vizualizări: 157K
Voturi: 9

Ok, am instalat plugin-ul Custom Post Type UI și am creat unul. Apoi am adăugat o postare nouă. În tema mea, am un fragment de cod care arată așa:

<?php 
    $loop = new WP_Query( array( 
        'post_type' => 'case studies',   /* editează această linie */
        'posts_per_page' => 15 ) );
?>

<?php while ( $loop->have_posts() ) : $loop->the_post(); ?>  

    <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>" >
        <?php the_post_thumbnail('thumbnail'); ?>
    </a>

<?php endwhile; ?> 

Acum, în primul rând, dacă dau click pe miniatură, primesc o eroare în browser care spune că este într-o buclă de redirecționare, dar în al doilea rând aș vrea să știu exact ce fișiere trebuie să creez pentru a vizualiza o postare individuală a acestui custom post type. Și ce să pun în acel fișier.

2
Comentarii

omule, site-ul meu nu se deschide în single. Ajută-mă te rog.

Washington Luiz Washington Luiz
23 mar. 2021 16:29:11

@WashingtonLuiz Am convertit răspunsul tău într-un comentariu, nu posta întrebări noi ca soluții. Din păcate, acesta este un lucru care ar trebui depanat mai în detaliu și nu este potrivit pentru secțiunea de răspunsuri. Aș recomanda să postezi întrebarea ta pe Forumurile WordPress.

Tom J Nowell Tom J Nowell
23 mar. 2021 17:00:05
Toate răspunsurile la întrebare 4
0
21

Folosește single-{posttype}.php pentru șablonul de postare individuală. De asemenea, dacă îți înregistrezi tipul de postare cu argumentul has_archive setat la true, atunci poți folosi archive-{posttype}.php pentru șablonul tău de arhivă, ceea ce îți va permite să sări peste acea interogare pe care o ai acolo, deoarece obiectul global $wp_query va fi deja populat cu tipul tău personalizat de postare.

Apropo, ai un spațiu în argumentul tău post_type, ceea ce va fi o problemă.

Consultă Ierarhia Șabloanelor și ia în considerare înregistrarea CPT-urilor folosind cod într-un plugin în loc să folosești un plugin de interfață CPT.

27 apr. 2012 00:48:56
3

Nu este nevoie, deoarece WordPress va folosi șablonul implicit de pagină, însă poți crea un fișier personalizat single-cpt.php unde cpt reprezintă numele tipului de post înregistrat.

<?php

get_header(); ?>

<div id="main-content" class="main-content">

    <div id="primary" class="content-area">
        <div id="content" class="site-content" role="main">
            <?php
                // Start the Loop.
                while ( have_posts() ) : the_post();

                    // Include the page content template.
                    get_template_part( 'content', 'page' );

                endwhile;
            ?>
        </div><!-- #content -->
    </div><!-- #primary -->
</div><!-- #main-content -->

<?php
get_sidebar();
get_footer();
10 apr. 2015 12:46:48
Comentarii

și unde să pun fișierul single-cpt.php ?

Eliut Islas Eliut Islas
9 oct. 2020 23:14:49

În folderul child theme, cpt fiind numele tipului tău de post personalizat.

Brad Dalton Brad Dalton
19 apr. 2021 15:58:43

Și dacă nu am acces la folderul Theme și trebuie să gestionez totul într-un plug-in?

Mohal Mohal
25 nov. 2021 18:55:13
5

Poți să scrii acest cod direct în fișierul tău single.php (în interiorul loop-ului) și să afișezi orice câmpuri ai nevoie în interiorul declarației if.

if($post_type == 'case_studies') { // poate fi necesar să fie fără spații (numele mașină)

                echo '<h1>'.get_the_title().' arome</h1>';

               // ID-ul postului
             $post_id = get_the_ID();
              get_post_meta($post_id, 'nume_camp_personalizat', true);


                <a href="<?php the_permalink() ?>"><?php the_post_thumbnail(); ?></a> 
                  <?php endwhile; ?>

 }

O altă opțiune este să creezi un șablon de pagină. Copiază fișierul single.php și redenumește-l case_studies.php .. la început, în interiorul tag-urilor php adaugă:

<?php
/*
Template Name: Brand Output 04/12
*/
?>

și apoi adaugă aceeași declarație if în interiorul loop-ului din single.php ca în exemplul de mai sus...

27 apr. 2012 00:46:52
Comentarii

Aceasta funcționează, dar este o practică foarte proastă, cel mai apropiat lucru de care ar trebui să te apropii este get_template_part('stuff',$post->post_type);

Tom J Nowell Tom J Nowell
27 apr. 2012 01:01:20

poți explica de ce este o practică proastă?

Starfs Starfs
27 apr. 2012 15:34:28

Pentru că este cod murdar, ai o mulțime de instrucțiuni if else și cod duplicat. Ar fi mai bine să creezi un fișier de șablon precum 'content.php' și să folosești get_template_part('content',$post_type); și să utilizezi content-case_studies.php pentru a-l suprascrie pe o bază pe tipul de postare

Tom J Nowell Tom J Nowell
27 apr. 2012 18:01:08

În acest fel, fișierul tău single.php rămâne ușor de citit. Chiar și așa, ar fi mai bine să o faci corect și să folosești single-case_studies.php

Tom J Nowell Tom J Nowell
27 apr. 2012 18:02:00

Super. Am modificat codul din tema mea pentru a reflecta această nouă metodă de afișare a postărilor personalizate. Mulțumesc pentru informație.

Starfs Starfs
30 apr. 2012 21:00:13
0

Tipul de Post Personalizat în WordPress. Patru pași de bază. Pasul 1: Calea fișierului: theme/function.php în tema ta. Lipește codul în function.php (înregistrează tipul de post personalizat)

<?php

add_action( 'init', 'custom_post_type_func' );
function custom_post_type_func() {
    //posttypename = services
$labels = array(
'name' => _x( 'Servicii', 'services' ),
'singular_name' => _x( 'serviciu', 'services' ),
'add_new' => _x( 'Adaugă nou', 'services' ),
'add_new_item' => _x( 'Adaugă serviciu nou', 'services' ),
'edit_item' => _x( 'Editează serviciu', 'services' ),
'new_item' => _x( 'Serviciu nou', 'services' ),
'view_item' => _x( 'Vezi serviciu', 'services' ),
'search_items' => _x( 'Caută servicii', 'services' ),
'not_found' => _x( 'Niciun serviciu găsit', 'services' ),
'not_found_in_trash' => _x( 'Niciun serviciu găsit în Coșul de gunoi', 'services' ),
'parent_item_colon' => _x( 'Serviciu părinte:', 'services' ),
'menu_name' => _x( 'Servicii', 'services' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
'description' => 'Salut, acesta este tipul meu de post personalizat.',
'supports' => array( 'title', 'editor', 'excerpt', 'author', 'thumbnail', 'trackbacks', 'custom-fields', 'comments', 'revisions', 'page-attributes' ),
'taxonomies' => array( 'category', 'post_tag', 'page-category' ),
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'show_in_nav_menus' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'has_archive' => true,
'query_var' => true,
'can_export' => true,
'rewrite' => true,
'capability_type' => 'post'
);
register_post_type( 'services', $args );
}
?>

Pasul 2: cum poți afișa tipul de post personalizat în WordPress pe o pagină de șablon?

Poți afișa oriunde în pagina de șablon astfel:

<?php   $args = array( 'post_type' => 'services', 'posts_per_page' => 20 );
            $loop = new WP_Query( $args );
            while ( $loop->have_posts() ) : $loop->the_post(); ?>
            <div class="services-items">
            <?php the_title(); 
        if ( has_post_thumbnail( $post->ID ) ) {
        echo '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( $post->post_title ) . '">';
        echo get_the_post_thumbnail( $post->ID, 'thumbnail' );
        echo '</a>'; }

?>
            </div>
    <?php endwhile; ?>

Pasul 3: Creează un șablon nou pentru afișarea unui singur post astfel

single-{numele tipului de post personalizat}.php sau single-services.php

Pasul 4: Lipește codul în fișierul single-services.php

 <?php /* Bucla */ ?>
            <?php while ( have_posts() ) : the_post(); ?>
                <div class="main-post-div">
                <div class="single-page-post-heading">
                <h1><?php the_title(); ?></h1>
                </div>
                <div class="content-here">
                <?php  the_content();  ?>
                </div>
                <div class="comment-section-here"
                <?php //comments_template(); ?>
                </div>
                </div>

            <?php endwhile; ?>

Acesta este un exemplu de tip de post personalizat cu pagină de post individual.

10 apr. 2015 09:20:56