3番目の投稿ごとにマークする方法


17

私は自分のバンドのWordPressサイトで作業していますが、ブログページの3番目の投稿ごとに特別なクラスを適用するようにマークしたいと思います。どんな助けも非常に感謝しています、ありがとう!ロックンロール。

回答:


15

私のアプローチ。追加機能なし、フィルターなし。:)

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

代替案:

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

これは@toschoを殺しました!これはカテゴリページでこれを使用していて、fnがどこでも投稿をスタイリングしていたので、これが最もうまくいったことがわかります。ありがとう、+ 1。+1する権限がまだ公式にあるとは思わない。
ゾランM

1
これは実際にはグローバル値に影響しません(事前インクリメント演算子のため)、潜在的にcurrent_postカウントプロパティに依存している可能性のある何かを台無しにしませんか?つまり、可能性はわずかですが、正しいのですが、単に(0 ===($ GLOBALS ['wpdb']-> current_post + 1)%3? 'third': '')?
トム・オージェ

1
@TomAugerそれほど明白ではないいくつかの理由で、副作用はないようです。しかし、優雅さの観点から–あなたは正しいです。より良い例を追加しました。:)
fuxia

4
Notice: Undefined property: wpdb::$current_post in
ノット

9

@helgathevikingsの回答の追加として

グローバル名前空間を汚染せずにpost_class()fnを使用します

  1. staticクラス内で変数を使用すると、グローバル変数を持つのと同じ動作が可能になります。変数を変更しない限り、変数はそのままで変化しません。
  2. (@Miloがコメントで示唆したように)さらに良いのは、DBクラスから現在の投稿を取得することです。
例:
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' );

更新

current_postグローバル$wp_queryオブジェクトのプロパティを利用できます。キーワード付きの匿名関数を使用useして、グローバル$wp_query参照を渡します(PHP 5.3+):

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

    return $classes;
} );

さらに、条件付きチェックでメインループに制限することもできin_the_loop()ます。


1
私はそれが好きです。静的変数をよく理解していません。今日学ぶべきもう一つのこと!
ヘルガサビキング

3
なぜ使用しないの$wpdb->current_postですか?
ミロ

@ミログッドキャッチ+1
kaiser

本当にありがとうございます、本当に感謝します!これを今すぐ追加してください!
ゾランM

ああ、この関数は@kaiserであり、とてもシンプルです!カテゴリページのためだけに何かが必要でした。これは私の友人を後の人生で救うでしょう。私に何か新しいことを学んでくれてありがとう。+11!
ゾランM

3

テーマがpost_class()を使用して投稿クラスを生成する場合は、試してみてください。私はそれがページネーションをどのように処理するか100%確信していません

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%確かではありませんが、名前空間をきれいに保つために、static代わりにvarを使用できると思いますglobal。とにかく:+1。
カイザー

あなたは両方のグローバルな$ current_countを静的な$ current_countに変更するつもりですか?私はそれをテストするときに何もしないようです。変数スコープを十分に理解していませんが、可能であれば名前空間を汚染しない方が良いことに同意します。
ヘルガサビキング


3
$wpdb->current_post別の変数を作成せずに使用することもできます。
ミロ

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

CSSとjavascriptでこれを行う方法もあります。

CSS3では、3番目ごとの投稿をn番目の子セレクターでターゲットにします。

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

または、jQueryを使用して、同じ手法を使用してCSSクラスを追加できます。

jQuery(function($) {
    $( "article.post:nth-child(3n+0)" ).addClass("custom-class");
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.