Her 3. gönderi nasıl işaretlenir


17

Grubum için bir WordPress sitesinde çalışıyorum ve blog sayfamızdaki her 3 yayını her birine özel bir sınıf uygulamak için işaretlemek istiyorum. Herhangi bir yardım çok takdir, teşekkürler! rock n roll.

Yanıtlar:


15

Benim yaklaşımım. Ekstra fonksiyon yok, filtre yok. :)

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

Alternatif:

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

bu onu öldürdü @toscho! Bu bir kategori sayfasında im kullanarak ve bir fn her yerde yazı stil oldu çünkü bu iyi çalıştı çıktı. teşekkürler dostum, +1. Henüz resmi olarak + 1'lemek için privs olduğunu sanmıyorum.
Zoran M

1
Bu aslında Globals değerini (artış öncesi operatörü nedeniyle) etkilemez ve current_post count özelliğine bağlı olabilecek başka bir şeyi potansiyel olarak bozmaz mı? Yani, olasılık ince, doğru, ama sadece yapmak daha güvenli olmaz (0 === ($ GLOBALS ['wpdb'] -> current_post + 1)% 3? 'Üçüncü': '')?
Tom Auger

1
@TomAuger Çok açık olmayan bir nedenden ötürü herhangi bir yan etkisi yok gibi görünüyor. Ama zarafet açısından - haklısın. Daha iyi bir örnek ekledim. :)
fuxia

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

9

@Helgathevikings yanıtına ek olarak

Genel ad alanını kirletmeden post_class () fn öğesini kullanın

  1. staticBir sınıfın içindeki değişkenlerin kullanılması , global değişkenlere sahip olmakla aynı davranışa izin verir: Değişmezler, yerinde kalırlar ve değişmezler.
  2. Daha da iyisi (yorumlarda @Milo'nun önerdiği gibi), geçerli gönderiyi DB sınıfından alın.
Örnek:
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' );

Güncelleme

current_postKüresel $wp_querynesnenin mülkiyetinden yararlanabiliriz . En bir kullanalım anonim ile, işlev useküresel aktarmak, anahtar kelime $wp_queryreferans (tarafından PHP 5.3+ ):

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

    return $classes;
} );

Dahası, koşullu bir kontrolle ana döngü ile sınırlayabiliriz in_the_loop().


1
bunu sevdim. statik değişkenleri tam olarak anlamıyorum. bugün öğrenilecek bir şey daha var!
Mart'ta helgatheviking

3
neden sadece kullanmıyorsun $wpdb->current_post?
Milo

@Milo Good catch +1
kaiser

çok teşekkür ederim dostlar, gerçekten yardım takdir! bunu şimdi ekliyoruz!
Zoran M

ah bu işlev badass @kaiser ve güzel basit! sadece bir kategori sayfası için bir şey gerekli çıktı. bu beni daha sonra hayatımda kurtaracak arkadaşım, bana yeni bir şey öğrendiğin için teşekkürler. 11!
Zoran M

3

temanız post_class () kullanıyorsa deneyebilirsiniz. sayfalandırma nasıl işleyeceğinden% 100 emin değilim b / ci test etmek için yerel kurulumumda yeterli gönderi yok

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;

 }

% 100 emin değilim, ama ad alanını temiz tutmak için staticbir yerine bir var kullanabilirsiniz sanırım global. Her neyse: +1.
Kaiser

hem global $ current_count 'ı statik $ current_count olarak değiştirmeyi mi kastediyorsunuz? Test ettiğimde hiçbir şey yapmıyor gibi görünüyor. yeterince w / değişken kapsamı tanıdık değil, ancak eğer yapabilirseniz ad alanını kirletmek daha iyi olduğunu kabul ediyorum.
helgatheviking


3
$wpdb->current_postbaşka bir değişken oluşturmak zorunda kalmadan da kullanabilirsiniz .
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

Bunu CSS ve javascript ile yapmanın yolları da vardır.

CSS3 ile, üçüncü bir seçiciyle her üç yayını da hedeflersiniz.

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

Veya jQuery ile aynı tekniği kullanarak CSS sınıfını ekleyebilirsiniz.

jQuery(function($) {
    $( "article.post:nth-child(3n+0)" ).addClass("custom-class");
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.