Comment marquer tous les 3 messages


17

Je travaille sur un site WordPress pour mon groupe et j'aimerais marquer chaque troisième article sur notre page de blog pour y appliquer une classe spéciale, quelqu'un a-t-il des conseils sur la façon d'y parvenir? Toute aide est très très appréciée, merci! rock n Roll.

Réponses:


15

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' : '' ); ?>>

cela l'a tué @toscho! se révèle que celui-ci a fonctionné le mieux depuis que j'utilise cela sur une page de catégorie et qu'un fn stylise les messages partout. merci mec, +1. Je ne pense pas avoir officiellement les privilèges +1.
Zoran M

1
Cela n'affecte-t-il pas réellement la valeur des globaux (en raison de l'opérateur de pré-incrémentation) et peut-être bousiller quelque chose d'autre qui pourrait dépendre de la propriété count current_post? Je veux dire, la probabilité est mince, non, mais ne serait-il pas plus sûr de simplement faire (0 === ($ GLOBALS ['wpdb'] -> current_post + 1)% 3? 'Third': '')?
Tom Auger

1
@TomAuger Pour une raison moins évidente, cela ne semble pas avoir d'effet secondaire. Mais dans une perspective d'élégance - vous avez raison. J'ai ajouté un meilleur exemple. :)
fuxia

4
Notice: Undefined property: wpdb::$current_post in
Knott

9

En complément de la réponse @helgathevikings

Utilisez le post_class () fn sans polluer l'espace de noms global

  1. L'utilisation de staticvariables à l'intérieur d'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 l'a suggéré @Milo dans les commentaires), prenez le message actuel de 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' );

Mise à jour

Nous pourrions utiliser la current_postpropriété de l' $wp_queryobjet global . Utilisons une fonction anonyme , avec le usemot - clé, pour transmettre le global $wp_querypar 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;
} );

Plus loin, nous pourrions le restreindre à la boucle principale avec un in_the_loop()contrôle conditionnel.


1
je l'aime. ne comprennent pas très bien les variables statiques. encore une chose à apprendre aujourd'hui!
helgatheviking

3
pourquoi ne pas simplement utiliser $wpdb->current_post?
Milo

@Milo Good catch +1
kaiser

merci beaucoup les gars, appréciez vraiment l'aide! l'ajout en ce moment!
Zoran M

ah cette fonction est badass @kaiser et magnifiquement simple! s'avère que j'avais besoin de quelque chose juste pour une page de catégorie. cela me sauvera plus tard dans la vie mon ami, merci de m'apprendre quelque chose de nouveau. +11!
Zoran M

3

si votre thème utilise post_class () pour générer des classes de post, vous pouvez essayer. je ne suis pas sûr à 100% de la façon dont il va gérer la pagination b / ci n'a pas assez de messages 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;

 }

Pas sûr à 100%, mais je suppose que vous pourriez utiliser un staticvar au lieu d'un globalpour garder l'espace de noms propre. Quoi qu'il en soit: +1.
kaiser

vous voulez dire changer à la fois global $ current_count en statique $ current_count? ne semble rien faire quand je le teste. pas assez familier avec une portée variable, bien que je convienne qu'il vaut mieux ne pas polluer l'espace de noms si vous le pouvez.
helgatheviking

Voir la réponse ci
kaiser

3
vous pouvez également utiliser $wpdb->current_postsans avoir à créer une autre variable.
Milo

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;

1

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

Avec CSS3, vous ciblez chaque troisième publication avec un sélecteur 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");
});
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.