Jak oznaczyć co 3 post

17

Pracuję nad witryną WordPress dla mojego zespołu i chciałbym oznaczyć co 3 post na naszej stronie blogu, aby zastosować specjalną klasę. Czy ktoś ma jakieś wskazówki, jak to osiągnąć? Każda pomoc jest bardzo bardzo doceniana, dzięki! rock n roll.

Zoran M.
źródło

Odpowiedzi:

15

Moje podejście Bez dodatkowej funkcji, bez filtra. :)

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

Alternatywny:

<div <?php post_class( 0 === ++$GLOBALS['wpdb']->wpse_post_counter % 3 ? 'third' : '' ); ?>>
fuxia
źródło
to zabiło @toscho! okazuje się, że ten działał najlepiej, ponieważ używam tego na stronie kategorii, a fn wszędzie stylizował posty. dzięki stary, +1. nie sądzę, że mam jeszcze uprawnienia do +1, ale oficjalnie.
Zoran M,
1
Czy tak naprawdę nie wpływa to na wartość Globals (z powodu operatora wstępnego przyrostu) i potencjalnie spieprzy coś innego, co może być zależne od właściwości count_post_post? Mam na myśli, że prawdopodobieństwo jest niewielkie, prawda, ale czy nie byłoby bezpieczniej to zrobić (0 === ($ GLOBALS ['wpdb'] -> current_post + 1)% 3? 'Third': '')?
Tom Auger
1
@TomAuger Z jakiegoś nie tak oczywistego powodu wydaje się, że nie ma żadnego efektu ubocznego. Ale z perspektywy elegancji - masz rację. Dodałem lepszy przykład. :)
fuxia
4
Notice: Undefined property: wpdb::$current_post in
Knott,
9

Jako dodatek do @helgathevikings odpowiedz

Użyj post_class () fn bez zanieczyszczania globalnej przestrzeni nazw

  1. Używanie staticzmiennych wewnątrz klasy pozwala na takie samo zachowanie jak posiadanie zmiennych globalnych: pozostają one na swoim miejscu i nie zmieniają się, chyba że ich nie zmienisz.
  2. Nawet lepiej (jak sugerował @Milo w komentarzach), weź aktualny post z klasy DB.
Przykład:
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' );

Aktualizacja

Możemy wykorzystać current_postwłaściwość $wp_queryobiektu globalnego . Użyjmy anonimowej funkcji ze usesłowem kluczowym, aby przekazać globalną $wp_queryprzez referencję ( PHP 5.3+ ):

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

    return $classes;
} );

Następnie możemy ograniczyć go do głównej pętli za pomocą in_the_loop()kontroli warunkowej.

kajzer
źródło
1
lubię to. nie do końca rozumiem zmienne statyczne. jeszcze jedna rzecz do nauczenia się dzisiaj!
helgatheviking
3
dlaczego nie po prostu użyć $wpdb->current_post?
Milo
@Milo Dobry połów +1
kaiser
dziękuję, kolesie, naprawdę doceniam pomoc! dodając to teraz!
Zoran M,
ah ta funkcja jest badass @kaiser i pięknie prosta! okazuje się, że potrzebowałem czegoś tylko na stronę kategorii. to uratuje mnie później w życiu, przyjacielu, dzięki za naukę czegoś nowego. +11!
Zoran M,
3

jeśli Twój motyw używa post_class () do generowania klas postów, możesz spróbować. Nie jestem w 100% pewien, jak poradzi sobie z paginacją b / ci Nie mam wystarczającej liczby postów w mojej lokalnej instalacji, aby to przetestować

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;

 }
helgatheviking
źródło
Nie jestem w 100% pewien, ale myślę, że możesz użyć staticvar zamiast a, globalaby utrzymać przestrzeń nazw w czystości. W każdym razie: +1.
kaiser
masz na myśli zmianę zarówno globalnego $ current_count na statyczny $ current_count? wydaje się, że nic nie robi, kiedy go testuję. nie znam wystarczająco w / zmiennego zakresu, chociaż zgadzam się, że lepiej nie zanieczyszczać przestrzeni nazw, jeśli możesz.
helgatheviking
Zobacz odpowiedź poniżej
Kaiser
3
można także używać $wpdb->current_postbez konieczności tworzenia innej zmiennej.
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;
kajzer
źródło
1

Istnieją również sposoby, aby to zrobić za pomocą CSS i javascript.

Z CSS3 kierujesz reklamy na co trzeci post za pomocą selektora n-tego dziecka.

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

Lub za pomocą jQuery można dodać klasę CSS przy użyciu tej samej techniki.

jQuery(function($) {
    $( "article.post:nth-child(3n+0)" ).addClass("custom-class");
});
Rohmann
źródło