Agregar miniatura a un widget de publicaciones recientes usando filtros

2

Quiero agregar una miniatura al widget predeterminado de publicaciones recientes de WordPress, y quiero hacerlo utilizando cualquier filtro disponible. ¿Hay algún filtro que conozca este tema / tema?

    
pregunta Chodhary 06.08.2016 - 13:34

2 respuestas

5

Aquí hay una forma de hacerlo a través del filtro the_title . Podemos limitar el alcance al widget Entradas recientes , inicializándolo dentro del filtro widget_posts_args y luego eliminarlo nuevamente después del bucle.

/**
 * Recent Posts Widget: Append Thumbs
 */
add_filter( 'widget_posts_args', function( array $args )
{
    add_filter( 'the_title', 'wpse_prepend_thumbnail', 10, 2 );
    add_action( 'loop_end',  'wpse_clean_up' );
    return $args;
} );

donde definimos

function wpse_prepend_thumbnail( $title, $post_id )
{
    static $instance = 0;

    // Append thumbnail every second time (odd)
    if( 1 === $instance++ % 2 && has_post_thumbnail( $post_id ) )
        $title = get_the_post_thumbnail( $post_id ) . $title;

    return $title;
} 

y

function wpse_clean_up( \WP_Query $q )
{
    remove_filter( current_filter(), __FUNCTION__ );
    remove_filter( 'the_title', 'wpse_add_thumnail', 10 );
} 

Tenga en cuenta que debido a esta comprobación en el método WP_Widget_Recent_Posts::widget() :

get_the_title() ? the_title() : the_ID()

el filtro the_title se aplica dos veces para cada elemento. Es por eso que solo aplicamos la miniatura que se agrega a los casos impares.

También tenga en cuenta que este enfoque asume títulos no vacíos.

De lo contrario, es más flexible simplemente crear / extender un nuevo widget a nuestras necesidades en su lugar.

    
respondido por el birgire 06.08.2016 - 13:51
0

No filtro disponible.

Comprobando /wp-includes/widgets/class-wp-recent-posts-widget.php el siguiente es el código que genera el widget

$r = new WP_Query( apply_filters( 'widget_posts_args', array(
    'posts_per_page'      => $number,
    'no_found_rows'       => true,
    'post_status'         => 'publish',
    '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
// Reset the global $the_post as this query will have stomped on it
wp_reset_postdata();

endif;

Lo que obviamente no tiene filtro para insertar alguna miniatura o algo en el bucle.

    
respondido por el bravokeyl 06.08.2016 - 13:54

Lea otras preguntas en las etiquetas