1.10.1 Решение проблемы из-за "Убрать названия категорий из url статьи"

+16
1.94K
Убирали на своём инстанте названия категорий из урла статьи?

После этих манипуляций были замечены следующие багоглюки:

1. при открытой статье не подсвечивался пункт меню раздела, в котором статья
2. если в настройках какого-то модуля стояли галки "показывать в определённых разделах", то модуль показывался только в самих разделах, не в статьях этих разделов


Всё дело в том, что при выводе модуля хитрый код в файле core/classes/page.class.php вызывает функцию $inCore->menuId();

А эта функция menuId() получает id текущего меню. Причём, не абы как, а беря за основу текущий адрес страницы, который я успешно изменил в минихаке =)

Внимание, фикс:




Сделайте бэкап файла core/cms.php

в файле core/cms.php находите функцию

  1. public function menuId(){
и после строки
  1. //перевернем массив меню чтобы перебирать от последнего пункта к первому
  2. $menu = array_reverse($this->menu_struct);
добавляете
  1. $inPage = cmsPage::getInstance();
  2.  
  3. // генерируем адрес, включая категории, с учетом имени хоста на основе глубиномера pathway
  4.  
  5. if (is_array($inPage->pathway)){
  6. //echo VAR_DUMP($inPage->pathway);
  7. $full_uri2 = HOST;
  8. $real_uri2="";
  9. $uri2="";
  10. foreach($inPage->pathway as $key => $value){
  11. if ($key>=sizeof($inPage->pathway)-2 && $value!="/") {
  12. $full_uri2.=$inPage->pathway[$key]['link'];
  13. $real_uri2.=$inPage->pathway[$key]['link'];
  14. $uri2.=$inPage->pathway[$key]['link'];
  15. }
  16. }
  17. }
  18. else {
  19. $full_uri2 = HOST . $uri;
  20. }
и чуть ниже заменяете блок
  1. //перебираем меню в поисках текущего пункта
  2. foreach($menu as $item){
  3.  
  4. if (!$item['link']) { continue; }
  5.  
  6. // uri с учетом имени хоста
  7. $full_uri = HOST . $uri;
  8.  
  9. //полное совпадение ссылки и адреса?
  10. if (in_array($item['link'], array(urldecode($uri), urldecode($full_uri), urldecode($real_uri)))){
  11. $menuid = $item['id'];
  12. $is_strict = true; //полное совпадение
  13. break;
  14. }
  15.  
  16. //частичное совпадение ссылки и адреса (по началу строки)?
  17. $uri_first_part = mb_substr(urldecode($uri), 0, mb_strlen($item['link']));
  18. $real_uri_first_part = mb_substr(urldecode($real_uri), 0, mb_strlen($item['link']));
  19. if (in_array($item['link'], array($uri_first_part, $real_uri_first_part))){
  20. $menuid = $item['id'];
  21. break;
  22. }
  23.  
  24. }
на блок
  1. //перебираем меню в поисках текущего пункта
  2. foreach($menu as $item){
  3.  
  4. if (!$item['link']) { continue; }
  5.  
  6. // uri с учетом имени хоста
  7. //$full_uri = HOST . $uri;
  8.  
  9.  
  10. //полное совпадение ссылки и адреса? -- для категорий
  11. if (in_array($item['link'], array(urldecode($uri), urldecode($full_uri), urldecode($real_uri)))){
  12. $menuid = $item['id'];
  13. $is_strict = true; //полное совпадение
  14. break;
  15. }
  16.  
  17.  
  18. //частичное совпадение ссылки и адреса (по началу строки)? -- для статей
  19. $uri_first_part = mb_substr(urldecode($uri), 0, mb_strlen($item['link']));
  20. $real_uri_first_part = mb_substr(urldecode($real_uri), 0, mb_strlen($item['link']));
  21. $uri_first_part2 = mb_substr(urldecode($uri2), 0, mb_strlen($item['link']));
  22. $real_uri_first_part2 = mb_substr(urldecode($real_uri2), 0, mb_strlen($item['link']));
  23. if (in_array($item['link'], array($uri_first_part, $real_uri_first_part, $uri_first_part2, $real_uri_first_part2))){
  24. $menuid = $item['id'];
  25. break;
  26. }
  27.  
  28. }


В общем-то, всё. После этого должно работать.

Замечание 1: проверял на своём сайте, работает, но мог что-то не учесть. словите багу,- дайте знать в комментах
Замечание 2: буду несказанно рад, если кто-то подскажет менее геморный и непрозрачный способ для определения id текущего пункта меню.
Замечание 3: делалось на версии 1.10.1
+2
Майкл Майкл 9 лет назад #
Очередная SEO оптимизация......
+2
Cruzka Cruzka 9 лет назад #
SEO оптимизация была в "убрать названия категорий из url статьи", а это - исправление ошибок, с тем связанных
-1
letsgo letsgo 9 лет назад #
Потом возникают указанные проблемы. Модули показывают только если указано показывать везде итд.
+3
Cruzka Cruzka 9 лет назад #
это как раз решение, чтобы модули показывались так как им сказано, в определённых категориях.
0
artscripts artscripts 9 лет назад #
Для меня тут дело не в SEO даже а в том, что данные в поиске не актуальны бывают. Так как есть небольшой сайт кинотеатра города. Я потсоянно премещаю статьи из категории "В прокате" в категорию "Архив" в связи с тем, все что в прокате, через неделю уже не открывается через поисковик, так как уже перемещено в архив, отсюда и моя головная боль. Надо попробовать ваше исправление использовать.
+2
Cruzka Cruzka 9 лет назад #
Так это Вам сначало нужно применить http://instantcms.ru/blogs/delai-chto-dolzhno-i-budet-chto-budet/ubrat-nazvanija-kategorii-iz-url-stati.html
а потом уже это
0
artscripts artscripts 9 лет назад #
Да, я уже понял. Спасибо.
+1
Suslik Suslik 9 лет назад #
крайне полезная модернизация Instant-а
если бы правленные файлы готовые выложили, может да?
И хотелось бы что бы это все таки было в ядре, а то из за таких странностей инстанта - "человеко-понятный" УРЛ раздувается до таких длин что людям что бы сделать ссылку на наш сайт надо его через сервис сокращения ссылок пробивать и тиц-пр уходит не сайту а сервису ссылок, странно что то что и так очевидно делается с таким трудом...
0
Kotanol Kotanol 8 лет назад #
Кто подскажет? Как сделать данный хак на 1.10.3?
0
Kotanol Kotanol 8 лет назад #
Fatal error: Class 'cmsPage' not found in Z:\home\.....\www\core\cms.php on line 1550
0
Def Def 8 лет назад #
тоже интересно для 1.10.4

Еще от автора

Адаптируем стандартный диз 1.10.х под мобильные устройства
Для тех кто не в курсе, Гугл и Яндекс обещают понижать в выдаче сайты с неадаптивным дизайном (которые неудобно просматривать с телефона).
Добавленные статьи из админки не отображаются в ленте активности - фикс
При добавлении статей из админки, не создаются почему-то метки в ленте активности.
Чутка правим поиск по сайту
При поиске по сайту, если ничего не нашлось (а бывает что не находится то что точно есть), то Инстант предлагает поискать в яндексе.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.