Как отметить каждый третий пост

17

Я работаю над сайтом WordPress для своей группы, и я хотел бы отметить каждый третий пост на нашей странице блога, чтобы к нему применялся специальный класс, у кого-нибудь есть указания, как этого добиться? Любая помощь очень очень ценится, спасибо! рок-н-ролл.

Зоран М
источник

Ответы:

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 пока официально.
Зоран М
1
Разве это не влияет на значение Globals (из-за оператора предварительного приращения) и потенциально может испортить что-то еще, что может зависеть от свойства count 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
мне это нравится. не совсем понимаю статические переменные. еще одна вещь, чтобы учиться сегодня!
helgatheviking
3
почему бы просто не использовать $wpdb->current_post?
Мило
@Milo Хороший улов +1
кайзер
спасибо, парни, большое спасибо за помощь! добавив это прямо сейчас!
Зоран М
ах эта функция крутая @kaiser и красиво просто! Оказывается, мне нужно что-то только для страницы категории. это спасет меня позже в жизни, мой друг, спасибо за то, что научил меня чему-то новому. +11!
Зоран М
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;

 }
helgatheviking
источник
Не уверен на 100%, но я думаю, вы могли бы использовать staticvar вместо a, globalчтобы сохранить пространство имен в чистоте. В любом случае: +1.
Кайзер
Вы имеете в виду изменить оба глобальных $ current_count на статический $ current_count? кажется, ничего не делает, когда я проверяю это. недостаточно знаком с переменной областью, хотя я согласен, что лучше не загрязнять пространство имен, если вы можете.
helgatheviking
Смотрите ответ ниже
kaiser
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 вы нацеливаетесь на каждый третий пост с помощью селектора nth-child.

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

Или с jQuery, вы можете добавить класс CSS, используя ту же технику.

jQuery(function($) {
    $( "article.post:nth-child(3n+0)" ).addClass("custom-class");
});
Rohmann
источник