WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Удаляем дублированные строки в каждой следующей части крошек

Kama Breadcrumbs

Была задача удалить из крошек повторяющиеся крошки. Технически крошки были разные, но названия у них были одинаковые.

// Хук для  kama_breadcrumbs - удаляет дублированные строки в каждой следующей части крошек
add_filter( 'kama_breadcrumbs_pre_out', 'del_duplicate_strings', 10, 2 );

function del_duplicate_strings( $out, $sep ){

	$fn__mb_ucfirst = function($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);
	};

	$parts = explode( $sep, $out );
	$strs = array_map('strip_tags', $parts);
	$strs = array_map('trim', $strs );

	$has_replaced_global = 0;

	foreach( $strs as $str ){
		$has_replaced = 0;

		$low_str = mb_strtolower( $str ); // для регистронезависимый замены

		if( isset($prevstrs) ){
			$rep_str = $low_str;
			foreach( $prevstrs as $prevstr ){
				$rep_str = str_replace( $prevstr, '', $rep_str, $repcount );

				if( $repcount ) $has_replaced++; // break - нельзя!
			}
		}

		$rep_str = trim($rep_str);
		$newstrs[] = $has_replaced ? $fn__mb_ucfirst($rep_str) : $str;
		$prevstrs[] = $low_str; // предыдущие элементы крошек (строки)

		if( $has_replaced ){
			$prevstrs[] = $rep_str; // новая строка в список замены

			$has_replaced_global++; // есть хоть одна замена

			// разобьем строку на слова и добавим их в замену
			if(1){
				$rep_str_arr = preg_split('~( +)~u', $rep_str, -1, PREG_SPLIT_DELIM_CAPTURE );
				$_rep_str_arr = array();
				foreach( $rep_str_arr as $k=>$val ){
					$nextval = & $rep_str_arr[$k+1];
					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 ){
					$prevstrs[] = $val;
				}

			}
		}
	}

	// лишнего не делаем
	if( ! $has_replaced_global ){
		return $out;
	}

	// соберем новые части и заменим где надо
	foreach( $parts as $k => & $part ){
		$part = str_replace( $strs[$k], $newstrs[$k], $part );
	}

	return implode( $sep, $parts );
}
Комментариев нет
    Войти