Функция WooCommerce обрывается при объявлении результата второго массива - PullRequest
2 голосов
/ 06 апреля 2019

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

Так или иначе может существовать только один: $prodVars, $prodVar или $prodPrices.Если все три активны (без комментариев), то цикл страницы магазина прерывается и показывает только первый элемент.Если я прокомментирую две из этих переменных, цикл работает отлично и отображает всю информацию.

Есть что-то, что я неправильно понял и использовал неправильно?

function get_desc(){
    $prodID = get_the_ID();
    $product = wc_get_product($prodID);
    $product2 = wc_get_product($prodID);
    $prodDesc = $product->get_short_description();
    echo "<div class='prodDetWrap'>";
    echo "<div class='prodVariations'>";

    $prodVars = $product->get_attributes();

    $prodVar = $product->get_variation_attributes();

    $prodPrices = $product2->get_variation_prices();

        $prodPrice = $prodPrices['price'];
    $prod1Price = current($prodPrice);
    $prodCnt = 0;

    echo "</div>";
    if($prodDesc !== "NULL"){
        echo "<p>";
        echo $prodDesc;
        echo "</p>";
    }else{
        ;
    }

    echo "<p class='disclaimer'>Er varen ikke på lager, bestiller vi dem hjem til jer.</p>";
    echo "</div>";
}

remove_action( 'woocommerce_before_shop_loop_item_title', 'woocommerce_template_loop_product_thumbnail', 10);
add_action( 'woocommerce_after_shop_loop_item_title', 'get_desc', 12);

1 Ответ

2 голосов
/ 06 апреля 2019

В вашем коде несколько ошибок, например:

  • Вы получаете 2 раза объект WC_Product, используя wc_get_product(). Вместо этого вы должны вызвать доступный глобальный WC_Product объект.
  • Сегментация между переменными продуктами и другими типами продуктов является обязательной, поскольку методы WC_Variable_Product будут выдавать ошибки для других типов продуктов, например:
    • get_variation_attributes() метод,
    • get_variation_prices() метод,
  • $prodDesc переменная должна быть определена, а $prodCnt не используется.
  • else{ ; } выдаст ошибку.

Вы должны включить отладку при тестировании кода, используя define( 'WP_DEBUG', true ); в корневом wp-config.php файле вашей установки.

Попробуйте вместо этого:

remove_action( 'woocommerce_before_shop_loop_item_title', 'woocommerce_template_loop_product_thumbnail', 10 );

add_action( 'woocommerce_after_shop_loop_item_title', 'get_desc', 12 );

function get_desc(){
    global $product;

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

    $short_description = $product->get_short_description();

    echo "<div class='prodDetWrap'>
    <div class='prodVariations'>";

    $product_attributes = $product->get_attributes();

    // Only WC_Variable_Product methods (for variable products only)
    if( $product->is_type('variable') ) {
        $variation_attr   = $product->get_variation_attributes();
        $variation_prices = $product->get_variation_prices();

        $variation_price  = reset($variation_prices['price']);
    }

    $prodCnt = 0;

    echo "</div>";

    if ( isset($prodDesc) && $prodDesc !== "NULL") {
        echo "<p>";
        echo $prodDesc;
        echo "</p>";
    } else {
        echo '';
    }

    echo "<p class='disclaimer'>Er varen ikke på lager, bestiller vi dem hjem til jer.</p>
    </div>";
}

Код помещается в файл function.php вашей активной дочерней темы (или активной темы). Проверено и работает.

...