web-dev-qa-db-fra.com

Ajouter une vignette au widget des publications récentes à l'aide de filtres

Je souhaite ajouter une vignette au widget de publications récentes par défaut de WordPress et je souhaite le faire à l'aide de tout filtre disponible. Y a-t-il un filtre connu sur ce sujet?

2
Chodhary

Voici un moyen de le faire via le filtre the_title. Nous pouvons limiter la portée au Recent Posts widget, en l'initialisant dans le filtre widget_posts_args, puis en le supprimant à nouveau après la boucle.

/**
 * 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;
} );

où nous définissons

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;
} 

et

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

Notez qu'en raison de cette vérification dans la méthode WP_Widget_Recent_Posts::widget():

get_the_title() ? the_title() : the_ID()

le filtre the_title est appliqué deux fois pour chaque élément. C'est pourquoi nous n'appliquons que la vignette ajoutée pour les cas impairs.

Notez également que cette approche suppose des titres non vides.

Sinon, il est plus flexible de simplement créer/étendre un nouveau widget en fonction de nos besoins.

5
birgire

Non filtre disponible.


Vérification du /wp-includes/widgets/class-wp-recent-posts-widget.php ce qui suit est le code qui génère le 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;

Qui n'a évidemment aucun filtre pour insérer une vignette ou quoi que ce soit dans la boucle.

0
bravokeyl