Всем приветы)))
Столкнулся я с такой штукой, что наш любимый Инстант делает немного не правильно, ну или в своей логике правильно, а вот пс-ы ругаются.
У нас, если включить КОМПОНЕНТ ПО УМОЛЧАНИЮ, ссылка убирается из УРЛ. Ок для индексации, но не ок для 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 и меняем весь код на:
<?php /** * @property \modelLanguages $model */ class languages extends cmsFrontend { protected $useOptions = true; /** * Включает мультиязычные поля формы * И при необходимости создаёт колонки в БД * * @param cmsForm $form * @return void */ public function enableMultilanguageFormFields(cmsForm $form) { if (!$this->cms_config->is_user_change_lang) { return; } // Поля, которые нужно создать в БД $create_db_fields = []; $structure = $form->getStructure(); // Включаем в самих формах foreach ($structure as $fieldset) { if (!isset($fieldset['childs'])) { continue; } // Могут быть включены для всех полей набора сразу $is_all_fields_enable = $fieldset['can_multilanguage'] ?? false; // Дефолтные параметры для полей $default_fields_params = $fieldset['multilanguage_params'] ?? ['is_table_field' => false]; foreach ($fieldset['childs'] as $id => $field) { if (!$is_all_fields_enable && !$field->can_multilanguage) { continue; } $field->multilanguage = isset($field->multilanguage_params['field_name']) ? false : true; $is_table_field = $field->multilanguage_params['is_table_field'] ?? $default_fields_params['is_table_field']; if ($is_table_field) { $table_name = $field->multilanguage_params['table'] ?? $default_fields_params['table']; $create_db_fields[$table_name][] = $field->multilanguage_params['field_name'] ?? $field->getName(); } } } if ($create_db_fields) { $this->model->addLanguagesFields($create_db_fields); } return; } /** * Добавляет теги hreflang в HEAD страницы * https://developers.google.com/search/docs/specialty/international/localized-versions?hl=ru * * @return void */ public function addHreflangTags() { if(!$this->cms_config->is_user_change_lang){ return; } $langs = cmsCore::getLanguages(); // Язык по умолчанию — тот, который идёт без префикса (обычно ru) $default_lang = $this->cms_config->language; // Реальный URI из браузера (без внутреннего префикса компонента) $request_uri = $_SERVER['REQUEST_URI'] ?? '/'; $request_uri = ltrim($request_uri, '/'); // Отделяем query-строку $uri_query = ''; if (strpos($request_uri, '?') !== false) { list($request_uri, $uri_query) = explode('?', $request_uri, 2); } // Срезаем языковой префикс, если он есть (для любого языка, кроме дефолтного) foreach ($langs as $lang) { if ($lang === $default_lang) { continue; } if (strpos($request_uri, $lang . '/') === 0) { $request_uri = substr($request_uri, strlen($lang) + 1); break; } } // Для каждого языка строим URL foreach ($langs as $lang) { if ($lang === $default_lang) { // Язык по умолчанию — без префикса $href = $this->cms_config->host . '/' . $request_uri; } else { // Остальные языки — с префиксом $href = $this->cms_config->host . '/' . $lang . '/' . $request_uri; } if ($uri_query) { $href .= '?' . $uri_query; } $this->cms_template->addHead('<link rel="alternate" href="' . html($href, false) . '" hreflang="' . $lang . '">'); } // x-default — версия по умолчанию (та же, что и default_lang) $href_default = $this->cms_config->host . '/' . $request_uri; if ($uri_query) { $href_default .= '?' . $uri_query; } $this->cms_template->addHead('<link rel="alternate" href="' . html($href_default, false) . '" hreflang="x-default">'); return; } }