Мультиязычность. Редактирование файла - frontend.php. Выводим урл из адреса строки, без названия КОМПОНЕНТА

InstantCMS 2.X
#1 30 сентября 2026 в 13:48

Всем приветы)))

Столкнулся я с такой штукой, что наш любимый Инстант делает немного не правильно, ну или в своей логике правильно, а вот пс-ы ругаются.
У нас, если включить КОМПОНЕНТ ПО УМОЛЧАНИЮ, ссылка убирается из УРЛ. Ок для индексации, но не ок для HREFLANG, то есть Гугл и яша говорят, что это не айс и в HREFLANG не должнго быть редиректов, то есть поиск хочет увидеть чистую страничку.

Сейчас у нас работает система так с включенным компонентом по умолчанию, то есть мы не видим board или pages в урл, а вот код страницы видит все иначе и там ссылки формируются для мультиязычности по старому принципу:

HREFLANG Найдено: 3

ru
essens.ru/board/parfum-lanvin-eclat-darpege-w102.html
en
essens.ru/en/board/parfum-lanvin-eclat-darpege-w102.html
x-default
essens.ru/board/parfum-lanvin-eclat-darpege-w102.html

Честно вам скажу, я не кодер, не эксперт, но я изменил код фронтед на данный код с помощью Дип Сика и у меня стало так:

HREFLANG Найдено: 3

ru
essens.ru/parfum-lanvin-eclat-darpege-w102.html
en
essens.ru/en/parfum-lanvin-eclat-darpege-w102.html
x-default
essens.ru/parfum-lanvin-eclat-darpege-w102.html

При этом это стало везде. Может я не прав и что-то сломается.

Скидываю весь код, может кто подскажет что еще нужно, может кому пригодится)))
Ну и если он работает и действительно это лучше для НАШЕЙ ЛЮБИМОЙ ЦМС, то можно и поменять в коробке по умолчанию)))
Идем в папку — system/controllers/languages, находим файл frontend.php и меняем весь код на:

  1. <?php
  2. /**
  3. * @property \modelLanguages $model
  4. */
  5. class languages extends cmsFrontend {
  6.  
  7. protected $useOptions = true;
  8.  
  9. /**
  10. * Включает мультиязычные поля формы
  11. * И при необходимости создаёт колонки в БД
  12. *
  13. * @param cmsForm $form
  14. * @return void
  15. */
  16. public function enableMultilanguageFormFields(cmsForm $form) {
  17.  
  18. if (!$this->cms_config->is_user_change_lang) {
  19. return;
  20. }
  21.  
  22. // Поля, которые нужно создать в БД
  23. $create_db_fields = [];
  24.  
  25. $structure = $form->getStructure();
  26.  
  27. // Включаем в самих формах
  28. foreach ($structure as $fieldset) {
  29.  
  30. if (!isset($fieldset['childs'])) {
  31. continue;
  32. }
  33.  
  34. // Могут быть включены для всех полей набора сразу
  35. $is_all_fields_enable = $fieldset['can_multilanguage'] ?? false;
  36.  
  37. // Дефолтные параметры для полей
  38. $default_fields_params = $fieldset['multilanguage_params'] ?? ['is_table_field' => false];
  39.  
  40. foreach ($fieldset['childs'] as $id => $field) {
  41.  
  42. if (!$is_all_fields_enable && !$field->can_multilanguage) {
  43. continue;
  44. }
  45.  
  46. $field->multilanguage = isset($field->multilanguage_params['field_name']) ? false : true;
  47.  
  48. $is_table_field = $field->multilanguage_params['is_table_field'] ?? $default_fields_params['is_table_field'];
  49.  
  50. if ($is_table_field) {
  51.  
  52. $table_name = $field->multilanguage_params['table'] ?? $default_fields_params['table'];
  53.  
  54. $create_db_fields[$table_name][] = $field->multilanguage_params['field_name'] ?? $field->getName();
  55. }
  56. }
  57. }
  58.  
  59. if ($create_db_fields) {
  60. $this->model->addLanguagesFields($create_db_fields);
  61. }
  62.  
  63. return;
  64. }
  65.  
  66. /**
  67. * Добавляет теги hreflang в HEAD страницы
  68. * https://developers.google.com/search/docs/specialty/international/localized-versions?hl=ru
  69. *
  70. * @return void
  71. */
  72. public function addHreflangTags() {
  73.  
  74. if(!$this->cms_config->is_user_change_lang){
  75. return;
  76. }
  77.  
  78. $langs = cmsCore::getLanguages();
  79.  
  80. // Язык по умолчанию &mdash; тот, который идёт без префикса (обычно ru)
  81. $default_lang = $this->cms_config->language;
  82.  
  83. // Реальный URI из браузера (без внутреннего префикса компонента)
  84. $request_uri = $_SERVER['REQUEST_URI'] ?? '/';
  85. $request_uri = ltrim($request_uri, '/');
  86.  
  87. // Отделяем query-строку
  88. $uri_query = '';
  89. if (strpos($request_uri, '?') !== false) {
  90. list($request_uri, $uri_query) = explode('?', $request_uri, 2);
  91. }
  92.  
  93. // Срезаем языковой префикс, если он есть (для любого языка, кроме дефолтного)
  94. foreach ($langs as $lang) {
  95. if ($lang === $default_lang) {
  96. continue;
  97. }
  98. if (strpos($request_uri, $lang . '/') === 0) {
  99. $request_uri = substr($request_uri, strlen($lang) + 1);
  100. break;
  101. }
  102. }
  103.  
  104. // Для каждого языка строим URL
  105. foreach ($langs as $lang) {
  106.  
  107. if ($lang === $default_lang) {
  108. // Язык по умолчанию &mdash; без префикса
  109. $href = $this->cms_config->host . '/' . $request_uri;
  110. } else {
  111. // Остальные языки &mdash; с префиксом
  112. $href = $this->cms_config->host . '/' . $lang . '/' . $request_uri;
  113. }
  114.  
  115. if ($uri_query) {
  116. $href .= '?' . $uri_query;
  117. }
  118.  
  119. $this->cms_template->addHead('<link rel="alternate" href="' . html($href, false) . '" hreflang="' . $lang . '">');
  120. }
  121.  
  122. // x-default &mdash; версия по умолчанию (та же, что и default_lang)
  123. $href_default = $this->cms_config->host . '/' . $request_uri;
  124. if ($uri_query) {
  125. $href_default .= '?' . $uri_query;
  126. }
  127.  
  128. $this->cms_template->addHead('<link rel="alternate" href="' . html($href_default, false) . '" hreflang="x-default">');
  129.  
  130. return;
  131. }
  132.  
  133. }
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.

Похожее в блогах

🍪Мы используем файлы cookie для работы сайта. Читать подробнее.