Разработка сайта «Star Floors»
Предыстория
Описание этапов работы
Одна из задач, которая была поставлена при разработке сайта – создание раздела «Системы покрытий», который имеет две основные категории:
- Системы напольных покрытий
- Области применения
Сложность заключалась в том, что каждая категория имеет свой шаблон вывода записей, также для записей предусмотрен свой шаблон в зависимости от категории. Так как иерархия предполагалась очень большой, то разработка раздела через «Страницы» с использованием шаблонов не подходила под решение данной задачи. Поэтому написание кастомного типа записи с использованием своей таксономии было единственным правильным решением.
P.S: Если в разделе предполагаются более чем 30 категорий и записей, то верным решением будет написание кастомного типа записи. В иных случаях можно обойтись и разработкой через общий раздел «Страницы».
Создав кастомный тип записи и таксономию категорий, первой задачей было сделать индивидуальный вывод записей для каждой категории. Так как в WordPress есть своя иерархия шаблонов, то для кастомных категорий я создал файл taxonomy-systems-category.php, отвечающий за вывод записей в категории.
Так как записи выводятся в цикле, то сперва необходимо было получить ID категории.
$term_id = get_queried_object()->term_id;
После того, как получен необходимый ID, следующим этапом будет передача в его в цикл.
$args = array(
'post_type' => 'systems',
'post_status' => 'publish',
'posts_per_page' => -1,
'orderby' => 'date',
'order' => 'ASC',
'tax_query' => array(
array(
'taxonomy' => 'systems-category',
'field' => 'term_id',
'terms' => $term_id))
);
И напоследок нужно было через обычное разветвление if сделать проверку ID и вывести индивидуальную верстку для категории.
Так как у кастомного типа записи есть всего один single файл, то решением для вывода индивидуальной верстки записи было:
В самом файле single получить все термы кастомной таксономии, после чего через цикл foreach прогнать все термы и сделать проверку на совпадение слагов. Если слаги совпали то подтянуть соответственный файл из папки template-parts.
$categories = get_the_terms(get_the_ID(), 'systems-category');
foreach( $categories as $cat ){
if($cat->slug == 'oblasti-primenenija'){
get_template_part('template-parts/systems/area');
} elseif($cat->slug = 'sistemy-napolnyh-pokrytij') {
get_template_part('template-parts/systems/coating');}}
Так же одной из задач при разработке сайтов в связке WordPress + Woocommerce стоит обновление файлов шаблонов темы при выходе новой версии плагина Woocommerce. Так как зачастую разработка ведется непосредственно в файлах шаблонов темы, то их обновлении затрудняется в разы так как нужно открывать две версии файлов и делать сравнительный анализ на их изменение. Зачастую при разработке на Woo задействуются в основном следующие файлы:
- archive-product.php
- taxonomy-product-cat.php
- content-single-product.php
- single-product.php
При работе над данным проектом, у меня появилось решение, при котором я избегаю правок данных шаблонов, что позволяет мне сократить время на обновление шаблонов.
Кто работал когда-то из woocommerce знает, что он построен на основе фильтров и хуков. Для разработчика это огромный плюс, так как зная как все устроено, можно достучатся к любому нужному месту на сайте. Вся разработка Каталога данного проекта велась всего в одном файле: function.php.
Так как расписывать по каждой странице, будет долго и муторно, за основу возьму страницу «категории каталога».
add_action( 'wp', 'wcc_remove_actions_from_category_page' );
function wcc_remove_actions_from_category_page() {
if ( is_product_category() ) {
remove_action( 'woocommerce_sidebar', 'woocommerce_get_sidebar', 10) ;
remove_action( 'woocommerce_before_shop_loop', 'woocommerce_result_count', 20);
add_action( 'woocommerce_before_shop_loop', 'wcc_category_list_navigation', 10);
add_action( 'woocommerce_before_shop_loop', 'wcc_product_wrapper_end', 50);
add_action( 'woocommerce_before_shop_loop', 'woocommerce_pagination', 40);
add_action( 'woocommerce_after_shop_loop', 'wcc_category_list_navigation_bottom', 5);
add_action( 'woocommerce_after_shop_loop ', 'wcc_product_wrapper_end', 90);
}
}
При создании данной функции я не затронул шаблон archive-product и taxonomy-product_cat, а сделал изменения только на странице категории.