Як позначити кожен 3-й пост


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? Я маю на увазі, ймовірність мала, правда, але чи не було б безпечніше це зробити (0 === ($ GLOBALS ['wpdb'] -> current_post + 1)% 3? 'Третій': '')?
Том Ожер

1
@TomAuger З якоїсь не настільки очевидної причини, схоже, це не має жодних побічних ефектів. Але з точки зору елегантності - ви праві. Я додав кращий приклад. :)
fuxia

4
Notice: Undefined property: wpdb::$current_post in
Нот

9

Як додаток до відповіді @helgathevikings

Використовуйте fn post_class (), не забруднюючи глобальний простір імен

  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% впевнений, як він буде обробляти пагинацію b / ci не вистачає повідомлень на моїй локальній установці, щоб перевірити це

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% впевнений, але я думаю, що ви можете використовувати staticvar замість а, globalщоб зберегти чистий простір імен. У будь-якому разі: +1.
кайзер

ти маєш на увазі змінити як глобальний $ current_count на статичний $ current_count? Здається, нічого не роблю, коли я тестую це. недостатньо знайома область / змінна область, хоча я згоден, краще не забруднювати простір імен, якщо можете.
helgatheviking


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");
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.