galabba 0 Опубликовано: 24 июля 2018 Рассказать Опубликовано: 24 июля 2018 Нашла в интернете хак на создание категории с одинаковыми названиями: Собственно, вопрос: он не сломает вывод новостей, там где не ожидалось (не нарушится вывод похожих новостей, карта сайта или что-нибудь еще)? Собственно сам хак: Идем в /engine/modules/functions.php и находим эту функцию: function get_ID($cat_info, $category) { foreach ( $cat_info as $cats ) { if( $cats['alt_name'] == $category ) return $cats['id']; } return false; } Комментируем её и вставляем ниже: 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 кода, которые отвечают за проверку: $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" ); } $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 и ищем: $active = dle_cache( "news", $cache_id . $cache_prefix, true ); И добавляем $category_id. В итоге: $active = dle_cache( "news", $category_id . $cache_id . $cache_prefix, true ); Пару десятков строк ниже находим: create_cache ( "news", $tpl->result['content'], $cache_id . $cache_prefix, true ); И повторяем трюк с категорией: create_cache ( "news", $tpl->result['content'], $category_id . $cache_id . $cache_prefix, true ); Цитата Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Присоединяйтесь к обсуждению
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.