Cómo mostrar tipos de entradas personalizadas en la página de inicio

13 oct 2016, 00:22:34
Vistas: 17K
Votos: 4

Estoy intentando crear un portafolio con WordPress usando un Custom Post Type para mostrar mis proyectos. Quiero que cada proyecto aparezca en mi página de inicio estática con una imagen destacada como miniatura, y que al hacer clic en la miniatura me lleve directamente al proyecto.

¿Cómo puedo mostrar Custom Post Types en la página de inicio estática? Quiero mostrar solo los últimos 6 posts, y luego tener un enlace al resto a través de mi navegación.

0
Todas las respuestas a la pregunta 3
1

Edición: Esta respuesta fue escrita antes de darme cuenta de que el OP tiene una página de inicio estática. La he dejado aquí por si es útil para alguien más y he añadido una segunda respuesta para el caso de página de inicio estática.

Esto añadirá tu tipo de publicación personalizada al bucle principal de la página de inicio:

add_action( 'pre_get_posts', 'wpse_242473_add_post_type_to_home' );

function wpse_242473_add_post_type_to_home( $query ) {

    if( $query->is_main_query() && $query->is_home() ) {
        $query->set( 'post_type', array( 'post', 'tu_tipo_de_publicacion_personalizada_aqui') );
    }
}

Verificar is_home asegura que estamos en la página "inicio" principal del blog y is_main_query garantiza que no afectemos inadvertidamente ningún bucle secundario.

Si solo deseas tu tipo de publicación personalizada y no las publicaciones ordinarias, entonces elimina post del array de tipos de publicación.

Hay algunos artículos incorrectos en la web que tratan esta acción como un filtro. No lo es, pasa la consulta por referencia para que puedas establecer los argumentos de la consulta directamente.

13 oct 2016 00:50:22
Comentarios

¿Alguna idea de cómo excluir publicaciones personalizadas sin categoría?

Keyslinger Keyslinger
14 jun 2021 21:46:19
0

Así que si has registrado un CPT llamado wpse_242473_custom_post_type puedes usar esto para mostrar 6 publicaciones recientes de ese tipo en tu página de inicio estática (o en cualquier lugar). Puedes usar un shortcode o una etiqueta de plantilla y la función debería funcionar para ambos casos.

Es una modificación de un código que uso en muchos sitios. Colócalo en el archivo functions.php de tu tema. Por supuesto, modifica el HTML que he usado para adaptarlo a tus necesidades.

He añadido un giro que llevaba tiempo queriendo probar, así que si te da problemas avísame y lo probaré adecuadamente. Lo que he añadido es un conjunto completo de argumentos opcionales que permiten que la misma función funcione, espero, tanto para un shortcode como para una etiqueta de plantilla. Puedes poner [recentposts] en el editor visual de cualquier página, o puedes poner <?php wpse_242473_recent_posts(); ?> en cualquier plantilla de tu tema.

Para colocarlo en la plantilla de tu página de inicio estática, edita (o crea) la plantilla front-page.php. Esta será seleccionada automáticamente para tu página de inicio estática, sin que tengas que seleccionarla en la pantalla de edición de la página.

function wpse_242473_recent_posts( $atts = null, $content = null, $tag = null ) {

    $out = '';

    $args = array( 
        'numberposts' => '6', 
        'post_status' => 'publish', 
        'post_type' => 'wpse_242473_custom_post_type' ,
    );

    $recent = wp_get_recent_posts( $args );

    if ( $recent ) {

        $out .= '<section class="overview">';

        $out .= '<h1>Proyectos Recientes</h1>';

        $out .= '<div class="overview">';

        foreach ( $recent as $item ) {

            $out .= '<a href="' . get_permalink( $item['ID'] ) . '">';
            $out .= get_the_post_thumbnail( $item['ID'] ); 
            $out .= '</a>';
        }

        $out .= '</div></section>';
    }

    if ( $tag ) {
        return $out;
    } else {
        echo $out;
    }

}

add_shortcode( 'recentposts', 'wpse_242473_recent_posts' );

Es una recuperación directa de las publicaciones que deseas.

El bucle foreach construye tu HTML y luego el condicional al final devuelve el HTML, si has usado un shortcode, o lo imprime si estás llamando a la función como una etiqueta de plantilla.

Lo que muchos artículos en la web no muestran es ese tercer argumento pasado a todos los manejadores de shortcodes. Cuando usas el shortcode contiene el nombre del shortcode, por lo que un manejador podría en teoría manejar múltiples shortcodes. En este caso lo estamos usando para determinar si la función fue llamada como un manejador de shortcode o no.

14 oct 2016 12:10:31
0

Puedes seguir los siguientes pasos:
1) Crea una plantilla para tu CPT (Tipo de entrada personalizado)
2) Coloca los siguientes códigos en esa plantilla; reemplaza CPT con el nombre de tu CPT.
3) Abre una nueva página y publícala seleccionando esta plantilla en el panel de la derecha.
4) Finalmente, ve a ajustes, haz clic en lectura y selecciona la página de inicio bajo "Una página estática".

Códigos:

<?php
/**
 * Plantilla de Nombre: CPT
 * @package CPT 
 * @since CPT  1.0
 */ 
get_header(); 

global $paged;  
    if( get_query_var( 'paged' ) ) {
        $paged = get_query_var( 'paged' );
    } elseif( get_query_var( 'page' ) ) {
        $paged = get_query_var( 'page' );
    } else {
        $paged = 1;
    }

    $args = array(
        'post_type'     => 'CPT',
        'posts_per_page'=>6,
        'paged'         => $paged,
    );

    $query = new WP_Query($args);
?>

<?php if ( $blog_query->have_posts() ) : ?>
                            <?php while ( $query->have_posts() ) : $query->the_post(); ?>
                                <div class="post-thumbnail">
                                      <?php if (  (function_exists('has_post_thumbnail')) && (has_post_thumbnail())  ) {?>
                                          <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                                           <?php the_post_thumbnail(); ?>  
                                          </a>
                                        <?php }
                                      ?>
                                </div>

                            <?php endwhile; ?>
<?php endif; ?>

<?php get_footer(); ?>
13 oct 2016 21:14:19