Come contrassegnare ogni terzo post


17

Sto lavorando su un sito WordPress per la mia band e vorrei contrassegnare ogni terzo post sulla nostra pagina del blog per avere una classe speciale applicata ad esso, qualcuno ha qualche suggerimento su come raggiungere questo obiettivo? Qualsiasi aiuto è molto apprezzato, grazie! rock n roll.

Risposte:


15

Il mio approccio Nessuna funzione aggiuntiva, nessun filtro. :)

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

Alternativa:

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

questo l'ha ucciso @toscho! risulta che questo ha funzionato meglio dato che lo sto usando su una pagina di categoria e un fn stava disegnando post ovunque. grazie amico, +1. non penso di avere i priv a +1 ma ufficialmente.
Zoran M

1
Questo non influisce sul valore Globals (a causa dell'operatore di pre-incremento) e potenzialmente rovina qualcos'altro che potrebbe dipendere dalla proprietà count_post corrente? Voglio dire, la probabilità è scarsa, giusto, ma non sarebbe più sicuro farlo (0 === ($ GLOBALS ['wpdb'] -> current_post + 1)% 3? 'Third': '')?
Tom Auger,

1
@TomAuger Per alcune ragioni non così ovvie non sembra avere alcun effetto collaterale. Ma dal punto di vista dell'eleganza - hai ragione. Ho aggiunto un esempio migliore. :)
fuxia

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

9

In aggiunta alla risposta di @helgathevikings

Utilizzare post_class () fn senza inquinare lo spazio dei nomi globale

  1. L'uso di staticvariabili all'interno di una classe consente lo stesso comportamento delle variabili globali: rimangono in posizione e non cambiano, a meno che non le si modifichi.
  2. Ancora meglio (come suggerito da @Milo nei commenti), prendi il post corrente dalla classe DB.
L'esempio:
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' );

Aggiornare

Potremmo utilizzare la current_postproprietà $wp_querydell'oggetto globale . Usiamo una funzione anonima , con la useparola chiave, per trasmettere il $wp_queryriferimento globale ( PHP 5.3+ ):

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

    return $classes;
} );

Più avanti, potremmo limitarlo al ciclo principale con un in_the_loop()controllo condizionale.


1
mi piace. non capisco bene le variabili statiche. un'altra cosa da imparare oggi!
Helgatheviking

3
perché non usare solo $wpdb->current_post?
Milo

@Milo Buona cattura +1
kaiser

grazie mille, apprezzo molto l'aiuto! aggiungendolo adesso!
Zoran M

ah questa funzione è tosta @kaiser e meravigliosamente semplice! risulta che avevo bisogno di qualcosa solo per una pagina di categoria. questo mi salverà in seguito, amico mio, grazie per avermi imparato qualcosa di nuovo. +11!
Zoran M

3

se il tuo tema utilizza post_class () per generare classi post, potresti provare. non sono sicuro al 100% di come gestirà l'impaginazione b / ci non ha abbastanza post sulla mia installazione locale per provarlo

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;

 }

Non sono sicuro al 100%, ma suppongo che potresti usare staticvar anziché a globalper mantenere pulito lo spazio dei nomi. Comunque: +1.
Kaiser

intendi cambiare sia $ $ current_count globale che $ $ current_count? non sembra fare nulla quando lo collaudo. non abbastanza familiare con ambito variabile, anche se concordo che è meglio non inquinare lo spazio dei nomi se è possibile.
Helgatheviking


3
puoi anche usare $wpdb->current_postsenza dover creare un'altra variabile.
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

Ci sono anche modi per farlo con CSS e javascript.

Con CSS3 scegli come target ogni terzo post con un selettore nth-child.

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

O con jQuery, puoi aggiungere la classe CSS usando la stessa tecnica.

jQuery(function($) {
    $( "article.post:nth-child(3n+0)" ).addClass("custom-class");
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.