Bagaimana menandai setiap posting ke-3

17

Saya sedang mengerjakan situs WordPress untuk band saya dan saya ingin menandai setiap posting ke-3 di halaman blog kami untuk menerapkan kelas khusus padanya, ada yang punya petunjuk tentang cara mencapai ini? Setiap bantuan sangat dihargai, terima kasih! Rock and roll.

Zoran M
sumber

Jawaban:

15

Pendekatan saya Tidak ada fungsi tambahan, tidak ada filter. :)

<?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' : '' ); ?>>
fuxia
sumber
ini membunuhnya @toscho! ternyata ini bekerja paling baik karena saya menggunakan ini pada halaman kategori dan fn sedang menata posting di mana-mana. terima kasih kawan, +1. saya rasa saya tidak punya hak untuk memberi +1 secara resmi.
Zoran M
1
Tidakkah ini benar-benar memengaruhi nilai Globals (karena operator pra-kenaikan) dan berpotensi mengacaukan sesuatu yang lain yang mungkin bergantung pada properti count current_post? Maksud saya, kemungkinannya tipis, benar, tetapi bukankah lebih aman untuk melakukannya saja (0 === ($ GLOBALS ['wpdb'] -> current_post + 1)% 3? 'Third': '')?
Tom Auger
1
@ TomAuger Untuk beberapa alasan yang tidak begitu jelas tampaknya tidak memiliki efek samping. Tetapi dari perspektif keanggunan - Anda benar. Saya menambahkan contoh yang lebih baik. :)
fuxia
4
Notice: Undefined property: wpdb::$current_post in
Knott
9

Sebagai tambahan jawaban @helgathevikings

Gunakan post_class () fn tanpa mencemari namespace global

  1. Menggunakan staticvariabel di dalam kelas memungkinkan perilaku yang sama dengan memiliki variabel global: Mereka tetap di tempatnya dan tidak berubah, kecuali jika Anda tidak mengubahnya.
  2. Bahkan lebih baik (seperti yang disarankan @Milo di komentar), ambil postingan saat ini dari kelas DB.
Contoh:
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' );

Memperbarui

Kita dapat memanfaatkan current_postproperti dari $wp_queryobjek global . Mari kita gunakan fungsi anonim , dengan usekata kunci, untuk meneruskan global $wp_querydengan referensi ( PHP 5.3+ ):

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

    return $classes;
} );

Selanjutnya, kita bisa membatasi ke loop utama dengan pemeriksaan in_the_loop()bersyarat.

kaisar
sumber
1
saya suka itu. tidak begitu mengerti variabel statis. satu hal lagi untuk dipelajari hari ini!
Helgatheviking
3
kenapa tidak pakai saja $wpdb->current_post?
Milo
@ Moilo Tangkapan yang bagus +1
kaiser
terima kasih dudes, sangat menghargai bantuannya! menambahkan ini sekarang!
Zoran M
ah fungsi ini adalah badass @kaiser dan sangat sederhana! ternyata saya butuh sesuatu hanya untuk halaman kategori. ini akan menyelamatkan saya di kemudian hari dalam hidup teman saya, terima kasih telah belajar saya sesuatu yang baru. +11!
Zoran M
3

jika tema Anda menggunakan post_class () untuk menghasilkan kelas posting, Anda bisa mencoba. Saya tidak 100% yakin bagaimana ini akan menangani pagination b / ci tidak memiliki cukup posting pada instalasi lokal saya untuk mengujinya

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
sumber
Tidak 100% yakin, tapi saya kira Anda bisa menggunakan staticvar bukannya globaluntuk menjaga namespace tetap bersih. Pokoknya: +1.
kaiser
maksud Anda mengubah global $ current_count menjadi $ static_count statis? sepertinya tidak melakukan apa-apa ketika saya mengujinya. tidak cukup akrab dengan ruang lingkup w / variabel, meskipun saya setuju lebih baik untuk tidak mencemari namespace jika Anda bisa.
Helgatheviking
Lihat jawaban di bawah ini
kaiser
3
Anda juga bisa menggunakan $wpdb->current_posttanpa harus membuat variabel lain.
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;
kaisar
sumber
1

Ada juga cara untuk melakukan ini dengan CSS dan javascript.

Dengan CSS3, Anda menargetkan setiap pos ketiga dengan pemilih anak-n.

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

Atau dengan jQuery, Anda bisa menambahkan kelas CSS menggunakan teknik yang sama.

jQuery(function($) {
    $( "article.post:nth-child(3n+0)" ).addClass("custom-class");
});
rohmann
sumber