Удаляем дублированные строки в каждой следующей части крошек
Kama Breadcrumbs- Заметки по Микроразметке
- Примеры переезда со старой версии Kama Breadcrumbs 3
- Удаляем дублированные строки в каждой следующей части крошек
- Поддержка плагина qtranslate-xt
- Установка через composer
Была задача удалить из крошек повторяющиеся части в названии.
Например, у нас есть такие крошки:
Дом > Посуда > Посуда для офиса > Посуда для офиса дешево > Тарелки для офиса
Нам нужно получить такое:
Дом > Посуда > Для офиса > Дешево > Тарелки для офиса
Решение (не идеальное, его унжно переделать):
// Хук для kama_breadcrumbs // удаляет дублированные строки в каждой следующей части крошек add_filter( 'kama_breadcrumbs', [ Kama_Breadcrumbs_Delete_Duplicate_Strings::class, 'del_duplicate_strings' ], 10, 2 ); final class Kama_Breadcrumbs_Delete_Duplicate_Strings { public static function del_duplicate_strings( $html, $sep ) { $parts = explode( $sep, $html ); $elements = array_map( 'strip_tags', $parts ); $elements = array_map( 'trim', $elements ); $new_elements = self::collect_new_elements( $elements ); foreach( $parts as $k => $part ){ $parts[ $k ] = str_replace( $elements[ $k ], $new_elements[ $k ], $part ); } return implode( $sep, $parts ); } private static function collect_new_elements( $elements ){ $prev_strs = []; $new_elements = []; foreach( $elements as $str ){ $has_replaced = 0; $lower_str = mb_strtolower( $str ); $replaced_str = $lower_str; foreach( $prev_strs as $prevstr ){ $replaced_str = str_replace( $prevstr, '', $replaced_str, $repcount ); if( $repcount ){ $has_replaced++; // break - нельзя! } } $replaced_str = trim( $replaced_str ); $new_elements[] = $has_replaced ? self::mb_ucfirst( $replaced_str ) : $str; $prev_strs[] = $lower_str; // предыдущие элементы крошек (строки) if( $has_replaced ){ $prev_strs[] = $replaced_str; // новая строка в список замены self::split_string_to_words( $replaced_str, $prev_strs ); } } return $new_elements; } /** * * разобьем строку на слова и добавим их в замену * * @param string $rep_str * * @return void */ private static function split_string_to_words( $rep_str, & $prev_strs ){ $rep_str_arr = preg_split( '~( +)~u', $rep_str, -1, PREG_SPLIT_DELIM_CAPTURE ); $_rep_str_arr = []; foreach( $rep_str_arr as $index => $val ){ $nextval = $rep_str_arr[ $index + 1 ] ?? null; if( ! $nextval ){ break; } if( $nextval[0] === ' ' ){ $_rep_str_arr[] = $val . $nextval; } elseif( $val[0] !== ' ' ){ $_rep_str_arr[] = $val; } } $rep_str_arr = $_rep_str_arr; // отдельные слова для замены (с пробелами на концах) foreach( $rep_str_arr as $val ){ $prev_strs[] = $val; } } private static function mb_ucfirst( $string ) { // echo mb_internal_encoding(); // mb_internal_encoding('UTF-8'); $string = trim( $string ); return mb_strtoupper( mb_substr( $string, 0, 1 ) ) . mb_substr( $string, 1 ); } }