Перейти к содержимому


Фото
- - - - -

Открытие категории по id


  • Чтобы отвечать, сперва войдите на форум
32 ответов в теме

#1 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 13.01.2019 - 12:23

Сейчас (без применения редиректов) категории открываются по такому url

site.ru/index.php?module=ProductsView&category=telefony

Мне же нужно, чтобы категория была доступна по адресу

site.ru/index.php?module=ProductsView&id=1

то есть, по его id.

Как?

Полагаю, в ProductsView.php нужно получить id категории из url адреса

 

$category_id = $this->request->get('id', 'string');
 

 

Смотрю далее, примерно 45 строчка
 

 

$category = $this->categories->get_category((string)$category_url);
 

То есть, как я понимаю, функция get_category, описанная в Categories.php, получает категорию по $category_url. А мне всего-то нужно получить по id.

Лезу в вышеупомянутый файт и вижу

 

public function get_category($id)
 

 

return $this->get_category((int)$category->id);    
 

То есть, категория получается по её id, а не url. Ничего не понял...

Повторюсь, мне нужно, чтобы категория была доступна по адресу

site.ru/index.php?module=ProductsView&id=1


Изменено: question, 13.01.2019 - 12:33


#2 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 13.01.2019 - 12:33

Предвидя вопрос "зачем", отвечу.

Я хочу провести seo-эксперимент, для начала мне нужно три примерно одинаковых магазина с url категории товаров вида

site.ru/category/telefony

site.ru/category/1

site.ru/telefony

и так далее. Предвижу, что кто-то из вас наверняка знает, как отнесутся поисковики к почти одинаковым магазинам с разными url, но я хочу поставить эксперимент самостоятельно.



#3 phukortsin

phukortsin
  • Фрилансер
  • 859 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 13.01.2019 - 13:03

То есть, как я понимаю, функция get_category, описанная в Categories.php, получает категорию по $category_url.

Неправильно понимаете.
$this->get_category((int)$id_variable); - так можно получить по id
$this->get_category((string)$url_variable); - так можно получить по url

#4 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 14.01.2019 - 12:09

Огромное спасибо. Решение очень простое:

1. Добавляем в файл ProductsView.php строки

        $category_id = $this->request->get('id', 'string');
 

и далее

        if (!empty($category_id))
        {
            $category = $this->categories->get_category((int)$category_id);
            if (empty($category) || (!$category->visible && empty($_SESSION['admin'])))
                return false;
            $this->design->assign('category', $category);
            $filter['category_id'] = $category->children;
        }
 

Теперь раздел сайта доступен по адресу типа site.ru/index.php?module=ProductsView&id=1

Далее небольшая правка .htaccess и категории будут вида site.ru/category/1/



#5 yr4ik

yr4ik
  • Фрилансер
  • 925 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:Украина Чернигов

Опубликовано 14.01.2019 - 15:25

Теперь раздел сайта доступен по адресу типа site.ru/index.php?module=ProductsView&id=1

Далее небольшая правка .htaccess и категории будут вида site.ru/category/1/

И дальше еще небольшая правка шаблонов для правильного формирования url ... 



#6 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 15.01.2019 - 10:11

И дальше еще небольшая правка шаблонов для правильного формирования url ... 

В моём случае в tpl файлах шаблона все вхождения $c->url надо было заменить на $c->id, но это мой (частный) случай.

Теперь можно открывать разделы по адресу site.ru/category/1/

Ещё бы товары открывать по адресу site.ru/category/1/telefon, причём если товара в категории нет, выводить 404, было бы вообще офигенно.



#7 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 16.01.2019 - 12:38

Буду благодарен, если подскажете, как выводить товар по адресу site.ru/category/id/name, где name - имя товара, id - id категории, в которой этот товар содержится (во всех остальных случаях выводить 404 ошибку).



#8 phukortsin

phukortsin
  • Фрилансер
  • 859 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 16.01.2019 - 12:44

Буду благодарен, если подскажете, как выводить товар по адресу site.ru/category/id/name, где name - имя товара, id - id категории, в которой этот товар содержится (во всех остальных случаях выводить 404 ошибку).

 

Довольно хлопотно, нужны немалые индивидуальные доработки.

 

Похожий вопрос возникал еще в 2014 году

http://forum.simplac...симпле/?p=65128

специалисты на него до сих пор никак не срегировали...



#9 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 16.01.2019 - 12:53

Видите ли, прописать в .htaccess вместо product регулярное выражение, которое означает "только цифры", кажется (поправьте, если ошибаюсь), это ^[0-9]+$ - минута делов, таким образом товар с url telefon1 будет открываться по адресам:

site.ru/1/telefon1

site.ru/2/telefon1

site.ru/29649/telefon1

site.ru/2/telefon1



#10 phukortsin

phukortsin
  • Фрилансер
  • 859 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 16.01.2019 - 13:31

Видите ли, прописать в .htaccess вместо product регулярное выражение, которое означает "только цифры", кажется (поправьте, если ошибаюсь), это ^[0-9]+$ - минута делов, таким образом товар с url telefon1 будет открываться по адресам:

site.ru/1/telefon1

site.ru/2/telefon1

site.ru/29649/telefon1


site.ru/2/telefon1

 

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

 

Подозреваю, что в Вашем будущем решении, если оно появится, быстро найдутся недостатки, причем довольно значимые...

 

И пишите сразу точно и аккуратно, какую задачу решаете. Уже сейчас видно, что у Вас в #7 ставится один вопрос, а через несколько минут в #9 решается уже другой...



#11 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 18.01.2019 - 12:39

Прописал в htaccess (чуть раньше упоминания catalog) строку:

RewriteRule ^catalog/([0-9]+)/(.*)$    index.php?module=ProductView&product_url=$2 [L,QSA]

Теперь по адресу site.ru/catalog/123/telefon1 отображает товар telefon1

 

Теперь надо придумать, что делать дальше. Либо

1. выводить 404 ошибку, если id не совпадает с id категории, в которая содержит товар (кажется, $product->category->id) ,

2. либо прописать единственно верный url в canonical.

3. либо делать html-редирект в мета-тегах.

Первый вариант непрост в реализации, ведь Smarty не позволяет передавать header

 

А что вы, уважаемые разработчики, думаете?


Изменено: question, 18.01.2019 - 12:41


#12 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 18.01.2019 - 14:20

Поправлюсь. .htaccess

 

RewriteRule ^catalog/([0-9]+)/(.*)$    index.php?module=ProductView&cid=$1&product_url=$2 [L,QSA]
 

ProductView.php

 

$cid = $this->request->get('cid', 'string');
$this->design->assign('cid', $cid); 
 

 

product.tpl

 

{$canonical="/catalog/{$category->id}/{$product->url}" scope=parent}

Изменено: question, 18.01.2019 - 14:27


#13 Kosjak76

Kosjak76
  • Модератор
  • 3 826 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Харьков, Украина

Опубликовано 18.01.2019 - 14:29

И? эта шняга будет отображать один и тот же товар с ЛЮБЫМИ цифрами в $cid

Какой в этом смысл?



#14 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 18.01.2019 - 14:34

Предыдущая строчка для вывода <link rel="canonical">

 

Дальше в index.tpl

 

 

{if ($product) && ($category->id != $cid)}
    <meta http-equiv="refresh" content="0; url=/catalog/{$category->id}/{$product->url}">
{/if}
 

 



#15 Kosjak76

Kosjak76
  • Модератор
  • 3 826 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Харьков, Украина

Опубликовано 18.01.2019 - 14:37

Да, удачи...

:)



#16 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 18.01.2019 - 14:40

И? эта шняга будет отображать один и тот же товар с ЛЮБЫМИ цифрами в $cid

Какой в этом смысл?

Я делаю - пишу. С подключением meta canonical товар будет, например, по адресам

1. site.ru/catalog/123/telefon (верный)

2. site.ru/catalog/456/telefon (неверный)

Но если телефон находится в категории 123, второй приведённый мною url яндекс не будет индексировать - раз. При http-редиректе если вы зайдёте по неверному адресу (второму), то попадёте на первый.



То есть, я сделал то же самое, что и в этой ветке на форуме. Вот у нас 2 разных адреса

1. http://forum.simplac...атегории-по-id/

2. http://forum.simplac...гории-по-id000/

Верный и неверный. Переходя по второму url, вы попадёте на первый.



#17 Kosjak76

Kosjak76
  • Модератор
  • 3 826 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Харьков, Украина

Опубликовано 18.01.2019 - 14:44

Если товар в НЕСКОЛЬКИХ категориях - то ссылки на него будут НЕПРАВИЛЬНЫМИ из всех категорий, кроме первой по порядку?

Какая ссылка будет на товар с Главной? Из Корзины? Из Заказа?

Бред сивой кобылы...



#18 Kosjak76

Kosjak76
  • Модератор
  • 3 826 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Харьков, Украина

Опубликовано 18.01.2019 - 14:51

Если вы хотите делать нормально, а не абы как, то вам нужно получить АйДи первой категории из списка категорий товара в функции get_products подставлять это значение в урл, а на странице Товара, если это значение неправильное - отдавать 404

А вот это вот все с каноникалами - это даже не костыли...



#19 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 18.01.2019 - 15:02

Если товар в НЕСКОЛЬКИХ категориях - то ссылки на него будут НЕПРАВИЛЬНЫМИ из всех категорий, кроме первой по порядку?

Какая ссылка будет на товар с Главной? Из Корзины? Из Заказа?

Бред сивой кобылы...

Я до этого ещё не дошёл. Буду искать, как получить id категории товара. И если категорий несколько, выводить id первой категории, в которой есть товар.

Можно сделать через foreach categories, но это (возможно сильно) увеличит нагрузку на БД.



#20 Kosjak76

Kosjak76
  • Модератор
  • 3 826 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Харьков, Украина

Опубликовано 18.01.2019 - 15:08

Как один из вариантов - что-то типа такого 

                                        p.meta_description, 
					b.name as brand,
					b.url as brand_url,
      (SELECT category_id FROM __products_categories WHERE product_id = p.id ORDER BY position ASC LIMIT 1) as category_id
				FROM __products p

Это не готовое решение, писал на коленке))) Можете попробовать и посмотреть, насколько увеличится нагрузка на базу






0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых