Comment marquer tous les 3 posts

16

Je travaille sur un site WordPress pour mon groupe et j'aimerais marquer chaque 3e post sur notre page de blog pour qu'une classe spéciale lui soit appliquée. Quelqu'un a-t-il des indications sur la manière d'y parvenir? Toute aide est très très appréciée, merci! rock n roll.

    
posée Zoran 08.03.2012 - 02:21

5 réponses

13

Mon approche. Pas de fonction supplémentaire, pas de filtre. :)

<?php $GLOBALS['wpdb']->current_post = 0; ?>
<div <?php post_class( 0 === ++$GLOBALS['wpdb']->current_post % 3 ? 'third' : '' ); ?>>

Alternative:

<div <?php post_class( 0 === ++$GLOBALS['wpdb']->wpse_post_counter % 3 ? 'third' : '' ); ?>>
    
réponse donnée fuxia 09.03.2012 - 00:24
8

En complément de la réponse @helgathevikings

Utilisez post_class () fn sans polluer l’espace de nom global

  1. L'utilisation de static de variables dans une classe permet le même comportement que d'avoir des variables globales: elles restent en place et ne changent pas, sauf si vous ne les modifiez pas.
  2. Encore mieux (comme @Milo l'a suggéré dans les commentaires), prenez le message actuel dans la classe DB.
L'exemple:
function wpse44845_add_special_post_class( $classes )
{
    // Thanks to @Milo and @TomAuger for the heads-up in the comments
    0 === $GLOBALS['wpdb']->current_post %3 AND $classes[] = 'YOUR CLASS';

    return $classes;
}
add_filter( 'post_class','wpse44845_add_special_post_class' );

Mettre à jour

Nous pourrions utiliser la propriété current_post de l'objet global $wp_query . Utilisons une fonction anonymous , avec le mot clé use , pour transmettre le $wp_query global par référence ( PHP 5.3 + ):

add_filter( 'post_class', function( $classes ) use ( &$wp_query )
{
    0 === $wp_query->current_post %3 AND $classes[] = 'YOUR CLASS';

    return $classes;
} );

Ensuite, nous pourrions le limiter à la boucle principale avec un in_the_loop() contrôle conditionnel.

    
réponse donnée kaiser 08.03.2012 - 15:38
3

si votre thème utilise post_class () pour générer des classes de publication que vous pouvez essayer. Je ne suis pas sûr à 100% de la façon dont il gérera la pagination. Je n'ai pas assez de publications sur mon installation locale pour le tester.

add_filter('post_class','wpa_44845');

global $current_count;

$current_count = 1;

 function wpa_44845( $classes ){

    global $current_count;

    if ($current_count %3 == 0 ) $classes[] = 'special-class';

    $current_count++;

    return $classes;

 }
    
réponse donnée helgatheviking 08.03.2012 - 03:24
2
$i = 0;
if ( have_posts ) :
while( have_posts ) :
    the_post();

    $class = 'class="BASIC-CLASS';
    if ( 0 === ( $i % 3 ) )
        $class .= 'YOUR-SPECIAL-CLASS';
    $class .= '"';

    echo "<div {$class}>";
        // do stuff
    echo '</div>';

    $i++;
endwhile;
endif;
    
réponse donnée kaiser 08.03.2012 - 02:30
1

Il existe également des moyens de le faire avec CSS et javascript.

Avec CSS3, vous ciblez tous les trois posts avec un sélecteur de nième enfant.

article.post:nth-child(3n+0)
{
    background-color: #777;
}

Ou avec jQuery, vous pouvez ajouter la classe CSS en utilisant la même technique.

jQuery(function($) {
    $( "article.post:nth-child(3n+0)" ).addClass("custom-class");
});
    
réponse donnée rohmann 10.10.2013 - 01:28

Lire d'autres questions sur les étiquettes