Creare una pagina 'single' per un Custom Post Type

27 apr 2012, 00:25:03
Visualizzazioni: 157K
Voti: 9

Ok, ho installato il plugin Custom Post Type UI e ne ho creato uno. Ho poi aggiunto un nuovo post. Nel mio tema, ho un pezzo di codice come questo:

<?php 
    $loop = new WP_Query( array( 
        'post_type' => 'case studies',   /* modifica questa riga */
        '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; ?> 

Ora, innanzitutto se clicco sulla miniatura, ottengo un errore nel browser che indica un loop di reindirizzamento, ma in secondo luogo vorrei sapere esattamente quali file devo creare per visualizzare un singolo post di questo custom post type. E cosa inserire in quel file.

2
Commenti

amico, il mio sito non si apre nella singola pagina. Aiutami per favore.

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

@WashingtonLuiz ho convertito la tua risposta in un commento, non pubblicare nuove domande come soluzioni. Sfortunatamente, questo è qualcosa che richiederebbe ulteriore debug e non è adatto alla sezione delle risposte. Ti consiglierei di porre la tua domanda sui Forum di WordPress.

Tom J Nowell Tom J Nowell
23 mar 2021 17:00:05
Tutte le risposte alla domanda 4
0
21

Utilizza single-{posttype}.php per il template singolo. Inoltre, se registri il tuo post type con l'argomento has_archive impostato a true, puoi usare archive-{posttype}.php per il tuo template archivio, il che ti permetterà di saltare quella query che hai lì, dato che l'oggetto globale $wp_query sarà già popolato con il tuo custom post type.

A proposito, hai uno spazio nel tuo argomento post_type, che causerà un problema.

Dai un'occhiata alla Gerarchia dei Template, e considera di registrare i tuoi CPT usando codice in un plugin piuttosto che utilizzare un plugin CPT UI.

27 apr 2012 00:48:56
3

Non è necessario poiché WordPress utilizzerà il template di pagina predefinito, tuttavia puoi creare un file personalizzato single-cpt.php dove cpt è il nome del tuo tipo di post registrato.

<?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
                // Avvia il Loop.
                while ( have_posts() ) : the_post();

                    // Includi il template del contenuto della pagina.
                    get_template_part( 'content', 'page' );

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

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

e dove mettere il file single-cpt.php ?

Eliut Islas Eliut Islas
9 ott 2020 23:14:49

Nella cartella del child theme, dove "cpt" è il nome del tuo custom post type.

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

E se non ho accesso alla cartella del tema e devo gestire tutto tramite un plugin?

Mohal Mohal
25 nov 2021 18:55:13
5

Potresti semplicemente scrivere questo nel tuo file single.php (all'interno del loop) e visualizzare i campi necessari all'interno dell'istruzione if.

if($post_type == 'case_studies') { // potrebbe essere necessario senza spazi (nome macchina)

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

               // ID del post
             $post_id = get_the_ID();
              get_post_meta($post_id, 'nome_campo_personalizzato', true);


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

 }

Un'altra opzione è creare un template di pagina. Copia il tuo file single.php e rinominalo in case_studies.php... all'inizio, all'interno dei tag php aggiungi:

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

e poi aggiungi la stessa istruzione if all'interno del loop di single.php come nell'esempio precedente...

27 apr 2012 00:46:52
Commenti

Funziona, ma è una pessima, pessima pratica, il massimo a cui dovresti avvicinarti è get_template_part('stuff',$post->post_type);

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

Puoi spiegare perché è una cattiva pratica?

Starfs Starfs
27 apr 2012 15:34:28

Perché è codice sporco, hai una tonnellata di istruzioni if else e codice duplicato. Saresti meglio a creare un file template come 'content.php' e usare get_template_part('content',$post_type); e usare content-case_studies.php per sovrascriverlo su base per tipo di post

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

In questo modo il tuo single.php rimane leggibile. Anche in quel caso sarebbe meglio farlo nel modo corretto e usare single-case_studies.php

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

Fantastico. Ho modificato il codice nel mio tema per riflettere questo nuovo metodo per l'output dei custom post type. Grazie per l'informazione

Starfs Starfs
30 apr 2012 21:00:13
0

Custom Post Type in WordPress. Quattro passi fondamentali. Passo 1: Percorso del file: theme/function.php nel tuo tema. Incolla il codice in function.php (registra il custom post type)

<?php

add_action( 'init', 'custom_post_type_func' );
function custom_post_type_func() {
    //posttypename = services
$labels = array(
'name' => _x( 'Servizi', 'services' ),
'singular_name' => _x( 'servizio', 'services' ),
'add_new' => _x( 'Aggiungi nuovo', 'services' ),
'add_new_item' => _x( 'Aggiungi nuovo servizio', 'services' ),
'edit_item' => _x( 'Modifica servizio', 'services' ),
'new_item' => _x( 'Nuovo servizio', 'services' ),
'view_item' => _x( 'Visualizza servizio', 'services' ),
'search_items' => _x( 'Cerca servizi', 'services' ),
'not_found' => _x( 'Nessun servizio trovato', 'services' ),
'not_found_in_trash' => _x( 'Nessun servizio trovato nel cestino', 'services' ),
'parent_item_colon' => _x( 'Servizio genitore:', 'services' ),
'menu_name' => _x( 'Servizi', 'services' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
'description' => 'Ciao, questo è il mio custom post type.',
'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 );
}
?>

Passo 2: come mostrare il custom post type di WordPress in una pagina template?

Puoi mostrarlo ovunque nella pagina template in questo modo:

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

Passo 3: Crea un nuovo template per mostrare il singolo post in questo modo

single-{nome custom post type}.php oppure single-services.php

Passo 4: Incolla il codice nel file single-services.php

 <?php /* The loop */ ?>
            <?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; ?>

Questo è un esempio di custom post type con pagina singola post.

10 apr 2015 09:20:56