Mostrar tipo de entrada personalizada con shortcode

8 abr 2015, 09:35:19
Vistas: 38.6K
Votos: 5

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"]
1
Comentarios

Es posible que sí, pero ¿qué has intentado tú mismo para resolver este problema y en qué parte estás atascado?

Pieter Goosen Pieter Goosen
8 abr 2015 10:15:32
Todas las respuestas a la pregunta 1
1

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.

8 abr 2015 10:14:08
Comentarios

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.

Milo Milo
11 feb 2016 18:15:58