• Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!
  • Темы озаглавленные с маленькой буквы или капсом удаляются без предупреждения!

Вопрос по сайдбару

mashams

Новичок
Есть такая проблема. Использую тему i-craft и плагин woocommerce. При открытии страницы категории товаров (где отображается список товаров) слева у меня отображается сайдбар, в котором находится виджет фильтра товаров (фильтр по цене и прочим атрибутам). Больше никаких виджетов нет. Когда открываю другие страницы, на которых нет списка товаров, виджет фильтра товаров уже не отображается, но остается пустое белое поле (т.е. сайдбар отображается, но виджетов внутри него нет). Вопрос: как убрать это пустое белое поле и выводить сайдбар только на тех страницах сайта, где отображаются виджеты?
 

mashams

Новичок
Мне нужно выводить сайдбар только там, где есть товары. Можно ли сделать условие - если товары есть на странице, то выводить сайдбар? В остальных случаях сайдбар не выводить.
 

D&B

Администратор
Команда форума
Местный
Можно, если была бы норм. тема. А так смотрите в настройках страницы под каждый товар.
 

Stork.71

Гуру
Местный
В принципе, можно ковыряться с CSS. Менять width основного блока для нужных страниц.
Там у Вас просто пустое место, или все же что-то есть? Если что-то есть, то это что-то надо будет еще убирать. Наверное, как-то делать через functions.php, добавлять там проверку на содержимое страницы. Или просто для сайдбара для этих страниц прописывать display:none
 

mashams

Новичок
Ну то есть когда я нажимаю на определенный пункт меню, у меня выводятся все товары, принадлежащие одной категории, которая привязана к этому пункту меню, а слева сайдбар, в котором расположен фильтр поиска товаров. Когда нажимаю на другой пункт меню, где товаров нет, то фильтр товаров уже не выводится, остается только пустое белое поле , потому что других виджетов там нет. Нужно сделать так, чтобы сайдбар отображался только в том случае, если отображаются виджеты. Я рассматривала два варианта, как решить эту проблему: либо с помощью css, либо прописать какое-то условие в шаблоне, чтобы сайдбар выводится при выполнении этого условия (вопрос в том, какое именно условие прописать, я пока не нашла ничего подходящего, может быть есть какие-то условные теги?). Когда не отображаются виджеты, html выглядит примерно так:
HTML:
<div id="primary" class="content-area">
<div id="content" class="site-content" role="main">
<p class="woocommerce-info">Товаров, соответствующих вашему запросу, не обнаружено.</p>
</div>
<div id="tertiary" class="sidebar-container" role="complementary">
<div class="sidebar-inner">
<div id="sidebar-widgets" class="widget-area"> </div>
</div>
</div>
</div>
Блок с классом site-content имеет ширину 75%, если в админке добавлены виджеты и ширину 100%, если нет. Если виджеты добавлены, но на сайте не отображаются, то ширина всё равно 75%. В этом вся проблема. А белое поле выглядит как на картинке:
site1.JPG
 

Stork.71

Гуру
Местный
ага, то есть вас интересуют ТОЛЬКО страницы категорий? это другое дело немного.
Во-первых, я бы не рекомендовал. Разный дизайн для разных категорий - это зло. Посетитель может путаться. Лучше добавьте какой-нибудь стандартный виджет - баннер, менюшку, "рекомендуемые"... Пусть он вылазит под фильтром, а если фильтра нет - то будет тоько он однин. Нет проблемы с пустым местом, нет проблемы с разным дизайном.
Если уж совсем невмоготу. body страницы имеет кучу классов. Например:
<body class="archive tax-product_cat term-cifrovye-termoregulyatory term-14 logged-in layout-right-content _masterslider _ms_version_2.7.1 woocommerce woocommerce-page woocommerce-demo-store gecko alt-style-default">
Обратите внимание в частности на term-cifrovye-termoregulyatory. Это и есть название категории. Ну в общем присмотритесь к ним ;) Благодаря им можно дифференцировать css - свойства.

ПС. Терморегуляторы для Галанов не интересуют? ;)
 

mashams

Новичок
В принципе, дизайн у всех категорий должен был быть одинаковый, т.к. в каждой категории выводится список товаров и фильтр по товарам, я хотела убрать сайдбар только у тех категорий, в которых на данный момент нет ни одного товара (т.к. фильтр у этих категорий не выводится, поэтому хотелось растянуть содержимое страницы на всю ширину). Соответственно, когда в те категории, в которых не было товаров, добавляются новые товары, сайдбар с фильтром должен был появляться. Т.е. я хотела сделать, чтобы сайдбар появлялся в зависимости от содержимого. Но похоже это сложно сделать, наверно всё-таки придется добавлять стандартный виджет. Сайт делаю не для себя, а для заказчика, возможно, он согласится добавить какие-нибудь виджеты.
 

mashams

Новичок
Дело даже не только в пустых категориях. Изначально предполагалось, что все виджеты на сайте будут располагаться внизу (в футере), а боковой сайдбар будет только в категориях. Но когда добавили виджеты в категориях, то сайдбар появился на всех страницах сайта в виде пустого поля. Вот, например, содержимое файла
PHP:
<?php

if ( is_active_sidebar( 'sidebar-2' ) ) : ?>

    <div id="tertiary" class="sidebar-container" role="complementary">
        <div class="sidebar-inner">
            <div class="widget-area" id="sidebar-widgets">
                <?php dynamic_sidebar( 'sidebar-2' ); ?>

            </div><!-- .widget-area -->
        </div><!-- .sidebar-inner -->
    </div><!-- #tertiary -->
<?php endif; ?>
С помощью условия is_active_sidebar проверяется есть ли виджеты в сайдбаре, но не проверяется, отображаются эти виджеты на сайте или нет. Поэтому и получается, что сайдбар появляется на всех страницах сайта. Я хотела найти условие, с помощью которого проверяется именно отображение виджета на сайте, но так и не могу найти, непонятно даже, реально ли вообще сделать такую проверку.
 
Последнее редактирование:

artemkomarov

Специалист
Местный
Я хотела найти условие, с помощью которого проверяется именно отображение виджета на сайте, но так и не могу найти, непонятно даже, реально ли вообще сделать такую проверку.

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

Код:
// получаем контент из сайдбара
function get_dynamic_sidebar_content() {
        $sidebar_contents = "";

        ob_start();
        dynamic_sidebar( 'sidebar-1' ); // id сайдбара
        $sidebar_contents = ob_get_clean();

        if ( $sidebar_contents == '' ) {
            add_filter( 'body_class', 'full_width_content' );
        }
}
add_action('wp_head', 'get_dynamic_sidebar_content');

// добавляем класс в body если в сайдбаре нет контента
function full_width_content( $classes ) {
    $classes[] = 'storefront-full-width-content'; // класс для full width контента
    return $classes;
}
 
Сверху Снизу