У меня была та же проблема, и я сделал небольшое изменение кода, чтобы оно заработало.
В основном забыли правило продвижения. Отключи это. Кажется, он не работает должным образом с таблицей тарифов доставки при применении бесплатной доставки к отдельным элементам. Правила доставки, как представляется, имеют приоритет и рассчитываются на основе общей суммы корзины.
Хитрость заключается в том, чтобы вычесть элементы бесплатной доставки из общей суммы корзины в тот момент, когда модуль «Расценки на доставку» производит расчет.
В моем случае все внутри определенной категории (id: 15) должно было получить бесплатную доставку. Но вы можете изменить логику в соответствии с вашими потребностями.
Вам нужно будет изменить следующий файл (или скопировать его в локальную кодовую базу, чтобы сделать все правильно).
Приложение \ код \ ядро \ Mage \ Доставка \ Модель \ Carrier \ Tablerate.php
ИЗМЕНИТЬ ЭТО:
public function collectRates(Mage_Shipping_Model_Rate_Request $request)
{
if (!$this->getConfigFlag('active')) {
return false;
}
// exclude Virtual products price from Package value if pre-configured
if (!$this->getConfigFlag('include_virtual_price') && $request->getAllItems()) {
foreach ($request->getAllItems() as $item) {
if ($item->getParentItem()) {
continue;
}
if ($item->getHasChildren() && $item->isShipSeparately()) {
foreach ($item->getChildren() as $child) {
if ($child->getProduct()->isVirtual()) {
$request->setPackageValue($request->getPackageValue() - $child->getBaseRowTotal());
}
}
} elseif ($item->getProduct()->isVirtual()) {
$request->setPackageValue($request->getPackageValue() - $item->getBaseRowTotal());
}
}
}
ДО ЭТОГО:
public function collectRates(Mage_Shipping_Model_Rate_Request $request)
{
if (!$this->getConfigFlag('active')) {
return false;
}
// exclude Virtual products price from Package value if pre-configured
//And Exclude items which should have Free Shipping
if (!$this->getConfigFlag('include_virtual_price') && $request->getAllItems()) {
$freeshipping_category_id = 15;
foreach ($request->getAllItems() as $item) {
if ($item->getParentItem()) {
continue;
}
if ($item->getHasChildren() && $item->isShipSeparately()) {
foreach ($item->getChildren() as $child) {
if ($child->getProduct()->isVirtual()) {
$request->setPackageValue($request->getPackageValue() - $child->getBaseRowTotal());
}
//If it's in the free shipping, remove it's value from the basket
$arr_category_ids = $child->getProduct()->getCategoryIds();
if ( in_array($freeshipping_category_id, $arr_category_ids) ) {
$request->setPackageValue($request->getPackageValue() - $child->getBaseRowTotal());
}
}
} elseif ($item->getProduct()->isVirtual()) {
$request->setPackageValue($request->getPackageValue() - $item->getBaseRowTotal());
}
//If it's in the free shipping category, remove it's value from the basket
$arr_category_ids = $item->getProduct()->getCategoryIds();
if ( in_array($freeshipping_category_id, $arr_category_ids) ) {
$request->setPackageValue($request->getPackageValue() - $item->getBaseRowTotal());
}
}
}