Я борюсь с циклом и простыми / переменными типами товаров в Woocommerce 3.1.2. Все петли проходят loop/add-to-cart.php
что является обычаем в моей теме (не сделано мной) и выглядит примерно так:
global $product;
echo '<li class="cart_view">';
echo apply_filters( 'woocommerce_loop_add_to_cart_link',
sprintf( '<a href="%s" rel="nofollow" data-product_id="%s" data-product_sku="%s" data-quantity="%s" class="button %s product_type_%s">%s</a>',
esc_url( $product->add_to_cart_url() ),
esc_attr( $product->id ),
esc_attr( $product->get_sku() ),
esc_attr( isset( $quantity ) ? $quantity : 1 ),
$product->is_purchasable() && $product->is_in_stock() ? 'add_to_cart_button' : '',
esc_attr( $product->product_type ),
esc_html( $product->add_to_cart_text() )
),
$product );
echo '</li>';
Все (идентификаторы, href и т. Д.) Работает (правильно?), Кроме $product->product_type
, который возвращается просто даже когда это переменная.
За исключением одного продукта, который возвращает переменную. Я просто не могу понять почему, так как он имеет те же настройки, что и остальные.
Выполнение условия одного / переменного в одном продукте работает нормально.
Я уже пробовал другие методы, такие как has_child()
и они тоже терпят неудачу.
Что здесь может пойти не так? Есть идеи, с чего начать?
РЕДАКТИРОВАТЬ: get_type()
вместо product_type()
ведет себя так же. add_to_cart_text()
также терпит неудачу, так что это может быть что-то еще.
Поскольку свойства WooCommerce 3+ WC_Product не могут быть доступны напрямую:
$product->id
заменяется на: $product->get_id()
$product->product_type
заменяется $product->get_type()
Заключение: Шаблоны WooCommerce в твоей теме устарели.
Вы можете проверить это в Настройках WooCommerce> Статус: в конце страницы в разделе «Шаблоны» вы сможете увидеть какие шаблоны устарели…Во-первых, вы должны обновить вашу тему до последней версии, которая должна быть совместима с WooCommerce 3.1+
Официальная документация: Структура шаблона + переопределение шаблонов через тему
Попытка решить вашу проблему:
в sprintf()
функция, при сравнении кода что у вас есть с оригинальным кодом шаблона WooCommerce (loop/add-to-cart.php
), единственная разница между ними заключается в том, что ваш код удаляется 'ajax_add_to_cart'
от class
атрибут.
Все остальные вещи одинаковы.
Так что есть 2 способа это решить (используя последний актуальный код шаблона woocommerce):
1. По общим настройкам WooCommerce > Продукты> Дисплей.
Вам нужно запрещать «Включить AJAX добавить в корзину кнопки на архивах» и сохранить (если необходимо):
И вам просто нужно добавить в исходный код шаблона WooCommerce ваш HTML <li>
теги:
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
global $product;
echo '<li class="cart_view">';
echo apply_filters( 'woocommerce_loop_add_to_cart_link',
sprintf( '<a rel="nofollow" href="%s" data-quantity="%s" data-product_id="%s" data-product_sku="%s" class="%s">%s</a>',
esc_url( $product->add_to_cart_url() ),
esc_attr( isset( $quantity ) ? $quantity : 1 ),
esc_attr( $product->get_id() ),
esc_attr( $product->get_sku() ),
esc_attr( isset( $class ) ? $class : 'button' ),
esc_html( $product->add_to_cart_text() )
),
$product );
echo '</li>';
2. Другой способ использует функцию PHP str_replace()
сюда:
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
global $product;
echo '<li class="cart_view">';
echo apply_filters( 'woocommerce_loop_add_to_cart_link',
sprintf( '<a rel="nofollow" href="%s" data-quantity="%s" data-product_id="%s" data-product_sku="%s" class="%s">%s</a>',
esc_url( $product->add_to_cart_url() ),
esc_attr( isset( $quantity ) ? $quantity : 1 ),
esc_attr( $product->get_id() ),
esc_attr( $product->get_sku() ),
esc_attr( isset( $class ) ? str_replace(' ajax_add_to_cart', '', $class) : 'button' ),
esc_html( $product->add_to_cart_text() )
),
$product );
echo '</li>';
Это проверено на WooCommerce версии 3.1+ и работает для всех типов продуктов.
Других решений пока нет …