Для любого интернет-магазина важна правильная перелинковка товара. Не только с точки зрения SEO, но и с точки зрения юзабилити. Важно, чтобы покупатель имел возможность перемещаться по товарам не покидая карточки товара.
Сегодня я покажу как в JoomShopping в карточке товара сделать навигацию по следующему/предыдущему товару. Вот как это выглядит:
Для тогочтобы обновления JoomShopping не затронули наше решение - все изменения будем делать в шаблоне карточки товара.
Открываем шаблон карточки товара /components/com_jshopping/templates/default/product/product_default.php
и после
<?php include(dirname(__FILE__)."/load.js.php");?>
пишем
<?php $product_id = JRequest::getInt('product_id'); $product_nav = &JTable::getInstance('product', 'jshop'); $product_nav->load($product_id); $category_id = $product_nav->getCategory(); $products = &$this->getModel("products"); //Определяем сортировку и направление сортировки пользователя $mainframe =& JFactory::getApplication(); $jshopConfig = &JSFactory::getConfig(); $order = $mainframe->getUserStateFromRequest( 'jshoping.list.front.productorder', 'order', $jshopConfig->product_sorting, 'int'); $orderby = $mainframe->getUserStateFromRequest( 'jshoping.list.front.productorderby', 'orderby', $jshopConfig->product_sorting_direction, 'int'); $orderbyq = getQuerySortDirection($order, $orderby); $field_order = $jshopConfig->sorting_products_field_select[$order]; $order_query = ""; if (!$field_order) return $order_query; $order_original = $field_order; $multyCurrency = count(JSFactory::getAllCurrency()); if ($multyCurrency>1 && $field_order=="prod.product_price"){ if (strpos($adv_from,"jshopping_currencies")===false){ $adv_from .= " LEFT JOIN `#__jshopping_currencies` AS cr USING (currency_id) "; } if ($jshopConfig->product_list_show_min_price){ $field_order = "prod.min_price/cr.currency_value"; }else{ $field_order = "prod.product_price/cr.currency_value"; } } if ($field_order=="prod.product_price" && $jshopConfig->product_list_show_min_price){ $field_order = "prod.min_price"; } $order_query = " ORDER BY ".$field_order; if ($orderbyq){ $order_query .= " ".$orderbyq; } //Собственно сам запрос $db =& JFactory::getDBO(); $query = "SELECT *, `prod`.`name_ru-RU` as name FROM `#__jshopping_products` AS prod INNER JOIN `#__jshopping_products_to_categories` AS pr_cat ON `pr_cat`.`product_id` = `prod`.`product_id` LEFT JOIN `#__jshopping_categories` AS cat ON `pr_cat`.`category_id` = `cat`.`category_id` WHERE `prod`.`product_quantity`> 0 AND `prod`.`product_publish` = 1 AND `pr_cat`.`category_id` = ".$category_id." ".$order_query; $db->setQuery($query); $rows = $db->loadObjectList(); $total = Count($rows); addLinkToProducts($rows, 0, 1); $Next = false; $Prev = false; foreach($rows as $Key=>$row){ If ($row->product_id == $product_id){ if($rows[$Key + 1]->product_link) $Next='<a style="font-size: 10px;text-decoration: none;" href="'.$rows[$Key + 1]->product_link.'" title="'.$rows[$Key + 1]->name.'">'.$rows[$Key + 1]->name.' ></a>'; if($rows[$Key - 1]->product_link) $Prev='<a style="font-size: 10px;text-decoration: none;" href="'.$rows[$Key - 1]->product_link.'" title="'.$rows[$Key - 1]->name.'">< '.$rows[$Key - 1]->name.'</a>'; Break; } } ?>
Далее, там где мы хотим вывести сылки (например после <div class="jshop productfull">) пишем
<div style="width:100%;border-bottom: 1px solid #ECECEC;height: 30px;margin-bottom: 10px;"> <span style="width:50%;float:left;text-align:center;block:inline;text-transform: uppercase;"> <?php if($Prev) echo $Prev;?> </span> <span style="width:50%;float:left;text-align:center;text-transform: uppercase;"> <?php if($Next) echo $Next;?> </span> </div>
Готово.
P.P.S Если у Вас один товар принадлежит нескольким категориям и Вы хотите чтобы предыдущий/следующий брались из текущей категории - нужно во втором блоке кода в 4 строке вместо $category_id = $product->getCategory(); написать $category_id = JRequest::getInt('category_id');
P.P.P.S Спасибо форумчанину AndreyUA - было исправлено $product на $product_nav
P.P.P.P.S В результате расследования было обнаружено, что проблемы возникают в магазинах, в которых не забивают остатки товара - то есть количество равно 0. Для таких магазинов необходимо из запроса выкинуть "`prod`.`product_quantity`> 0 AND " после WHERE
UPDATE Для получения данных разработан плагин. Остается только вывести информацию в нужной части карточки. Плагин распространяется бесплатно.