Сегодня я вам покажу как рандомно выводить элементы массива для разных url, при этом случайный вывод НЕ будет меняться при перезагрузки страницы. Мы сформируем число из передаваемого URL.
Давайте я вам расскажу как с этим столкнулся я…
Мне нужно было для разных страниц на сайте выводить одинаковую информацию, несколько строк с описанием техники. Для того чтобы структура страницы не повторялась и поисковой робот не склеивал страницы, нужно было выводить эти строки в разном порядке.
Простой рандом здесь не работает, так как он меняется каждый раз, после перезагрузки страницы.
И вот какое решение я нашёл:
Здесь присутствует WP функция, которая передает текущий URL страницы.
crc32 — Функция вычисляет контрольную сумму по алгоритму CRC32 для строки. Это мы делаем для того чтобы получить число соответствующее строке.
srand — Изменяет начальное число генератора псевдослучайных чисел. Когда мы изменяем начальное число, мы задаём свой алгоритм выбора случайных чисел.
Начальное число изменяется на все странице, поэтому в дальнейшем для изменения не чего передавать не нужно.
shuffle — Эта функция перемещает элементы массива в случайном порядке. Без, заранее заданной, функции srand вы получите случайны порядок, который будет обновляться после каждой перезагрузки страницы.
array_slice — формирует из переданного массива случайный массив с указанным количеством элементов. Первый параметр — массив, который нужно перебрать. Второй параметр — с какого элемента начать перебор, третий параметр — сколько элементов учитывать.
srand(crc32(get_permalink( $post->ID )));
$brandPhrases = $arr_str_for_technik;
shuffle($brandPhrases);
$brandPhrases = array_slice($brandPhrases, 0);
var_dump($brandPhrases);
А для примера я использую вот такой массив.
$arr_str_for_technik = array(
'Работа холодильника основана на принципе холодильной машины, переносящей тепловую энергию из рабочей камеры – наружу, в кухонное помещение',
'Холодильники делятся на два вида: среднетемпературные камеры для хранения свежих продуктов и низкотемпературные морозильные камеры',
'Прототип морозильника появились несколько тысяч лет назад – использовались помещения для хранения продуктов, наполненные льдом',
'Российский прототип холодильника — ледники, представляющие сруб, погруженный в землю',
'С 1930 года хладагентом в морозильниках является инертный газ фреон',
'Хладагент, обычно, фреон — газ, переносящий лишнее для продуктов тепло от испарителя к конденсатору',
'Холодильник тратит около 10% от общего электропотребления дома',
'Наиболее экономный режим холодильника - когда в нём находится большое количество продуктов',
);
Как ограничить выборку?
Вы можете указать количество строк, которые будут выведены. Например у вас 20 строк, а вам нужно выводить 5 из них.
Для этого укажите количества элементов, в качестве третьего параметра.
$brandPhrases = array_slice($brandPhrases, 0, 5);
Как выводить информация по нескольким строкам (доменам).
Вы можете передать не текущий домен, как я, а список доменов записанных в массив. Или это могут быть не домены, а любые другие строки.
$hosts = [
'владимир.рф',
'москва.рф',
'питер.рф',
'ещё_город.рф',
'и_ещё_один_город.рф',
];
$count = 5;
/*проходимся по всем доменам в массиве*/
foreach ($hosts as $host) {
srand(crc32($host));
$brandPhrases = $arr_str_for_technik;
shuffle($brandPhrases);
$brandPhrases = array_slice($brandPhrases, 0, $count);
}