/ Сайтостроение / Плагины / Разные шаблоны для разных категорий товаров

Разные шаблоны для разных категорий товаров

HIT

17.12.2017

3178

Учимся создавать разные шаблоны товаров для разных категорий. Данная технология пригодиться в оформлении принципиально разных по подаче товаров. Также на основе этого можно создавать посадочные страницы категорий, создавая им любое оформление.

Структура шаблонов woocommerce

Я использую вот такую иерархию шаблонов woocommerce (уже немного отличающуюся от той которую использовал ранее)

<?php if ( is_product() ) : ?>
  
		Шаблон товара
  
<?php elseif ( is_shop() ) : ?>
  
		<?php if ( is_search() ) : ?>  
  
		Шаблон поиска
  
		<?php else: ?> 
  
		Шаблон каталога товаров (витрина)

  		<?php endif; ?> 
  
<?php else: ?>  
	
		Шаблон категории товара
  
<?php endif; ?>

Там где выводиться шаблон категории товара прописываем условия вывода.

<?php $product_cat = get_queried_object();
if($product_cat->slug == 'elektronika'): ?>
	
		Здесь будет верстка лэндинга!
                <?php get_template_part( 'woocommerce/taxonomy-product_cat-elektronika' ); ?>
	
<?php else: ?>		

		<h1 id="title"><?php printf( __( '%s', 'twentythirteen' ), single_cat_title( '', false ) ); ?></h1>   
 
		<div class="box">
	
		<?php get_sidebar(); ?>
		<div class="block-9" id="content">
  				<?php the_widget( 'WC_Widget_Layered_Nav_Filters' ); ?>
				<?php get_template_part( 'woocommerce/archive-product' ); //woocommerce_content(); ?>
		</div>
	
</div>
<?php endif; ?>

Можно не прописывать конструкцию

$product_cat = get_queried_object();
if($product_cat->slug == 'elektronika'):

А вместо нее использовать простое условие

if ( is_product_category( 'elektronika' ) ) :

Для прописанной категорий товара (в данном примере — Электроника) будет выводиться другой шаблон. Данный способ неудобен тем, что необходимо вручную прописывать условия. А если у нас будет много категорий с подкатегориями? В этом случае целесообразно задать таксономии новый параметр Шаблон в глобальную переменную term (по аналогии как это делает плагин taxonomy term image master).

Вывод разных шаблонов товаров в категории

Еще один уровень кастомизации категории WC это разные варианты вывода самих товаров. В этом случае мы должны по определенному запросу разделять визуализацию товаров. Если в простом варианте, то для определенных категорий выводить товары без цены. Если делать более продвинутый вариант — товары могут выводить вовсе по разному.

Если в назначении шаблона woocommerce использовать универсальную функцию woocommerce_content(); то почему то игнорируется шаблон archive-product.php. А для разделения вывода товаров в категории нужен именно archive-product.php.

get_template_part( ‘woocommerce/content-single-product’ ); — вывод карточки товара
get_template_part( ‘woocommerce/archive-product’ ); — вывод категории товара
get_template_part( ‘product-cat-list’ ); — разработанный мной шаблон вывода каталога товаров
woocommerce_content(); — вывод результатов поиска по товарам

В файле archive-product.php (внутри цикла while) нам нужно добавить условия вывода товаров и создать соответствующий файл в папке woocommerce/content-laminat.php

<?php $product_cat = get_queried_object();
if($product_cat->term_id == 24): ?>

		<?php wc_get_template_part( 'content', 'laminat' ); ?>

<?php else: ?>

		<?php wc_get_template_part( 'content', 'product' ); ?>
  
<?php endif; ?>

Создаем атрибут Шаблон у категории

Ранее мы пришли к выводу, что было бы удобнее создать в категориях параметр — Шаблон, в зависимости от которого будут выводиться разные шаблоны категорий. Так вот, я переделал плагин taxonomy term image master, создав новый плагин wc-template-select:

if ( ! defined( 'ABSPATH' ) ) { exit; }

if ( ! class_exists( 'Taxonomy_Term_Template' ) ) :

class Taxonomy_Term_Template {

	// array of slugs for the taxonomies we are targeting
	// api: use filter 'taxonomy-term-template-taxonomy' to override
	private $taxonomies = array( 'category' );

	// defined during __construct() for i18n reasons
	// api: use filter 'taxonomy-term-template-labels' to override
	private $labels = array();

	// @deprecated: option_name for pre-term-meta data storage
	// api: use filter 'taxonomy-term-template-option-name' to override
	private $option_name = '';

	// our term meta key
	// api: use filter 'taxonomy-term-template-meta-key' to override
	private $term_meta_key = 'term_template';


	// Simple singleton to enforce one instance
	// @return Taxonomy_Term_Template object

	static function instance() {
		static $object = null;
		if ( is_null( $object ) ) {
			$object = new Taxonomy_Term_Template();
		}
		return $object;
	}

	private function __clone(){} // prevent cloning

	private function __wakeup(){} // prevent unserialization


	// Init the plugin and hook into WordPress

	private function __construct() {
		// default labels
		$this->labels = array(
			'fieldTitle'       => __( 'Шаблон' ),
			'fieldDescription' => __( 'Выберите шаблон, для этого элемента' ),
			'adminColumnTitle' => __( 'Шаблон' ),
		);

		// allow overriding of the html text
		$this->labels = apply_filters( 'taxonomy-term-template-labels', $this->labels );

		// allow overriding of the target taxonomies
		$this->taxonomies = apply_filters( 'taxonomy-term-template-taxonomy', $this->taxonomies );

		if ( ! is_array( $this->taxonomies ) ) {
			$this->taxonomies = array( $this->taxonomies );
		}

		// @deprecated: allow overriding of option_name
		// default option name keyed to the taxonomy
		$this->option_name = $this->taxonomies[0] . '_term_templates';
		$this->option_name = apply_filters( 'taxonomy-term-template-option-name', $this->option_name );

		// allow overriding of term_meta
		$this->term_meta_key = apply_filters( 'taxonomy-term-template-meta-key', $this->term_meta_key );

		// hook into WordPress
		$this->hook_up();
	}


	// Hook into WordPress

	private function hook_up(){
		// зарегистрируйте наш термин meta
		register_meta( 'term', $this->term_meta_key, array(
	'type'              => 'string',
	'description'       => 'Шаблон термина',
	'single'            => true,
	'sanitize_callback' => null,
	'auth_callback'     => null,
	'show_in_rest'      => false,
) );

		// добавьте наши данные, когда срок будет восстановлен
		add_filter( 'get_term', array( $this, 'get_term' ) );
		add_filter( 'get_terms', array( $this, 'get_terms' ) );
		add_filter( 'get_object_terms', array( $this, 'get_terms' ) );

		// нужно только добавить большинство хуков в админке
		if ( is_admin() ) {

			foreach ( $this->taxonomies as $taxonomy ) {
				// добавить поле Шаблон в формы таксономии
				add_action( $taxonomy . '_add_form_fields', array( $this, 'taxonomy_add_form' ) );
				add_action( $taxonomy . '_edit_form_fields', array( $this, 'taxonomy_edit_form' ) );

				// hook into term administration actions
				add_action( 'create_' . $taxonomy, array( $this, 'taxonomy_term_form_save' ) );
				add_action( 'edit_' . $taxonomy, array( $this, 'taxonomy_term_form_save' ) );

				// custom admin taxonomy term list columns
				add_filter( 'manage_edit-' . $taxonomy . '_columns',  array( $this, 'taxonomy_term_column_template' ) );
				add_filter( 'manage_' . $taxonomy . '_custom_column', array( $this, 'taxonomy_term_column_template_content' ), 10, 3 );
			}
		}
	}


	// Добавить новый столбец, который показывают выбранный шаблон.
	// @param $columns
	// @return mixed

	function taxonomy_term_column_template( $columns ){
		$columns['term_template'] = $this->labels['adminColumnTitle'];

		return $columns;
	}


	// Показывать выбранное изображение термина во вновь созданном столбце администратора
	// @param $content
	// @param $column_name
	// @param $term_id
	// @return mixed

	function taxonomy_term_column_template_content( $content, $column_name, $term_id ){
		if ( 'term_template' == $column_name ){
			$term = get_term( $term_id );
			
			if ( $term->term_template ) {
				$content = get_term_meta( $term_id, $this->term_meta_key, true );
			}
		}
		return $content;
	}


	// Добавьте данные изображения к любому соответствующему вызову get_term (). Двойная функция как вспомогательная функция для этого -> get_terms ().
	// @param $_term
	// @return object

	function get_term( $_term ) {
		// только модифицируйте термин, когда имеете дело с нашими таксономиями
		if ( is_object( $_term ) && in_array( $_term->taxonomy, $this->taxonomies ) ) {

			// default to null if not found
			$template_id = get_term_meta( $_term->term_id, $this->term_meta_key, true );
			$_term->term_template = !empty( $template_id ) ? $template_id : null;
		}
		return $_term;
	}

	// Добавьте term_template данные в объекты, когда вызывается get_terms () или wp_get_object_terms ().
	// @param $terms
	// @return array

	function get_terms( $terms ) {
		foreach( $terms as $i => $term ){
			if ( is_object( $term ) && !empty( $term->taxonomy ) ) {
				$terms[ $i ] = $this->get_term( $term );
			}
		}
		return $terms;
	}



	// HTML формы для термина таксономии
	// @param  int    $image_ID  the image ID
	// @return string the html output for the image form

	function taxonomy_term_template_field($term) {

		wp_nonce_field( 'taxonomy-term-template-form-save', 'taxonomy-term-template-save-form-nonce' );
		
		$params = array( 
		'table' => 'Таблица',
		'landing' => 'Лэндинг',
		);
		
		?>	
		
		<select id="taxonomy-term-template-id" name="taxonomy_term_template">
		<option value="">По умолчанию</option>';
		<?php foreach( $params as $val => $name ): ?>
		<option value="<?php echo $val; ?>" <?php echo selected( $term, $val, 0 ); ?>><?php echo $name; ?></option>';
		<?php endforeach; ?>
		</select>
		
		<p class="description"><?php echo $this->labels['fieldDescription']; ?></p>

		<?php
	}


	// Добавить поле при создании нового термина таксономии
	function taxonomy_add_form($term){
		?>
		<div class="form-field term-image-wrap">
			<label><?php echo $this->labels['fieldTitle']; ?></label>
			<?php $this->taxonomy_term_template_field($term); ?>
		</div>
		<?php
	}

	
	// Добавить поле при редактировании терминов таксономии 
	// @param $term | object | the term object

	function taxonomy_edit_form( $term ){
		// ensure we have our term_template data
		if ( !isset( $term->term_template ) ){
			$term = $this->get_term( $term, $term->taxonomy );
		}
		?>
		<tr class="form-field">
			<th scope="row" valign="top"><label><?php echo $this->labels['fieldTitle']; ?></label></th>
			<td class="taxonomy-term-template-row">
				<?php $this->taxonomy_term_template_field( $term->term_template ); ?>
			</td>
		</tr>
		<?php
	}


	// Функция сохраняющая мета термина таксономии
	// @param $term_id

	function taxonomy_term_form_save( $term_id ) {
		// наши требования к сохранению:
		if (
			// nonce был представлен и проверен
			isset( $_POST['taxonomy-term-template-save-form-nonce'] ) &&
			wp_verify_nonce( $_POST['taxonomy-term-template-save-form-nonce'], 'taxonomy-term-template-form-save' ) &&

			// данные о таксономии и данные taxonomy_term_template
			isset( $_POST['taxonomy'] ) &&
			isset( $_POST['taxonomy_term_template'] ) &&

			// представленная таксономия является одной из таксономий, с которыми мы имеем дело
			in_array( $_POST['taxonomy'], $this->taxonomies )
		)
		{
			// получить term_meta и назначить ему old_template
			$old_template = get_term_meta( $term_id, $this->term_meta_key, true );

			// sanitize the data and save it as the new_template
			$new_template = $_POST['taxonomy_term_template'];

			// if an image was removed, delete the meta data
			if ( $old_template && '' === $new_template ) {
				delete_term_meta( $term_id, $this->term_meta_key );
			}
			// if the new image is not the same as the old update the term_meta
			else if ( $old_template !== $new_template ) {
				update_term_meta( $term_id, $this->term_meta_key, $new_template );
			}
		}
	}
}

endif;


// Инициализируйте плагин, вызывая его экземпляр в WordPress action 'init'

function taxonomy_term_template_init() {
	Taxonomy_Term_Template::instance();
}
add_action( 'init', 'taxonomy_term_template_init' );



// Использовать для различных таксономий

function the_term_template_taxonomy( $taxonomy ) {
        return array( 'product_cat', 'product_tag', 'category', 'brend' );
    }
add_filter( 'taxonomy-term-template-taxonomy', 'the_term_template_taxonomy' );

Одной из основных «фишек» плагина является то, что параметр term_template доступен из переменной WP_Term Object:

$product_cat = get_queried_object();
print_r($product_cat);

Результат:
WP_Term Object ( [term_id] => 107 [name] => Электроника [slug] => elektronika [term_group] => 0 [term_taxonomy_id] => 107 [taxonomy] => product_cat [description] => [parent] => 0 [count] => 1 [filter] => raw [term_template] => landing )

Далее прописываем условия по выводу шаблонов

<?php $product_cat = get_queried_object();
		if ( $product_cat->term_template == 'landing' ) : ?>
				Шаблон лэндинга
		<?php elseif ($product_cat->term_template == 'table'): ?>	
				Шаблон таблицы
		<?php else: ?>		
				Шаблон по умолчанию
		<?php endif; ?>

Было бы здорово доработать проверку наличия шаблона у родительской категории, при отсутствии шаблона у текущей категории, но это уже излишне. По крайней мере назначить шаблон подкатегориям, причем сделать это можно при их создании, легче чем прописывать сами категории в условиях вывода.

Тэги:

Поделится информацией с друзьями

  • Похожие записи
  • Комментарии
  • Вложения
Статусы заказов

Статусы заказов

Как и любой интернет-магазин Woocommerce присваивает заказам определенные статусы в зависимости от отплаты и формирования заказа. Существует 7 различных статусов заказа: В ожидании оплаты (Pending payment) Обработка (Processing) На удержании Читать далее »

Metabox woocommerce

Metabox woocommerce

У плагина woocommerce есть набор дополнительных полей при редактировании товара. При необходимости можно в группы полей WC добавить свои произвольные metabox. Должно получится так: Создание и отображение metabox Первый экшн Читать далее »

/
Исчезающие сообщения woocommerce

Исчезающие сообщения woocommerce

У woocommerce есть встроенная система сообщений: при добавлении товара в корзину, при удалении товара из корзины, при различных ошибках. Но они появляются перед основным контентом, нарушая исходную верстку. Сделаем их Читать далее »

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

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

Разные шаблоны для разных категорий товаров
Разные шаблоны для разных категорий товаров
Рекомендации для васРазные шаблоны для разных категорий товаровOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.