Crear una página 'single' para un Tipo de Publicación Personalizada

27 abr 2012, 00:25:03
Vistas: 157K
Votos: 9

Ok, instalé el plugin Custom Post Type UI y creé uno. Luego añadí una nueva publicación. En mi tema, tengo un código como este:

<?php 
    $loop = new WP_Query( array( 
        'post_type' => 'case studies',   /* edita esta línea */
        '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; ?> 

Ahora, primero, si hago clic en la miniatura, obtengo un error en el navegador diciendo que está en un bucle de redirección, pero segundo, me gustaría saber exactamente qué archivos necesito crear para ver una publicación individual de este tipo de publicación personalizada. Y qué poner en ese archivo.

2
Comentarios

hombre, mi sitio web no se abre en el single. Ayúdame por favor.

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

@WashingtonLuiz Convertí tu respuesta en un comentario, no publiques nuevas preguntas como soluciones. Lamentablemente, esto es algo que necesitaría ser depurado más a fondo y no es adecuado para la sección de respuestas. Te recomiendo hacer tu pregunta en los Foros de WordPress.

Tom J Nowell Tom J Nowell
23 mar 2021 17:00:05
Todas las respuestas a la pregunta 4
0
21

Utiliza single-{posttype}.php para la plantilla de entrada individual. Además, si registras tu tipo de contenido con el argumento has_archive establecido en true, entonces podrás usar archive-{posttype}.php para tu plantilla de archivo, lo que te permitirá omitir esa consulta que tienes ahí, ya que el objeto global $wp_query ya estará poblado con tu tipo de contenido personalizado.

Por cierto, tienes un espacio en tu argumento post_type, lo cual será un problema.

Consulta la Jerarquía de Plantillas, y considera registrar tus CPTs usando código en un plugin en lugar de utilizar un plugin de interfaz para CPTs.

27 abr 2012 00:48:56
3

No es necesario ya que WordPress usará la plantilla de página predeterminada, sin embargo puedes crear un archivo personalizado single-cpt.php donde cpt es el nombre de tu tipo de entrada registrado.

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

                    // Incluye la plantilla de contenido de página.
                    get_template_part( 'content', 'page' );

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

<?php
get_sidebar();
get_footer();
10 abr 2015 12:46:48
Comentarios

¿y dónde colocar el archivo single-cpt.php?

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

En la carpeta de tu tema hijo, donde cpt es el nombre de tu tipo de contenido personalizado.

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

¿Qué pasa si no tengo acceso a la carpeta del Tema y tengo que gestionar todo desde un plugin?

Mohal Mohal
25 nov 2021 18:55:13
5

Podrías simplemente escribir esto en tu archivo single.php (dentro del loop) y mostrar los campos que necesites dentro de la sentencia if.

if($post_type == 'case_studies') { // puede que necesites esto sin espacios (nombre de máquina)

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

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


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

 }

Otra opción es crear una plantilla de página. Copia tu archivo single.php y renómbralo como case_studies.php... en la parte superior dentro de las etiquetas php añade:

<?php
/*
Plantilla: Salida de marca 04/12
*/
?>

y luego añade la misma sentencia if dentro del loop de single.php como en el ejemplo anterior...

27 abr 2012 00:46:52
Comentarios

Esto funciona, pero es una mala, mala práctica, lo más cercano que deberías hacer es get_template_part('stuff',$post->post_type);

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

¿Puedes explicar por qué es mala práctica?

Starfs Starfs
27 abr 2012 15:34:28

Porque es código impuro, tienes una tonelada de sentencias if else, y código duplicado. Sería mejor crear un archivo de plantilla como 'content.php', y usar get_template_part('content',$post_type); y utilizar content-case_studies.php para sobrescribirlo según el tipo de publicación

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

De esa manera tu single.php sigue siendo legible. Aun así, sería mejor hacerlo de la manera correcta y usar single-case_studies.php

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

Genial. Cambié el código en mi tema para reflejar este nuevo método de mostrar tipos de post personalizados. Gracias por el aviso

Starfs Starfs
30 abr 2012 21:00:13
0

Tipo de entrada personalizada en WordPress. Cuatro pasos básicos. Paso 1: Ubicación del archivo: tema/functions.php en tu tema. Pega el código en functions.php (registrar tipo de entrada personalizada)

<?php

add_action( 'init', 'custom_post_type_func' );
function custom_post_type_func() {
    //posttypename = services
$labels = array(
'name' => _x( 'Servicios', 'services' ),
'singular_name' => _x( 'servicios', 'services' ),
'add_new' => _x( 'Añadir nuevo', 'services' ),
'add_new_item' => _x( 'Añadir nuevo servicio', 'services' ),
'edit_item' => _x( 'Editar servicio', 'services' ),
'new_item' => _x( 'Nuevo servicio', 'services' ),
'view_item' => _x( 'Ver servicio', 'services' ),
'search_items' => _x( 'Buscar servicios', 'services' ),
'not_found' => _x( 'No se encontraron servicios', 'services' ),
'not_found_in_trash' => _x( 'No se encontraron servicios en la papelera', 'services' ),
'parent_item_colon' => _x( 'Servicio padre:', 'services' ),
'menu_name' => _x( 'Servicios', 'services' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
'description' => 'Hola, este es mi tipo de entrada personalizada.',
'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 );
}
?>

Paso 2: ¿Cómo mostrar el tipo de entrada personalizado de WordPress en la plantilla de página de WordPress?

Puedes mostrarlo en cualquier lugar de la plantilla de página así:

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

Paso 3: Crear una nueva plantilla para mostrar una entrada individual así

single-{nombre del tipo de entrada personalizada}.php o single-services.php

Paso 4: Pega el código en el archivo 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; ?>

Este es un ejemplo de tipo de entrada personalizada con página de entrada individual.

10 abr 2015 09:20:56