У wordpressa есть система назначения классов для записи в зависимости от ее параметров (hentry, категория, метки, формат, тип и другие) — post_class.
Добавление своего класса в post_class
Вставлять в файле functions.php
Данный код добавит класс pervii всем постам, которые идут в цикле первыми.
add_filter('post_class', 'dobavit_pervii_klass');
function dobavit_pervii_klass($klassi) {
global $wp_query;
if ($wp_query->current_post == 0) :
$klassi[] = 'pervii';
endif;
return $klassi;
}
Добавить название категорий записи (без приставки cat-)
// добавка названий категорий в виде классов в функции body class и post class
function category_id_class($classes) {
global $post;
foreach((get_the_category($post->ID)) as $category)
$classes[] = $category->category_nicename;
return $classes;
}
add_filter('post_class', 'category_id_class');
<strong>//add_filter('body_class', 'category_id_class');</strong>
Жирным показано, что данный код можно применить и к body_class.
Записи NEW
Чтобы у записей автоматически ставился лэйбл new, надо добавить следующий php-код, в конструкцию вывода записей в цикле (solus).
<div <?php if(get_the_time('U') > time() - 7*24*3600) echo 'class="new"'; ?> <?php post_class() ?> id="post-<?php the_ID(); ?>">
отдельно:
<?php if(get_the_time('U') > time() - 7*24*3600) echo 'class="new"'; ?>
7*24*3600 — это количество — сколько запись считается «свежей».
Альтернативный вариант — без редактирования solus.php, код в functions.php
add_filter( 'post_class', 'post_class_example' );
function post_class_example( $classes ) {
global $wp_query;
if (get_the_time('U') > time() - 7*24*3600) {
$classes[] = 'new';
}
return $classes;
}
В шаблоне вывода записи (single.php) тоже можно вывести лэйбл NEW
<div id="labelblock"><?php the_terms( $post->ID , 'label', '' , '',''); ?><?php if(get_the_time('U') > time() - 7*24*3600) echo '<a href="new">NEW</a>'; ?></div>
Отдельно
<?php if(get_the_time('U') > time() - 7*24*3600) echo '<a href="new">NEW</a>'; ?>
Подробнее про оформление и вывод лэйблов.
Товары NEW
Такой же метод применим и к товарам woocommerce, но немного отличается конструкция php. В локализованной папке woocommerce берем шаблон content-product.php (вывод товаров в категории/подкатегории) и меняем строку
<li <?php post_class( $classes ); ?>>
на
<li <?php if(get_the_time('U') > time() - 14*24*3600) $classes[] = 'new'; post_class( $classes ); ?>
Либо использовать универсальную функцию для записей NEW (предыдущий пункт).
Товар NEW не только по дате
Как показывает практика, назначения лэйбла NEW только по дате не всегда эффективно. В частности когда товары добавляются не часто. И выходит так, что новых товаров нет. Доработаем технологию назначения post_class NEW: добавляя этот лэйбл последним 5 товарам в независимости от срока их добавления.
add_filter( 'post_class', 'post_class_example' );
function post_class_example( $classes ) {
global $wp_query;
$myposts = get_posts( array('post_type' => 'product', 'posts_per_page' => '5', ) );
foreach($myposts as $post) { $all_ids[] = $post->ID; }
$result = in_array($wp_query->post->ID, $all_ids);
if (get_the_time('U') > time() - 7*24*3600 || !empty($result)) {
$classes[] = 'new';
}
return $classes;
}
В данном коде можно поменять соответственно тип записи и количество последних записей.
И сразу еще одна доработка: можно не делать перебор массива $myposts (чтобы получить ID записей), а просто в get_posts прописать получения только ID.
$myposts = get_posts( array('post_type' => 'product', 'posts_per_page' => '10', <strong>'fields' => 'ids'</strong> ) );
$result = in_array($wp_query->post->ID, $myposts);
Исправленный доработанный код: global $wp_query; заменил на global $product; и стал сравнивать массив $myposts с $product->get_id()
add_filter( 'post_class', 'post_class_example' );
function post_class_example( $classes ) {
global $product;
$myposts = get_posts( array('post_type' => 'product', 'posts_per_page' => '10', 'fields' => 'ids' ) );
if (get_the_time('U') > time() - 7*24*3600 || in_array($product->id, $myposts)) {
$classes[] = 'new';
}
return $classes;
}
Все равно работает не корректно — пропадают записи в админке. Решение: вставляю функцию напрямую в шаблоны, где она нужна (index.php, woocommerce.php).
Добавление товару лэйбла NEW по произвольному полю описано здесь.
Вывод иконки по метке NEW
<?php $tags = wp_get_post_tags($post->ID);
if ($tags[0]->slug == 'new') {
echo '<img class="novinka" src="/wp-content/uploads/2018/03/Novinka.png">';
}?
Добавить класс к товару
post_class также добавляет классы и к продукту (как в архивах, так и в карточке). Пример добавления класса к товару у которого не указана цена:
// Добавить класс к товару без цены
function add_custom_class_to_product( $classes ) {
if ( 'product' == get_post_type() ) {
global $product;
$product_price = $product->get_price();
if ( empty($product_price) ) {
$classes[] = 'empty-price';
}
}
return $classes;
}
add_filter( 'post_class', 'add_custom_class_to_product' );
[site-socialshare]