Перейти к содержанию
Официальный форум поддержки Simpla

Рекомендуемые сообщения

Сейчас (без применения редиректов) категории открываются по такому 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
Ссылка на сообщение
Поделиться на другие сайты

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

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

site.ru/category/telefony

site.ru/category/1

site.ru/telefony

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

Ссылка на сообщение
Поделиться на другие сайты

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

Неправильно понимаете.

$this->get_category((int)$id_variable); - так можно получить по id

$this->get_category((string)$url_variable); - так можно получить по url

Ссылка на сообщение
Поделиться на другие сайты

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

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/

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

http://forum.simplacms.ru/topic/7565-роутинг-на-симпле/?p=65128

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

Ссылка на сообщение
Поделиться на другие сайты

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

site.ru/1/telefon1

site.ru/2/telefon1

site.ru/29649/telefon1

site.ru/2/telefon1

Ссылка на сообщение
Поделиться на другие сайты

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

site.ru/1/telefon1

site.ru/2/telefon1

site.ru/29649/telefon1

site.ru/2/telefon1

 

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

 

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

Прописал в 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
Ссылка на сообщение
Поделиться на другие сайты

Поправлюсь. .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
Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

 

Дальше в index.tpl

 

 

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

 

Ссылка на сообщение
Поделиться на другие сайты

И? эта шняга будет отображать один и тот же товар с ЛЮБЫМИ цифрами в $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, вы попадёте на первый.

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

                                        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

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

Именно ID первой категории я и хочу получить (как, пока не знаю, если знаете вы, напишите), чтобы передавать в шаблон products.tpl

Если значение неправильное, стоит ли выдавать 404? В принципе, сеошники говорят, что всё равно - 404, редирект, каноникал (а может врут?).

Ссылка на сообщение
Поделиться на другие сайты

Если страница не существует - должен быть 404

Но это мое личное мнение.

Каждый СЕОшник говорит разное, но каждый уверен на 300% - что только он знает, как правильно.

Поэтому стараюсь с ними не работать)))

Ссылка на сообщение
Поделиться на другие сайты

Спасибо, вроде, работает ЧЁТКО

 

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/

 

Ибо нефиг

Изменено пользователем question
Ссылка на сообщение
Поделиться на другие сайты

После экспериментов правки в 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. Правки в шаблоне очень индивидуальны, тут однозначного решения нет, я правил - смотрел, правил - смотрел.
Изменено пользователем question
Ссылка на сообщение
Поделиться на другие сайты

Объединить всё написанное выше и сделать готовую инструкцию, у меня не хватит усидчивости.

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...