question Опубликовано 13 января, 2019 Жалоба Поделиться Опубликовано 13 января, 2019 (изменено) Сейчас (без применения редиректов) категории открываются по такому urlsite.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 Изменено 13 января, 2019 пользователем question Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 13 января, 2019 Автор Жалоба Поделиться Опубликовано 13 января, 2019 Предвидя вопрос "зачем", отвечу.Я хочу провести seo-эксперимент, для начала мне нужно три примерно одинаковых магазина с url категории товаров видаsite.ru/category/telefonysite.ru/category/1site.ru/telefonyи так далее. Предвижу, что кто-то из вас наверняка знает, как отнесутся поисковики к почти одинаковым магазинам с разными url, но я хочу поставить эксперимент самостоятельно. Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 13 января, 2019 Жалоба Поделиться Опубликовано 13 января, 2019 То есть, как я понимаю, функция get_category, описанная в Categories.php, получает категорию по $category_url.Неправильно понимаете. $this->get_category((int)$id_variable); - так можно получить по id $this->get_category((string)$url_variable); - так можно получить по url Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 14 января, 2019 Автор Жалоба Поделиться Опубликовано 14 января, 2019 Огромное спасибо. Решение очень простое: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/ Цитата Ссылка на сообщение Поделиться на другие сайты
yr4ik Опубликовано 14 января, 2019 Жалоба Поделиться Опубликовано 14 января, 2019 Теперь раздел сайта доступен по адресу типа site.ru/index.php?module=ProductsView&id=1Далее небольшая правка .htaccess и категории будут вида site.ru/category/1/И дальше еще небольшая правка шаблонов для правильного формирования url ... Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 15 января, 2019 Автор Жалоба Поделиться Опубликовано 15 января, 2019 И дальше еще небольшая правка шаблонов для правильного формирования url ... В моём случае в tpl файлах шаблона все вхождения $c->url надо было заменить на $c->id, но это мой (частный) случай.Теперь можно открывать разделы по адресу site.ru/category/1/Ещё бы товары открывать по адресу site.ru/category/1/telefon, причём если товара в категории нет, выводить 404, было бы вообще офигенно. Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 16 января, 2019 Автор Жалоба Поделиться Опубликовано 16 января, 2019 Буду благодарен, если подскажете, как выводить товар по адресу site.ru/category/id/name, где name - имя товара, id - id категории, в которой этот товар содержится (во всех остальных случаях выводить 404 ошибку). Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 16 января, 2019 Жалоба Поделиться Опубликовано 16 января, 2019 Буду благодарен, если подскажете, как выводить товар по адресу site.ru/category/id/name, где name - имя товара, id - id категории, в которой этот товар содержится (во всех остальных случаях выводить 404 ошибку). Довольно хлопотно, нужны немалые индивидуальные доработки. Похожий вопрос возникал еще в 2014 годуhttp://forum.simplacms.ru/topic/7565-роутинг-на-симпле/?p=65128специалисты на него до сих пор никак не срегировали... Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 16 января, 2019 Автор Жалоба Поделиться Опубликовано 16 января, 2019 Видите ли, прописать в .htaccess вместо product регулярное выражение, которое означает "только цифры", кажется (поправьте, если ошибаюсь), это ^[0-9]+$ - минута делов, таким образом товар с url telefon1 будет открываться по адресам:site.ru/1/telefon1site.ru/2/telefon1site.ru/29649/telefon1 site.ru/2/telefon1 Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 16 января, 2019 Жалоба Поделиться Опубликовано 16 января, 2019 Видите ли, прописать в .htaccess вместо product регулярное выражение, которое означает "только цифры", кажется (поправьте, если ошибаюсь), это ^[0-9]+$ - минута делов, таким образом товар с url telefon1 будет открываться по адресам:site.ru/1/telefon1site.ru/2/telefon1site.ru/29649/telefon1site.ru/2/telefon1 Вот Вы и сделайте ВСЕ нужные правки за минуту, потом за следующую минуту опишите тут все действия. Если будет работать, то благодарность многох посетителей форума Вам обеспечена... Подозреваю, что в Вашем будущем решении, если оно появится, быстро найдутся недостатки, причем довольно значимые... И пишите сразу точно и аккуратно, какую задачу решаете. Уже сейчас видно, что у Вас в #7 ставится один вопрос, а через несколько минут в #9 решается уже другой... Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 18 января, 2019 Автор Жалоба Поделиться Опубликовано 18 января, 2019 (изменено) Прописал в 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 А что вы, уважаемые разработчики, думаете? Изменено 18 января, 2019 пользователем question Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 18 января, 2019 Автор Жалоба Поделиться Опубликовано 18 января, 2019 (изменено) Поправлюсь. .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} Изменено 18 января, 2019 пользователем question Цитата Ссылка на сообщение Поделиться на другие сайты
Kosjak76 Опубликовано 18 января, 2019 Жалоба Поделиться Опубликовано 18 января, 2019 И? эта шняга будет отображать один и тот же товар с ЛЮБЫМИ цифрами в $cidКакой в этом смысл? Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 18 января, 2019 Автор Жалоба Поделиться Опубликовано 18 января, 2019 Предыдущая строчка для вывода <link rel="canonical"> Дальше в index.tpl {if ($product) && ($category->id != $cid)} <meta http-equiv="refresh" content="0; url=/catalog/{$category->id}/{$product->url}"> {/if} Цитата Ссылка на сообщение Поделиться на другие сайты
Kosjak76 Опубликовано 18 января, 2019 Жалоба Поделиться Опубликовано 18 января, 2019 Да, удачи... Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 18 января, 2019 Автор Жалоба Поделиться Опубликовано 18 января, 2019 И? эта шняга будет отображать один и тот же товар с ЛЮБЫМИ цифрами в $cidКакой в этом смысл?Я делаю - пишу. С подключением meta canonical товар будет, например, по адресам1. site.ru/catalog/123/telefon (верный)2. site.ru/catalog/456/telefon (неверный)Но если телефон находится в категории 123, второй приведённый мною url яндекс не будет индексировать - раз. При http-редиректе если вы зайдёте по неверному адресу (второму), то попадёте на первый. То есть, я сделал то же самое, что и в этой ветке на форуме. Вот у нас 2 разных адреса1. http://forum.simplacms.ru/topic/13973-открытие-категории-по-id/2. http://forum.simplacms.ru/topic/13973-открытие-категории-по-id000/Верный и неверный. Переходя по второму url, вы попадёте на первый. Цитата Ссылка на сообщение Поделиться на другие сайты
Kosjak76 Опубликовано 18 января, 2019 Жалоба Поделиться Опубликовано 18 января, 2019 Если товар в НЕСКОЛЬКИХ категориях - то ссылки на него будут НЕПРАВИЛЬНЫМИ из всех категорий, кроме первой по порядку?Какая ссылка будет на товар с Главной? Из Корзины? Из Заказа?Бред сивой кобылы... Цитата Ссылка на сообщение Поделиться на другие сайты
Kosjak76 Опубликовано 18 января, 2019 Жалоба Поделиться Опубликовано 18 января, 2019 Если вы хотите делать нормально, а не абы как, то вам нужно получить АйДи первой категории из списка категорий товара в функции get_products подставлять это значение в урл, а на странице Товара, если это значение неправильное - отдавать 404А вот это вот все с каноникалами - это даже не костыли... Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 18 января, 2019 Автор Жалоба Поделиться Опубликовано 18 января, 2019 Если товар в НЕСКОЛЬКИХ категориях - то ссылки на него будут НЕПРАВИЛЬНЫМИ из всех категорий, кроме первой по порядку?Какая ссылка будет на товар с Главной? Из Корзины? Из Заказа?Бред сивой кобылы...Я до этого ещё не дошёл. Буду искать, как получить id категории товара. И если категорий несколько, выводить id первой категории, в которой есть товар.Можно сделать через foreach categories, но это (возможно сильно) увеличит нагрузку на БД. Цитата Ссылка на сообщение Поделиться на другие сайты
Kosjak76 Опубликовано 18 января, 2019 Жалоба Поделиться Опубликовано 18 января, 2019 Как один из вариантов - что-то типа такого 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 Это не готовое решение, писал на коленке))) Можете попробовать и посмотреть, насколько увеличится нагрузка на базу Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 18 января, 2019 Автор Жалоба Поделиться Опубликовано 18 января, 2019 Если вы хотите делать нормально, а не абы как, то вам нужно получить АйДи первой категории из списка категорий товара в функции get_products подставлять это значение в урл, а на странице Товара, если это значение неправильное - отдавать 404А вот это вот все с каноникалами - это даже не костыли...Именно ID первой категории я и хочу получить (как, пока не знаю, если знаете вы, напишите), чтобы передавать в шаблон products.tplЕсли значение неправильное, стоит ли выдавать 404? В принципе, сеошники говорят, что всё равно - 404, редирект, каноникал (а может врут?). Цитата Ссылка на сообщение Поделиться на другие сайты
Kosjak76 Опубликовано 18 января, 2019 Жалоба Поделиться Опубликовано 18 января, 2019 Если страница не существует - должен быть 404Но это мое личное мнение.Каждый СЕОшник говорит разное, но каждый уверен на 300% - что только он знает, как правильно.Поэтому стараюсь с ними не работать))) Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 18 января, 2019 Автор Жалоба Поделиться Опубликовано 18 января, 2019 (изменено) Спасибо, вроде, работает ЧЁТКО api/products.php в районе 130 строки 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 $category_id_filter Ссылка в tpl-файлах на товар должна быть в виде <a href="catalog/{$product->category_id}/{$product->url}"> Смотрю, вроде, работает. Дальше тестировать буду уже завтра.Если страница не существует - должен быть 404Но это мое личное мнение.http://forum.simplacms.ru/topic/13973-му-мур-гав-хрю/Эта страница существует?И ещё правка.В htaccess убрать правило, касающееся products/ Ибо нефиг Изменено 18 января, 2019 пользователем question Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 19 января, 2019 Автор Жалоба Поделиться Опубликовано 19 января, 2019 (изменено) После экспериментов правки в htaccess получились такими RewriteRule ^([0-9]+)/(.*).html$ index.php?module=ProductView&cid=$1&product_url=$2 [L,QSA] RewriteRule ^([0-9]+)/?$ index.php?module=ProductsView&id=$1 [L,QSA] RewriteRule ^([0-9]+)/([^/]+)/?$ index.php?module=ProductsView&id=$1&brand=$2 [L,QSA] RewriteRule ^catalog/([0-9]+)$ /$1 [R=301,L] Последняя строчка необязательна - чисто чтобы мои старые ссылки работали.Логика такая: если человек заходит на страницу типа site.ru/оплата_и_доставка , то попадает на нужную страницу, если на site.ru/88/ , то попадает на раздел с id 88 (разделы в моём случае пишутся цифрами), если на site.ru/88/samsung-galaxy-sv.html , то попадает на страницу товара. При изменении в url товара цифры (в данном случае 88) на любую другую, происходит редирект на правильный url.Нагрузка не выросла, вернее, при моей посещаемости добавление ещё одного запроса к БД никак не отразилась.Вышеупомянутый код можно модернизировать, например, сделать для категорий префикс. Также можно, используя префикс, открывать категории не по id, а по url. Напримерsite.ru/category-88/илиsite.ru/категория-мобильные-телефоны/Ну вот как-то так.P.S. Правки в шаблоне очень индивидуальны, тут однозначного решения нет, я правил - смотрел, правил - смотрел. Изменено 19 января, 2019 пользователем question Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 19 января, 2019 Автор Жалоба Поделиться Опубликовано 19 января, 2019 Объединить всё написанное выше и сделать готовую инструкцию, у меня не хватит усидчивости. Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.