Чередующиеся классы post_class для каждой записи
Мне нужно добавить чередующиеся классы (even, odd...) к постам для создания альтернативного выделения в колонке. Лучшим решением будет привязать это к функции post_class(), чтобы классы добавлялись к каждому экземпляру post_class(). Ниже приведен код, который я использую для достижения этого эффекта.
<?php
// установка переменных для чередующихся категорий
$style_classes = array('even', 'odd');
$style_counter = 0;
?>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<div class="<?php $k = $style_counter%2; echo $style_classes[$k]; $style_counter++; ?>">
<?php the_cotent(); ?>
</div>
<?php endwhile; ?>
<?php endif; ?>

Вам следует добавить следующий код в файл functions.php
:
add_filter ( 'post_class' , 'my_post_class' );
global $current_class;
$current_class = 'odd';
function my_post_class ( $classes ) {
global $current_class;
$classes[] = $current_class;
$current_class = ($current_class == 'odd') ? 'even' : 'odd';
return $classes;
}
Это гарантирует, что все нечётные посты на странице будут иметь класс 'odd', а все чётные — класс 'even', просто при использовании функции post_class()
в вашей теме.

Это работает, передавая дополнительный класс в post_class()
:
<?php $c = 0; ?>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<div <?php post_class((++$c % 2 === 0) ? 'odd' : 'even'); ?>>
<?php the_content(); ?>
</div>
<?php endwhile; ?>
<?php endif; ?>
РЕДАКТИРОВАТЬ: Вот способ, который создает версию post_class()
, отслеживающую счетчик на странице. Теперь она будет использовать новое имя oddeven_post_class()
, но работает так, как вам нужно. Просто добавьте этот код в functions.php
:
/* Добавьте этот блок в functions.php */
class MyCounter {
var $c = 0;
function increment(){
++$this->c;
return;
}
function oddOrEven(){
$out = ($this->c % 2 === 0) ? 'odd' : 'even';
$this->increment();
return $out;
}
}
$my_instance = new MyCounter();
function post_class_oddeven() {
global $my_instance;
ob_start();
post_class($my_instance->oddOrEven());
$str = ob_get_contents();
ob_end_clean();
echo $str;
}
/* конец блока */
Для вызова используйте post_class_oddeven()
в вашей теме там, где вы бы использовали post_class()

Да, это все еще просто вариация решения выше. Возможно, я был не совсем ясен, но я ищу решение, которое можно было бы поместить в файл functions.php и затем просто передавать его в любой экземпляр post_class(). Таким образом, мне не придется изменять все отдельные экземпляры циклов, где это необходимо.

У меня есть другое решение, если вы хотите добавить определенный класс к разному контенту. Например, только к циклу:
add_filter( 'post_class', 'my_post_class' );
function my_post_class( $classes ) {
if ( ! is_single() ) {
global $wp_query;
// Устанавливаем класс "even" или "odd", если это не одиночная запись
$classes[] = $wp_query->current_post % 2 == 0 ? 'even' : 'odd' ;
}
return $classes;
}
Потому что вы не хотите добавлять класс "even" или "odd" при отображении одиночного контента.
