Incluyendo tipos de publicaciones personalizadas en el widget de "Publicaciones recientes"

2

Puedo incluir fácilmente mis tipos de publicaciones personalizadas en mi ciclo principal haciendo pequeños ajustes con query_posts() , pero no estoy seguro de cómo incluiría los tipos de publicaciones personalizadas en el widget de la barra lateral "Publicaciones recientes" (o cualquiera de los otros widgets, para el caso).

¿Qué debo hacer para ampliar el alcance de "Publicaciones recientes" para incluir más que solo el tipo de publicación nativa?

    
pregunta Sampson 30.09.2010 - 16:36

6 respuestas

8

Tendrás que editar el código para el widget Entradas recientes o crear tu propia versión basada en el valor predeterminado. El código está en el archivo wp-includes/default-widgets.php alrededor de la línea 513. Pero como nunca debe realizar modificaciones en el núcleo, mi recomendación sería copiar el código para crear su propio widget Mis publicaciones recientes personalizadas y usar ese en tu sitio. Simplemente suelte la nueva clase de widget en el archivo functions.php de su tema o utilícelo en un complemento.

La única modificación real que debe hacer es el nombre de clase del widget y las funciones y opciones encapsuladas (para que no haya ningún conflicto de nombres con el widget original Entradas recientes . Después de eso, Deberá editar la llamada a WP_Query en el constructor widget() para que incluya su tipo de publicación personalizada.

Para este ejemplo, he establecido post_type igual a array('post, 'page', 'custom-post-type') ... necesitarás modificarlo para que se ajuste a tu caso de uso específico.

Aquí está el código completo del widget para referencia:

/**
  * My_Custom_Recent_Posts widget class
  *
  */
class WP_Widget_My_Custom_Recent_Posts extends WP_Widget {

    function WP_Widget_My_Custom_Recent_Posts() {
        $widget_ops = array('classname' => 'widget_my_custom_recent_entries', 'description' => __( "The most recent posts on your site") );
        $this->WP_Widget('my-custom-recent-posts', __('My Custom Recent Posts'), $widget_ops);
        $this->alt_option_name = 'widget_my_custom_recent_entries';

        add_action( 'save_post', array(&$this, 'flush_widget_cache') );
        add_action( 'deleted_post', array(&$this, 'flush_widget_cache') );
        add_action( 'switch_theme', array(&$this, 'flush_widget_cache') );
    }

    function widget($args, $instance) {
        $cache = wp_cache_get('widget_my_custom_recent_posts', 'widget');

        if ( !is_array($cache) )
            $cache = array();

        if ( isset($cache[$args['widget_id']]) ) {
            echo $cache[$args['widget_id']];
            return;
        }

        ob_start();
        extract($args);

        $title = apply_filters('widget_title', empty($instance['title']) ? __('My Custom Recent Posts') : $instance['title'], $instance, $this->id_base);
        if ( !$number = (int) $instance['number'] )
            $number = 10;
        else if ( $number < 1 )
            $number = 1;
        else if ( $number > 15 )
            $number = 15;

        $r = new WP_Query(array('showposts' => $number, 'nopaging' => 0, 'post_status' => 'publish', 'ignore_sticky_posts' => true, 'post_type' => array('post', 'page', 'custom-post-type')));
        if ($r->have_posts()) :
?>
        <?php echo $before_widget; ?>
        <?php if ( $title ) echo $before_title . $title . $after_title; ?>
        <ul>
        <?php  while ($r->have_posts()) : $r->the_post(); ?>
        <li><a href="<?php the_permalink() ?>" title="<?php echo esc_attr(get_the_title() ? get_the_title() : get_the_ID()); ?>"><?php if ( get_the_title() ) the_title(); else the_ID(); ?></a></li>
        <?php endwhile; ?>
        </ul>
        <?php echo $after_widget; ?>
<?php
        // Reset the global $the_post as this query will have stomped on it
        wp_reset_postdata();

        endif;

        $cache[$args['widget_id']] = ob_get_flush();
        wp_cache_set('widget_my_custom_recent_posts', $cache, 'widget');
    }

    function update( $new_instance, $old_instance ) {
        $instance = $old_instance;
        $instance['title'] = strip_tags($new_instance['title']);
        $instance['number'] = (int) $new_instance['number'];
        $this->flush_widget_cache();

        $alloptions = wp_cache_get( 'alloptions', 'options' );
        if ( isset($alloptions['widget_my_custom_recent_entries']) )
            delete_option('widget_my_custom_recent_entries');

        return $instance;
    }

    function flush_widget_cache() {
        wp_cache_delete('widget_my_custom_recent_posts', 'widget');
    }

    function form( $instance ) {
        $title = isset($instance['title']) ? esc_attr($instance['title']) : '';
        if ( !isset($instance['number']) || !$number = (int) $instance['number'] )
            $number = 5;
?>
        <p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label>
        <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $title; ?>" /></p>

        <p><label for="<?php echo $this->get_field_id('number'); ?>"><?php _e('Number of posts to show:'); ?></label>
        <input id="<?php echo $this->get_field_id('number'); ?>" name="<?php echo $this->get_field_name('number'); ?>" type="text" value="<?php echo $number; ?>" size="3" /></p>
<?php
    }
}
    
respondido por el EAMann 30.09.2010 - 17:13
5

A partir de al menos 3.6, puede utilizar el siguiente código para modificar la consulta utilizada:

add_filter('widget_posts_args', 'widget_posts_args_add_custom_type'); 
function widget_posts_args_add_custom_type($params) {
   $params['post_type'] = array('post','custom_type');
   return $params;
}

Simplemente agregue los tipos que desea en la matriz para post_type y deberían aparecer.

Actualización: según enlace , está disponible desde la versión 3.4

    
respondido por el David Pashley 29.09.2013 - 23:30
2

Acabo de encontrar un gran complemento donde el trabajo pesado ya está hecho, y tiene una gran documentación y apoyo de autor. Realmente me ha impresionado.

permite anulaciones WP_Query (lo que le permite filtrar por tipos de publicaciones personalizadas y cualquier otra cosa que desee) y algunas instrucciones claras sobre cómo usarlo.

Documentación enlace

URL del complemento de Wordpress enlace

Hice mi trabajo solo que mucho más corto!

    
respondido por el Steve Meisner 27.07.2012 - 16:32
1

Puede copiar el código del widget (ver /wp-includes/default-widgets.php) y modificar la línea de consulta.

    
respondido por el sorich87 30.09.2010 - 17:03
0

También he creado un complemento de widget para este que es más personalizable que el widget Publicaciones recientes. Si está interesado, puede descargarlo aquí enlace

    
respondido por el jaredwilli 30.01.2011 - 12:20
0

Este código crea un nuevo widget de publicaciones recientes que incluye tus CPT

Hay dos pasos involucrados al extender el widget nativo de publicaciones recientes:

i. Cree una nueva clase para su widget personalizado de publicaciones recientes, lo que puede hacer copiando y cambiando el nombre del código del widget de publicaciones recientes de la carpeta wp-includes de defaults-widgets.php.

ii. Entonces, también deberá registrar el nuevo widget y puede optar por cancelar el registro del widget nativo de publicaciones recientes o utilizar ambos.

Todo el código puede simplemente copiarse en su archivo de funciones utilizando un tema secundario o crear otro archivo e incluirlo en el archivo de funciones de sus temas secundarios.

<?php

class WPSites_Recent_Posts extends WP_Widget {

    public function __construct() {
        $widget_ops = array('classname' => 'wpsites_recent_posts', 'description' => __( "Latest CPT's & Posts.") );
        parent::__construct('wpsites-recent-posts', __('WP Sites Recent Posts'), $widget_ops);
        $this->alt_option_name = 'wpsites_recent_posts';

        add_action( 'save_post', array($this, 'flush_widget_cache') );
        add_action( 'deleted_post', array($this, 'flush_widget_cache') );
        add_action( 'switch_theme', array($this, 'flush_widget_cache') );
    }

    public function widget($args, $instance) {
        $cache = array();
        if ( ! $this->is_preview() ) {
            $cache = wp_cache_get( 'wpsites_widget_recent_posts', 'widget' );
        }

        if ( ! is_array( $cache ) ) {
            $cache = array();
        }

        if ( ! isset( $args['widget_id'] ) ) {
            $args['widget_id'] = $this->id;
        }

        if ( isset( $cache[ $args['widget_id'] ] ) ) {
            echo $cache[ $args['widget_id'] ];
            return;
        }

        ob_start();

        $title = ( ! empty( $instance['title'] ) ) ? $instance['title'] : __( 'Recent Posts' );

        /** This filter is documented in wp-includes/default-widgets.php */
        $title = apply_filters( 'widget_title', $title, $instance, $this->id_base );

        $number = ( ! empty( $instance['number'] ) ) ? absint( $instance['number'] ) : 5;
        if ( ! $number )
            $number = 5;
        $show_date = isset( $instance['show_date'] ) ? $instance['show_date'] : false;


        $r = new WP_Query( apply_filters( 'widget_posts_args', array(
            'posts_per_page'      => $number,
            'no_found_rows'       => true,
            'post_status'         => 'publish',
            'post_type'           => array('post', 'portfolio',
            'ignore_sticky_posts' => true
        ) ) ) );

        if ($r->have_posts()) :
?>
        <?php echo $args['before_widget']; ?>
        <?php if ( $title ) {
            echo $args['before_title'] . $title . $args['after_title'];
        } ?>
        <ul>
        <?php while ( $r->have_posts() ) : $r->the_post(); ?>
            <li>
                <a href="<?php the_permalink(); ?>"><?php get_the_title() ? the_title() : the_ID(); ?></a>
            <?php if ( $show_date ) : ?>
                <span class="post-date"><?php echo get_the_date(); ?></span>
            <?php endif; ?>
            </li>
        <?php endwhile; ?>
        </ul>
        <?php echo $args['after_widget']; ?>
<?php

        wp_reset_postdata();

        endif;

        if ( ! $this->is_preview() ) {
            $cache[ $args['widget_id'] ] = ob_get_flush();
            wp_cache_set( 'wpsites_widget_recent_posts', $cache, 'widget' );
        } else {
            ob_end_flush();
        }
    }

    public function update( $new_instance, $old_instance ) {
        $instance = $old_instance;
        $instance['title'] = strip_tags($new_instance['title']);
        $instance['number'] = (int) $new_instance['number'];
        $instance['show_date'] = isset( $new_instance['show_date'] ) ? (bool) $new_instance['show_date'] : false;
        $this->flush_widget_cache();

        $alloptions = wp_cache_get( 'alloptions', 'options' );
        if ( isset($alloptions['wpsites_recent_posts']) )
            delete_option('wpsites_recent_posts');

        return $instance;
    }

    public function flush_widget_cache() {
        wp_cache_delete('wpsites_widget_recent_posts', 'widget');
    }

    public function form( $instance ) {
        $title     = isset( $instance['title'] ) ? esc_attr( $instance['title'] ) : '';
        $number    = isset( $instance['number'] ) ? absint( $instance['number'] ) : 5;
        $show_date = isset( $instance['show_date'] ) ? (bool) $instance['show_date'] : false;
?>
        <p><label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
        <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo $title; ?>" /></p>

        <p><label for="<?php echo $this->get_field_id( 'number' ); ?>"><?php _e( 'Number of posts to show:' ); ?></label>
        <input id="<?php echo $this->get_field_id( 'number' ); ?>" name="<?php echo $this->get_field_name( 'number' ); ?>" type="text" value="<?php echo $number; ?>" size="3" /></p>

        <p><input class="checkbox" type="checkbox" <?php checked( $show_date ); ?> id="<?php echo $this->get_field_id( 'show_date' ); ?>" name="<?php echo $this->get_field_name( 'show_date' ); ?>" />
        <label for="<?php echo $this->get_field_id( 'show_date' ); ?>"><?php _e( 'Display post date?' ); ?></label></p>
<?php
    }
}

Registrar el nuevo widget personalizado de publicaciones recientes

function wpsites_widgets_init() {
    if ( !is_blog_installed() )
        return;

    register_widget('WPSites_Recent_Posts');
    do_action( 'widgets_init' );
}

add_action( 'init', 'wpsites_widgets_init', 2 );

El código incluye una WP_Query modificada que incluye una matriz para los tipos de publicaciones, incluido el CPT de cartera, al que puede cambiar el nombre para que coincida con su tipo de publicación personalizada.

Aquí está la línea de código que necesita ser modificada:

'post_type'           => array('post', 'portfolio',
    
respondido por el Brad Dalton 26.07.2014 - 01:15

Lea otras preguntas en las etiquetas