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.

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' : '' ); ?>>

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.


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;

 }

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


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;

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");
});
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.