Что нового

Не выводит правильный титл

stillmaster

Участник
Проверенные
Регистрация
18 Авг 2022
Сообщения
364
Реакции
209
Всем привет ковыряюсь тут с одним сайтом настраиваю внешний вид и вылез такой баг, при посещении главной вместо названия сайта выводит материалы за 2025 год. Сразу скажу сайт музыкальный со скриптом для перехода по страницам без перезагрузки. Кто подскажет где может быть проблема. Сайт не публикую пока на локалке.
ЗЫ. DLE 20 версия, оригинал.
 
В общем решил сам в engine.php нужно найти код
PHP:
if ($nam_e) {
    
    if ($config['short_meta_title']) $metatags['title'] = $nam_e . $page_extra . $meta_sep . $config['short_meta_title'];
И заменить на
PHP:
if ($dle_module == "main") {
  $nam_e = '';
  $metatags['title'] = $config['home_title'];
    
} elseif ($nam_e) {
    
    if ($config['short_meta_title']) $metatags['title'] = $nam_e . $page_extra . $meta_sep . $config['short_meta_title'];
 
Похоже, проблема не в самой главной странице, а в том, что переменные даты ($year, $month, $day) попадают в формирование meta title даже тогда, когда текущий модуль фактически main.

Симптом:

На главной вместо названия сайта выводит: «Материалы за 2025 год»

Это может происходить, если где-то в запросе/роутинге остаётся $year = 2025, но сам $dle_module уже равен main.

В DLE есть участок, который формирует $nam_e для архива по дате:

PHP:
 if ($year != '' AND $month == '' AND $day == '') $nam_e = $lang['title_date'] . ' ' . $year . ' ' . $lang['title_year'];

if ($year != '' AND $month != '' AND $day == '') $nam_e = $lang['title_date'] . ' ' . $r[$month - 1] . ' ' . $year . ' ' . $lang['title_year1'];

if ($year != '' AND $month != '' AND $day != '' and $subaction == '') $nam_e = $lang['title_date'] . ' ' . $day . '.' . $month . '.' . $year;

А ниже $nam_e уже используется для title:

PHP:
 if ($nam_e) {

if ($config['short_meta_title']) $metatags['title'] = $nam_e . $page_extra . $meta_sep . $config['short_meta_title'];
else $metatags['title'] = $nam_e . $page_extra;

}

Поэтому если $nam_e ошибочно получил значение от даты, главная страница может получить title архива.

Фикс, который предложен выше, рабочий как быстрый костыль:

PHP:
 if ($dle_module == "main") { $nam_e = ''; $metatags['title'] = $config['home_title'];

} elseif ($nam_e) {

if ($config['short_meta_title']) $metatags['title'] = $nam_e . $page_extra . $meta_sep . $config['short_meta_title'];

Но у него есть минус: он может убрать $page_extra для пагинации главной страницы. Например /page/2/ может получить такой же title, как и первая страница.

Более правильный вариант — не давать date-логике формировать $nam_e, если текущий модуль не date.

Нужно найти блок, где формируется $nam_e для даты, примерно такой:

PHP:
 } else {

if ($year != '' AND $month == '' AND $day == '') $nam_e = $lang['title_date'] . ' ' . $year . ' ' . $lang['title_year'];
if ($year != '' AND $month != '' AND $day == '') $nam_e = $lang['title_date'] . ' ' . $r[$month - 1] . ' ' . $year . ' ' . $lang['title_year1'];
if ($year != '' AND $month != '' AND $day != '' and $subaction == '') $nam_e = $lang['title_date'] . ' ' . $day . '.' . $month . '.' . $year;
if (($subaction OR $newsid) AND $news_found) $titl_e = $metatags['title'];

}

И заменить на:

PHP:
 } else {

if ($dle_module == 'date') {

    if ($year != '' AND $month == '' AND $day == '') {
        $nam_e = $lang['title_date'] . ' ' . $year . ' ' . $lang['title_year'];
    }

    if ($year != '' AND $month != '' AND $day == '') {
        $nam_e = $lang['title_date'] . ' ' . $r[$month - 1] . ' ' . $year . ' ' . $lang['title_year1'];
    }

    if ($year != '' AND $month != '' AND $day != '' and $subaction == '') {
        $nam_e = $lang['title_date'] . ' ' . $day . '.' . $month . '.' . $year;
    }

}

if (($subaction OR $newsid) AND $news_found) {
    $titl_e = $metatags['title'];
}

}

Почему так лучше:

  • []Главная страница не будет получать title от архива по году. []Архивы /2025/, /2025/07/, /2025/07/06/ продолжат работать штатно. []Пагинация главной сохранит $page_extra. []Исправляется причина, а не только финальный вывод title.

То есть логика такая:

PHP:
 if ($dle_module == 'date') { // формируем title архива по дате }

А если текущий модуль main, то переменные $year, $month, $day не должны влиять на $nam_e.

Итог: предложенный фикс через $dle_module == "main" можно использовать как временное решение, но чище и безопаснее ограничить формирование date-title только модулем date.
 
Похоже, проблема не в самой главной странице, а в том, что переменные даты ($year, $month, $day) попадают в формирование meta title даже тогда, когда текущий модуль фактически main.

Симптом:



Это может происходить, если где-то в запросе/роутинге остаётся $year = 2025, но сам $dle_module уже равен main.

В DLE есть участок, который формирует $nam_e для архива по дате:

PHP:
 if ($year != '' AND $month == '' AND $day == '') $nam_e = $lang['title_date'] . ' ' . $year . ' ' . $lang['title_year'];

if ($year != '' AND $month != '' AND $day == '') $nam_e = $lang['title_date'] . ' ' . $r[$month - 1] . ' ' . $year . ' ' . $lang['title_year1'];

if ($year != '' AND $month != '' AND $day != '' and $subaction == '') $nam_e = $lang['title_date'] . ' ' . $day . '.' . $month . '.' . $year;

А ниже $nam_e уже используется для title:

PHP:
 if ($nam_e) {

if ($config['short_meta_title']) $metatags['title'] = $nam_e . $page_extra . $meta_sep . $config['short_meta_title'];
else $metatags['title'] = $nam_e . $page_extra;

}

Поэтому если $nam_e ошибочно получил значение от даты, главная страница может получить title архива.

Фикс, который предложен выше, рабочий как быстрый костыль:

PHP:
 if ($dle_module == "main") { $nam_e = ''; $metatags['title'] = $config['home_title'];

} elseif ($nam_e) {

if ($config['short_meta_title']) $metatags['title'] = $nam_e . $page_extra . $meta_sep . $config['short_meta_title'];

Но у него есть минус: он может убрать $page_extra для пагинации главной страницы. Например /page/2/ может получить такой же title, как и первая страница.

Более правильный вариант — не давать date-логике формировать $nam_e, если текущий модуль не date.

Нужно найти блок, где формируется $nam_e для даты, примерно такой:

PHP:
 } else {

if ($year != '' AND $month == '' AND $day == '') $nam_e = $lang['title_date'] . ' ' . $year . ' ' . $lang['title_year'];
if ($year != '' AND $month != '' AND $day == '') $nam_e = $lang['title_date'] . ' ' . $r[$month - 1] . ' ' . $year . ' ' . $lang['title_year1'];
if ($year != '' AND $month != '' AND $day != '' and $subaction == '') $nam_e = $lang['title_date'] . ' ' . $day . '.' . $month . '.' . $year;
if (($subaction OR $newsid) AND $news_found) $titl_e = $metatags['title'];

}

И заменить на:

PHP:
 } else {

if ($dle_module == 'date') {

    if ($year != '' AND $month == '' AND $day == '') {
        $nam_e = $lang['title_date'] . ' ' . $year . ' ' . $lang['title_year'];
    }

    if ($year != '' AND $month != '' AND $day == '') {
        $nam_e = $lang['title_date'] . ' ' . $r[$month - 1] . ' ' . $year . ' ' . $lang['title_year1'];
    }

    if ($year != '' AND $month != '' AND $day != '' and $subaction == '') {
        $nam_e = $lang['title_date'] . ' ' . $day . '.' . $month . '.' . $year;
    }

}

if (($subaction OR $newsid) AND $news_found) {
    $titl_e = $metatags['title'];
}

}

Почему так лучше:

  • []Главная страница не будет получать title от архива по году. []Архивы /2025/, /2025/07/, /2025/07/06/ продолжат работать штатно. []Пагинация главной сохранит $page_extra. []Исправляется причина, а не только финальный вывод title.

То есть логика такая:

PHP:
 if ($dle_module == 'date') { // формируем title архива по дате }

А если текущий модуль main, то переменные $year, $month, $day не должны влиять на $nam_e.

Итог: предложенный фикс через $dle_module == "main" можно использовать как временное решение, но чище и безопаснее ограничить формирование date-title только модулем date.
Ну как вариант, спасибо, но только что то в коде не так потому что при переходе по ссылке скажем https://music.test/2026/07/ почему то текст все равно выводит материалы за 2025 год, а не за 2026, в принципе архивом сейчас мало кто пользуется но все таки говорит о каком то баге.
 
Какой тип ЧПУ у вас включен ?
 
Тогда остаеться пересмотреть все доп модули которые стоят и в шаблоне что как и где выводится.
 
Последнее редактирование:
Верх