Редактор темы

Решение проблемы для подкатегорий с одинаковым url(upd)

hent4iboys

Бывалый
Регистрация
31 Авг 2018
Сообщения
782
Рейтинг реакций
97
Баллы
28
1/3
Автор темы
Идем в /engine/modules/functions.php и находим эту функцию:

PHP:
function get_ID($cat_info, $category) {
    foreach ( $cat_info as $cats ) {
        if( $cats['alt_name'] == $category ) return $cats['id'];
    }
    return false;
}
Комментируем её и вставляем ниже:
PHP:
function get_ID($cat_info, $category) {
    $catsarray = array();
    foreach ($cat_info as $cats) {
        if($cats['alt_name'] == $category) {
            $catsarray[] = $cats['id'];
        }
    }
    if(count($catsarray) > 1) {
        if($_GET['category']) {
            $catname = explode('/', $_GET['category']);
            $catname = $catname[count($catname)-2];
            foreach($catsarray as $cat) {
                if($cat_info[$cat_info[$cat]['parentid']]['alt_name'] == $catname) {
                    return $cat;
                }
            }
        }
    } else {
        return $catsarray[0];
    }
    return false;
}
Как можно заметить, код очень прост. Мы вместо того, чтобы возвращать сразу ID категории, сначала собираем массив, находим в нем категорию родителя и возвращаем скорректированный ответ. Если будет интересно - могу дописать построчно комментарии 🙂

Далее идем в /engine/inc/categories.php и комментируем 2 кода, которые отвечают за проверку:
PHP:
$row = $db->super_query( "SELECT alt_name FROM " . PREFIX . "_category WHERE alt_name ='{$alt_cat_name}'" );
 
if( $row['alt_name'] ) {
    msg( "error", $lang['cat_error'], $lang['cat_eradd'], "?mod=categories" );
}
PHP:
$row = $db->super_query( "SELECT id, alt_name FROM " . PREFIX . "_category WHERE alt_name = '$alt_cat_name'" );
 
if( $row['id'] and $row['id'] != $catid ) {
    msg( "error", $lang['cat_error'], $lang['cat_eradd'], "javascript:history.go(-1)" );
}

Почему два? Один проверяет совпадение по базе в момент добавления категории, а второй при редактировании. Казалось бы на этом всё. Но стоит лишь на сайте активировать кеширование и наблюдаем, что на всех совпадающих названиях из кеша достается последняя закешированная категория!

Давайте поправим добавив в логику кеширования ID категории. Идем в /engine/engine.php и ищем:
PHP:
$active = dle_cache( "news", $cache_id . $cache_prefix, true );
И добавляем $category_id. В итоге:
PHP:
$active = dle_cache( "news", $category_id . $cache_id . $cache_prefix, true );

Пару десятков строк ниже находим:
PHP:
create_cache ( "news", $tpl->result['content'], $cache_id . $cache_prefix, true );
И повторяем трюк с категорией:
PHP:
create_cache ( "news", $tpl->result['content'], $category_id . $cache_id . $cache_prefix, true );
взято с одного форума..
Screenshot_1.png
 
Последнее редактирование:
p.s автор я. спасибо за указание автора
 
Эта херня не работает, удалите.
 
da ya znaiu.... no hocu skazati sto u menea on rabotaet.... skaceal plugin ot sunx ustanavil i rabotaet..... tam 3 categorii potestiroval s tot je nazvaniem i rabotaet,,,, a v ceom mojet biti problemi?
Для XML карты оно работать не будет, минус Sitemap карта.
Редирект для не верных ссылок работать не будет верно.
 

Похожие темы Последние темы Популярные темы

Назад
Сверху