Часто на сайтах возникает необходимость вставлять в тексты страниц информационные блоки – баннеры, телефоны и т.д. Как правило, содержание этих блоков часто изменяется что существенно усложняет работу контент менеджера.
Упростить эту задачу помогут шорткоды (shortcode). Смысл их в том что в панели управления сайта вместо нужного контента вставляется символьный код, например [[phone]]
, а при выводе на фронте сайта он заменяется.
Двойные квадратные скобки используются для того чтобы исключить ложную замену.
Шорткоды с контентом из массива
Данный функционал реализуется на регулярных выражениях функцией preg_match_all()
.
$text = '
<p>
Повседневная практика показывает, что укрепление и развитие структуры требуют от нас
анализа дальнейших направлений развития. Идейные соображения высшего порядка, а также
начало повседневной работы по формированию позиции требуют определения и уточнения.
</p>
[[phone]]
<p>
Идейные соображения высшего порядка, а также сложившаяся структура организации позволяет
выполнять важные задания по разработке модели развития. Товарищи! начало повседневной
работы по формированию позиции требуют от нас анализа финансовых условий.
</p>
[[address]]
';
// Массив значений.
$info = array(
'phone' => '+7 (495) 000-00-00',
'address' => 'г.Москва, Тверская д.9',
);
// Поиск и замена.
preg_match_all("|\[\[(.*)\]\]|U", $text, $matches);
if (!empty($matches[1])) {
foreach ($matches[1] as $row) {
$replase = (empty($info[$row])) ? '' : $info[$row];
$text = str_ireplace('[[' . $row . ']]', $replase, $text);
}
}
echo $text;
<p>
Повседневная практика показывает, что укрепление и развитие структуры требуют от нас
анализа дальнейших направлений развития. Идейные соображения высшего порядка, а также
начало повседневной работы по формированию позиции требуют определения и уточнения.
</p>
+7 (495) 000-00-00
<p>
Идейные соображения высшего порядка, а также сложившаяся структура организации позволяет
выполнять важные задания по разработке модели развития. Товарищи! начало повседневной
работы по формированию позиции требуют от нас анализа финансовых условий.
</p>
г.Москва, Тверская д.9
Шорткоды с контентом из базы данных
В следующим примере используются шорткод вида [[blocks.XX]]
, где XX указывает ID нужной записи. Для доступа к базе данных используется класс-обертка PDO.
$text = '
<p>
Повседневная практика показывает, что укрепление и развитие структуры требуют от нас
анализа дальнейших направлений развития. Идейные соображения высшего порядка, а также
начало повседневной работы по формированию позиции требуют определения и уточнения.
</p>
[[blocks.1]]
<p>
Идейные соображения высшего порядка, а также сложившаяся структура организации позволяет
выполнять важные задания по разработке модели развития. Товарищи! начало повседневной
работы по формированию позиции требуют от нас анализа финансовых условий.
</p>
[[blocks.2]]
';
// Поиск и замена.
preg_match_all("|\[\[blocks\.(.*)\]\]|U", $text, $matches);
if (!empty($matches[1])) {
foreach ($matches[1] as $row) {
$item = DB::getRow("SELECT `text` FROM `blocks` WHERE `id` = ?", $row);
$replase = (empty($item['text'])) ? '' : $item['text'];
$text = str_ireplace('[[blocks.' . $row . ']]', $replase, $text);
}
}
echo $text;
Замена при буферизации вывода
Как вариант замену кодов можно производить в callback-функции буферизации вывода ob_start()
:
function callback($buffer)
{
preg_match_all("|\[\[blocks\.(.*)\]\]|U", $buffer, $matches);
if (!empty($matches[1])) {
foreach ($matches[1] as $row) {
$item = DB::getRow("SELECT `text` FROM `blocks` WHERE `id` = ?", $row);
$replase = (empty($item['text'])) ? '' : $item['text'];
$buffer = str_ireplace('[[blocks.' . $row . ']]', $replase, $buffer);
}
}
return $buffer;
}
ob_start('callback');
?>
<html>
<body>
<p>
Повседневная практика показывает, что укрепление и развитие структуры требуют от нас
анализа дальнейших направлений развития. Идейные соображения высшего порядка, а также
начало повседневной работы по формированию позиции требуют определения и уточнения.
</p>
[[blocks.1]]
<p>
Идейные соображения высшего порядка, а также сложившаяся структура организации позволяет
выполнять важные задания по разработке модели развития. Товарищи! начало повседневной
работы по формированию позиции требуют от нас анализа финансовых условий.
</p>
[[blocks.2]]
</body>
</html>