Mostrar tipo de entrada personalizada con shortcode
He creado un tipo de entrada personalizada (custom post type) para mi tema de WordPress y una página donde se muestran estas entradas personalizadas. Pero, ¿alguien sabe cómo crear un shortcode que muestre las entradas de un tipo de entrada personalizada?
// Añadir este código en functions.php
function mostrar_custom_posts_shortcode($atts) {
// Definir atributos por defecto
$atts = shortcode_atts(array(
'tipo' => 'post', // tipo de entrada personalizada
'cantidad' => 5, // número de entradas a mostrar
'orden' => 'DESC' // orden de las entradas
), $atts);
$args = array(
'post_type' => $atts['tipo'],
'posts_per_page' => $atts['cantidad'],
'order' => $atts['orden']
);
$query = new WP_Query($args);
$output = '<div class="custom-posts-container">';
if($query->have_posts()) :
while($query->have_posts()) : $query->the_post();
$output .= '<div class="custom-post">';
$output .= '<h2>' . get_the_title() . '</h2>';
$output .= '<div class="content">' . get_the_excerpt() . '</div>';
$output .= '</div>';
endwhile;
wp_reset_postdata();
endif;
$output .= '</div>';
return $output;
}
add_shortcode('custom_posts', 'mostrar_custom_posts_shortcode');
Uso del shortcode:
[custom_posts tipo="nombre_del_custom_post_type" cantidad="5" orden="DESC"]

Creo que básicamente tu pregunta es cómo consultar publicaciones de un tipo de contenido personalizado en un shortcode. Deberías echar un vistazo a la sección de WP_Query de WordPress: https://codex.wordpress.org/Class_Reference/WP_Query
En mi código de ejemplo, creo un shortcode que muestra el título de las últimas publicaciones del tipo 'my-custom-post-type':
<?php
add_shortcode( 'shortcodename', 'display_custom_post_type' );
function display_custom_post_type(){
$args = array(
'post_type' => 'my-custom-post-type',
'post_status' => 'publish'
);
$string = '';
$query = new WP_Query( $args );
if( $query->have_posts() ){
$string .= '<ul>';
while( $query->have_posts() ){
$query->the_post();
$string .= '<li>' . get_the_title() . '</li>';
}
$string .= '</ul>';
}
wp_reset_postdata();
return $string;
}
?>
Dado que un shortcode se ejecuta dentro del loop, deberías usar wp_reset_postdata()
después de terminar tu consulta, para que el Loop Principal funcione como se espera. Más información sobre esta función se puede encontrar aquí: https://codex.wordpress.org/Function_Reference/wp_reset_postdata
Espero que esto te dé un buen punto de partida.

deberías usar wp_reset_postdata
después de un bucle secundario. wp_reset_query
solo es necesario para restaurar el global $wp_query
, que no fue sobrescrito en este caso. wp_reset_query
también llama internamente a wp_reset_postdata
, por lo que funciona aquí, pero es innecesario.
