Иногда при редактировании темы WordPress стоит задача удалить или добавить разные сайдбары на страницы Woocommerce. На страницу категорий и магазина один сайдбар, на страницу продукта — другой. Это можно легко осуществить.

Регистрируем и добавляем новый сайдбар в магазине

Предположим, что в вашей теме уже есть одна боковая колонка и вам понадобилось добавить еще один сайдбар в любом другом месте магазина. Для этого откроем файл functions.php дочерней темы и зарегистрируем новую зону для виджетов:

function register_woo_widgets(){
	register_sidebar( array(
		'name'		 => "Новый сайдбар",
		'id'		 => 'woo-right-sidebar',
		'description' => 'Виджеты в новой колонке магазина',
		'before_widget'	 => '<div id="%1$s" class="widget %2$s">',
		'after_widget'	 => '</div>',
		'before_title'	 => '<h3 class="widget-title">',
		'after_title'	 => '</h3>'
	) );
}
add_action( 'widgets_init', 'register_woo_widgets' );

Теперь в нужном файле Woocommerce, будь то страница одиночного продукта, каталога или рубрики, вставим код вывода сайдбара:

<?php  if ( is_active_sidebar( 'woo-right-sidebar' ) ) { ?>
	<aside id="sidebar-right" class="sidebar">
		<?php dynamic_sidebar( 'woo-right-sidebar' ); ?>
	</aside>
<?php } ?>

Если есть задача вывести верхний или нижний сайдбар на страницах каталога, рубрик или карточки товара, воспользуемся хуками:

add_action('woocommerce_before_main_content', 'my_theme_top_sidebar', 10);
add_action('woocommerce_after_main_content', 'my_theme_bottom_sidebar', 10);

Пример для вывода сайдбара над контентом: повторяем шаг №1 и в том же файле functions.php размещаем данный код:

add_action('woocommerce_before_main_content', 'my_theme_top_sidebar', 10);
function my_theme_top_sidebar() {
// в 1 функции измените ID woo-right-sidebar на woo-top-sidebar
     if ( is_active_sidebar( 'woo-top-sidebar' ) ) { ?>
    	<aside id="sidebar-top" class="sidebar">
    		<?php dynamic_sidebar( 'woo-top-sidebar' ); ?>
    	</aside>
    <?php } ?>
<?php
}

Чтобы сайдбар выводился на нужной странице используйте следующие функции.

Этот код проверяет, использует ли отображаемая страница шаблон WooCommerce:

<?php if ( is_woocommerce() ): ?>

Данный код проверит, есть ли страница одиночного товара:

<?php if ( is_product() ) : ?>

Для вывода содержимого на разных страницах Woocommerce используем код:

<?php if ( is_single() || is_page() ) : ?>

<!-- Товар/Пост/Страница -->

<?php elseif ( is_tax() ) : ?>

     <?php if ( is_tax( 'product_cat' ) ) : ?>
     <!-- Категория -->    
     <?php elseif ( is_tax( 'product_tag' ) ) : ?>
     <!-- Метка -->
     <?php else : ?>
     <!-- Другие таксономии -->
     <?php endif; ?>  

<?php elseif ( is_cart() ) : ?>

<!-- Корзина -->

<?php elseif ( is_checkout() ) : ?>

<!-- Страница заказа -->

<?php elseif ( is_account_page() ) : ?>

<!-- Мой аккаунт -->

<?php elseif ( is_search() ) : ?>

<!-- Результат поиска -->

<?php else : ?>      

<!-- Каталог товаров -->   
 
<?php endif; ?>

Чтобы данные не перезаписались при обновлении, создайте в дочерней теме файл woocommerce.php или single-product.php, используя в качестве основы шаблон родительской темы (подробнее о файлах плагина читайте в документации). Это позволит вам внести любые правки, вставить сайдбар или закомментировать ненужный. Как всё это организовать, читаем документацию: настройка дочерней темы и кастомизация файлов Woocommerce.

Как удалить сайдбар со страниц Woocommerce

Воспользуйтесь этим хуком если требуется удалить сайдбар со страницы одиночного продукта:

/**
 Remove Sidebar @ Single Product Page
 */ 
add_action( 'init', 'theme_remove_sidebar_product_pages' );
 
function theme_remove_sidebar_product_pages() {
if ( is_product() ) {
	remove_action( 'woocommerce_sidebar', 'woocommerce_get_sidebar', 10 );
	}
}

Удалим сайдбар со всех страниц Woocommerce.

add_action( 'wp', 'theme_remove_sidebar_all_woo_pages' );
  
function theme_remove_sidebar_all_woo_pages() {
remove_action('woocommerce_sidebar','woocommerce_get_sidebar',10);
}

Удаляем боковую колонку со страниц продукта в популярной теме Storefront.

/**
 Remove Sidebar @ Single Product Page
 */ 
add_action( 'get_header', 'remove_storefront_sidebar' );
  
function remove_storefront_sidebar() {
    if ( is_product() ) {
        remove_action( 'storefront_sidebar', 'storefront_get_sidebar', 10 );
        add_filter( 'body_class', function( $classes ) {
            return array_merge( $classes, array( 'page-template-template-fullwidth page-template-template-fullwidth-php ' ) );
        } );
    }
}

Этот хук полностью удалит сайдбар в теме Storefront, что сделает область содержимого страницы продукта шириной 100% без дополнительного CSS.

/**
 * Remove sidebar on product pages in Storefront.
 */
function theme_remove_sidebar( $is_active_sidebar, $index ) {
    if( $index !== "sidebar-1" ) {
        return $is_active_sidebar;
    } 
    if( ! is_product() ) {
        return $is_active_sidebar;
    } 
    return false;
}
 
add_filter( 'is_active_sidebar', 'theme_remove_sidebar', 10, 2 );

Этот код удалит боковую панель на страницах категорий, на одиночной странице продукта, в постах, на странице корзины, проверки заказа и аккаунта в теме Storefront.

add_action( 'wp', 'custom_remove_sidebar_shop_page' );
function custom_remove_sidebar_shop_page() {
if ( is_category() || is_single() || is_product()  || is_cart() || is_checkout() || is_account_page() ) {
   remove_action( 'storefront_sidebar', 'storefront_get_sidebar', 10 );
   add_filter( 'body_class', 'custom_remove_sidebar_class_body', 10 );
   }
}
function custom_remove_sidebar_class_body( $wp_classes ) {
   $wp_classes[] = 'page-template-template-fullwidth-php';
   return $wp_classes;
}

⚠️ Так как WordPress и его плагины могут изменяться, тестируйте любой кастомный код на промежуточном веб-сайте перед переходом в рабочую среду.

Комментарии

2 Комментариев

  1. Здравствуйте!
    Снова я. Опять не получилось, что не так?
    Цель: создать новый сайдбар и научиться размещать его в разных местах.

    вставил в функции.php темы rife free девятой строчкой:

    function register_woo_widgets(){
    register_sidebar( array(
    'name' => "Новый сайдбар",
    'id' => 'woo-right-sidebar',
    'description' => 'Виджеты в новой колонке магазина',
    'before_widget' => '',
    'after_widget' => '',
    'before_title' => '',
    'after_title' => ''
    ) );
    }
    add_action( 'widgets_init', 'register_woo_widgets' );

    Затем в single-product.php (к примеру) после
    get_header( 'shop' ); ?> вставил:

    Ожидал, что в настройках виджетов появится новая область, которую можно будет наполнить виджетами)

    Заранее благодарю!)

Оставьте комментарий

Комментарии, считающиеся спамом или исключительно рекламные по своему содержанию, будут удалены. Допускается включение ссылки на соответствующий контент, но текст должен иметь отношение к теме поста. Также будут удалены анонимные, оскорбительные, содержащие ненормативную лексику, вводящие в заблуждение или клеветнические комментарии.

Для публикации кода в комментариях используйте следующие шорткоды -
[php]ваш код[/php] - для PHP, [css]ваш код[/css] - для CSS, [code lang="js"]ваш код[/code] - для HTML или JS, указав соответствующий lang.

Ваш адрес email не будет опубликован. Обязательные поля помечены *