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

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

HIT

17.12.2017

1930


Deprecated: Function create_function() is deprecated in /home/htvtwmhs/public_html/wp-content/plugins/wp-spamshield/wp-spamshield.php on line 2033

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

Структура шаблонов 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. Задачу разобьем на 2 этапа: выборка категорий необходимых для воздействия и непосредственно функция. Вывод определенного Читать далее »

/
«Правильные» похожие товары в woocommerce

«Правильные» похожие товары в woocommerce

Похожие товары реализованы не совсем грамотно: если добавлять товарам метки (присущие большинству товаров, например 33 класс у ламината), то похожие товары будут выводится практически одни и те же. Исправляем данный Читать далее »

Разбираем woocommerce на молекулы

Разбираем woocommerce на молекулы


Deprecated: Function create_function() is deprecated in /home/htvtwmhs/public_html/wp-content/plugins/wp-spamshield/wp-spamshield.php on line 2033

В данном материале разбираем некоторые хуки woocommerce, их последовательность, а также в структуру шаблонов WC и их проверку. Добавляем стандартные хлебные крошки WC <?php woocommerce_breadcrumb(); ?> Файлы шаблона: archive-product.php — Читать далее »

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

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

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