Скрыть атрибуты продукта WooCommerce с пустыми значениями из пользовательского короткого кода

Я использовал приведенный ниже код для отображения определенного количества атрибутов на настраиваемой вкладке с помощью короткого кода. Это работает нормально, но не все продукты имеют одинаковые характеристики. Как я могу скрыть строки, которые не содержат данных?

Я ввел этот код:

// Display grouped attributes Gewicht en Omvang
function get_product_attributes_gewicht_shortcode( $atts ) {
extract( shortcode_atts( array(
    'id'    => get_the_ID(),
), $atts, 'display-attributes-gewicht' ) );

global $product;

if ( ! is_a($product, 'WC_Product') ) {
    $product = wc_get_product( $id );
}
if ( is_a($product, 'WC_Product') ) {
    $gewicht = $product->get_attribute( 'Gewicht (gram)' );
    $hoogte = $product->get_attribute( 'Hoogte (mm)');
    $lengte = $product->get_attribute( 'Lengte (mm)');
    $breedte = $product->get_attribute( 'Breedte (mm)');
    return '<div class = "divTableAtt LichtBlauweRegels">' .
                '<div class = "divTableAttBody">' .
                    '<div class = "divTableAttRow">' .
                        '<div class = "divTableAttCell">Gewicht (gram)</div>' .
                        '<div class = "divTableAttCell">' . $gewicht . '</div>' .
                    '</div>' .
                    '<div class = "divTableAttRow">' .
                        '<div class = "divTableAttCell">Hoogte (mm)</div>' .
                        '<div class = "divTableAttCell">' . $hoogte . '</div>' .
                    '</div>' .
                    '<div class = "divTableAttRow">' .
                        '<div class = "divTableAttCell">Lengte (mm)</div>' .
                        '<div class = "divTableAttCell">' . $lengte . '</div>' .
                    '</div>' .
                    '<div class = "divTableAttRow">' .
                        '<div class = "divTableAttCell">Breedte (mm)</div>' .
                        '<div class = "divTableAttCell">' . $breedte . '</div>' .
                    '</div>' .
                '</div>' .
            '</div>';
}
}
add_shortcode( 'display-attributes-gewicht', 'get_product_attributes_gewicht_shortcode' );`

Я хочу скрыть, если атрибут в этой строке пуст. Я пытался использовать оператор if для этой строки, но он не работает.

if (isset($breedte)){
return '<div class = "divTableAttRow">' .
'<div class = "divTableAttCell">Breedte (mm)</div>' .
'<div class = "divTableAttCell">' . $breedte . '</div>' .
'</div>';
}

Раньше я закрывал строку с помощью ; и начал строку с нового оператора возврата.

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

Я все еще изучаю это и выясняю, как заставить это работать.

@DarkBee, извини, мне плохо. Я использую две части кода в одном примере. Я изменил добавленный код, чтобы отразить то, что я сделал (но теперь правильно)

John Roeland 20.08.2024 14:32

Я предполагаю, что $product->get_attribute( 'Breedte (mm)') возвращает пустую строку, которая isset не учитывается. Связано: isset() и пустой() — что использовать

DarkBee 20.08.2024 14:46

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

C3roe 20.08.2024 14:47

Breedte имеет набор значений, отображается и используется только в качестве примера. У меня есть [страница продукта] (shop.r-go-tools.com/alle-producten/…), и если вы прокрутите вниз до вкладки продукта «Характеристики» и вложенной вкладки «Algemeen», вы увидите 2 пустые значения: «Макет тоэценборда» и «Мультимедиатоэцен». Например, я хочу скрыть эти две строки. Таблица генерируется точно так же, как в приведенном выше коде. Нужно ли мне переписывать код? Или я могу легко настроить его так, чтобы он делал то, что я хочу. Можете ли вы дать мне пример, пожалуйста?

John Roeland 20.08.2024 15:00

Как уже указывалось, пустая строка не означает, что переменная не установлена. Пожалуйста, прочитайте связанные вопросы/ответы — демо. Кроме того, пожалуйста, проверьте фактическое значение $breedte - var_dump($breedte)

DarkBee 20.08.2024 15:06

Я прочитал страницу и использовал следующий код: if (isset($layoutkb)){ if (strlen($layoutkb) > 0) { return '<div class = "divTableAttRow">' . '<div class = "divTableAttCell">Макет таблицы</div>' . '<div class = "divTableAttCell">' . $layoutkb. '</div>' . '</div>'; } } Но теперь вкладка заполнена другими атрибутами, которых нет в этом скрипте. Имеет ли это какое-либо отношение к наличию трех команд возврата друг за другом?

John Roeland 20.08.2024 15:27

«Это как-то связано с тем, что три команды возврата идут одна за другой?» - да, потому что выйти из функции/метода можно только один раз. Поэтому я советую сначала собрать желаемое содержимое в строковую переменную, а затем вернуть его один раз в самом конце.

C3roe 20.08.2024 15:35

Я, видимо, новичок в этом... Я окунусь в свои книги и посмотрю, как это сделать. Спасибо, что указали на это.

John Roeland 20.08.2024 15:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
8
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте следующий пересмотренный короткий код, который будет отображать только определенные атрибуты продукта:

// Display grouped attributes Gewicht en Omvang
add_shortcode( 'display-product-attributes', 'shortcode_display_product_attributes' );
function shortcode_display_product_attributes( $atts ) {
    extract( shortcode_atts( array(
        'id'    => get_the_ID(),
    ), $atts, 'display-product-attributes' ) );

    global $product;

    if ( ! is_a($product, 'WC_Product') ) {
        $product = wc_get_product( $id );
    }

    if ( is_a($product, 'WC_Product') ) {
        $gewicht = $product->get_attribute('Gewicht (gram)');
        $hoogte  = $product->get_attribute('Hoogte (mm)');
        $lengte  = $product->get_attribute('Lengte (mm)');
        $breedte = $product->get_attribute('Breedte (mm)');

        if ( $gewicht || $hoogte || $lengte || $breedte ) {
            $output = '<div class = "divTableAtt LichtBlauweRegels">
            <div class = "divTableAttBody">';

            if ( $gewicht ) {
                $output .= '<div class = "divTableAttRow">
                <div class = "divTableAttCell">Gewicht (gram)</div>
                <div class = "divTableAttCell">' . $gewicht . '</div>
                </div>';
            }

            if ( $hoogte ) {
                $output .= '<div class = "divTableAttRow">
                <div class = "divTableAttCell">Hoogte (mm)</div>
                <div class = "divTableAttCell">' . $hoogte . '</div>
                </div>';
            }

            if ( $lengte ) {
                $output .= '<div class = "divTableAttRow">
                <div class = "divTableAttCell">Lengte (mm)</div>
                <div class = "divTableAttCell">' . $lengte . '</div>
                </div>';
            }

            if ( $breedte ) {
                $output .= '<div class = "divTableAttRow">
                <div class = "divTableAttCell">Breedte (mm)</div>
                <div class = "divTableAttCell">' . $breedte . '</div>
                </div>';
            }

            return $output . '</div></div>';
        }
    }
}

Код находится в файле function.php вашей дочерней темы (или в плагине). Это должно сработать.

Я попробовал код, и он работает именно так, как я хочу. Я забыл о .=, чтобы объединить его. Спасибо всем за помощь и пояснения. Я проголосовал за ответ, но моя репутация еще недостаточно высока.

John Roeland 22.08.2024 09:20

@JohnRoeland Но, пожалуйста, вы можете пометить этот ответ как принятый (нажав галочку рядом с ответом, чтобы переключить его с серого на заполненный).

LoicTheAztec 22.08.2024 12:53

спасибо, не знал, что это тоже нужно.

John Roeland 22.08.2024 15:08

Другие вопросы по теме