Alternare post_class su ogni post

12 ago 2010, 06:26:17
Visualizzazioni: 3.43K
Voti: 2

Ho bisogno di avere una classe alternata (pari, dispari...) sui post per fornire evidenziazioni alternate su una colonna. La soluzione migliore sarebbe collegare questo a post_class() in modo che sia presente su ogni istanza di post_class(). Di seguito è riportato il codice che ho a questo punto per ottenere questo effetto.

<?php  

// impostazione altre variabili per categorie alternate  
$style_classes = array('pari', 'dispari');  
$style_counter = 0;  
?>  

<?php if (have_posts()) : ?>  

<?php while (have_posts()) : the_post(); ?>  

<div class="<?php $k = $style_counter%2; echo $style_classes[$k]; $style_counter++; ?>">  

<?php the_content(); ?>  

</div>  

<?php endwhile; ?>  

<?php endif; ?>  
0
Tutte le risposte alla domanda 4
0

Dovresti aggiungere il seguente codice in functions.php:

add_filter ( 'post_class' , 'my_post_class' );
global $current_class;
$current_class = 'odd';

function my_post_class ( $classes ) { 
   global $current_class;
   $classes[] = $current_class;

   $current_class = ($current_class == 'odd') ? 'even' : 'odd';

   return $classes;
}

Questo assicura che tutti i post dispari nella pagina avranno la classe 'odd' e tutti i post pari avranno la classe 'even' semplicemente utilizzando post_class() nel tuo tema.

12 ago 2010 09:18:12
2

Questo funziona, passa la classe aggiuntiva in post_class():

<?php $c = 0; ?>
<?php if (have_posts()) : ?>
    <?php while (have_posts()) : the_post(); ?>
        <div <?php post_class((++$c % 2 === 0) ? 'odd' : 'even'); ?>>
            <?php the_content(); ?>
        </div>
    <?php endwhile; ?>
<?php endif; ?>

MODIFICA: Ecco un modo che crea una versione di post_class() che terrà traccia del conteggio nella pagina. Ora, utilizzerà un nuovo nome, oddeven_post_class(), ma funziona come desideri. Tutto ciò che devi fare è inserire questo nel file functions.php:

/* Inserisci questo blocco in functions.php */
class MyCounter {
    var $c = 0;
    function increment(){
        ++$this->c;
        return;
    }
    function oddOrEven(){
        $out = ($this->c % 2 === 0) ? 'odd' : 'even';
        $this->increment();
        return $out;
    }
}
$my_instance = new MyCounter();
function post_class_oddeven() {
    global $my_instance;
    ob_start();
    post_class($my_instance->oddOrEven());
    $str = ob_get_contents();
    ob_end_clean();
    echo $str;
}
/* fine del blocco */

Quindi, per chiamarla, usa post_class_oddeven() nel tuo tema ovunque avresti chiamato post_class()

12 ago 2010 06:52:33
Commenti

Sì, è ancora solo una variante della soluzione sopra. Forse non sono stato chiaro ma sto cercando una soluzione che vada nel file functions.php e poi la passi semplicemente a qualsiasi istanza di post_class(). In questo modo non devo modificare tutte le singole istanze di loop dove mi serve questa funzionalità.

curtismchale curtismchale
12 ago 2010 07:21:00

Ho aggiornato la mia risposta con una soluzione che funziona per me.

artlung artlung
12 ago 2010 07:45:10
1

Ho un'altra soluzione se vuoi aggiungere una classe specifica a contenuti diversi. Ad esempio, solo al loop:

add_filter( 'post_class', 'my_post_class' );

function my_post_class( $classes ) {

  if ( ! is_single() ) {
    global $wp_query;

    // Aggiunge la classe "even" o "odd" se non è un singolo post
    $classes[] = $wp_query->current_post % 2 == 0 ? 'even' : 'odd' ;
  }

  return $classes;
}

Perché non vuoi aggiungere la classe "even" o "odd" quando viene visualizzato un singolo contenuto.

5 ago 2014 02:41:28
Commenti

Fatto benissimo! Ottimo lavoro, Marco.

James Kemp James Kemp
1 lug 2015 19:17:00
0

Puoi farlo con del semplice CSS. Nel tema twentyseventeen, ad esempio, dove il loop è contenuto in un div "main":

#main .post {
    color: red;
}

#main .post:nth-of-type(2n) {
    color: blue;
}

farà al caso tuo.

21 giu 2017 13:19:09