/ Wordpress / Запись NEW (знакомство с post_class)

Запись NEW (знакомство с post_class)

HIT

23.04.2016

3887

У 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);
Класс new добавляется всем похожим товарам, если карточка товара с классом new. Нужно исправить.

Исправленный доработанный код: 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]
  • Комментарии
  • Вложения

Добавить комментарий

Пока нет комментариев. Будь первым!

Запись NEW (знакомство с post_class)
wp_nav_menu
Рекомендации для васwp_nav_menuOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.