Мне нужно разрешить пользователям использовать шорткод [warning] в интерфейсе моего сайта. За этим шорткодом может следовать только один [warning](arg1) или два аргумента [warning](optional-arg)(arg1). При вводе двух аргументов первый optional-arg будет считаться заголовком, а второй arg1 - основным текстом, а если введен только один arg1, он будет считаться основной текст.
Вот код, которым я управляю
function warning($text) {
$text = preg_replace('/\[warning\]\s*\((.*?)\)/', '<div class = "alert alert-error"><div class = "alert-content"> $1 </div></div>', $text); //for warning with body text only
$text = preg_replace('/\[warning\]\s*\((.*?)\)\s*\((.*?)\)/', '<div class = "alert alert-error"><div class = "alert-content"><h2 class = "alert-title"> $1 </h2><div class = "alert-body"><p> $2 </p></div></div></div>', $text); //for warning with heading
return $text;
}
add_filter('the_content', 'warning');
add_filter( 'the_excerpt', 'warning');
Проблема в том, что второй аргумент не учитывается и находится вне поля предупреждения.






Это задание для preg_replace_callback
function warning($text) {
return preg_replace_callback('/\[warning\]\s*\((.*?)\)(?:\s*\((.+?)\))?/',
function ($m) {
if (isset($m[2])) {
return '<div class = "alert alert-error"><div class = "alert-content"><h2 class = "alert-title"> '.$m[1].' </h2><div class = "alert-body"><p> '.$m[2].' </p></div></div></div>';
} else {
return '<div class = "alert alert-error"><div class = "alert-content"> '.$m[1].' </div></div>';
}
}
, $text);
}
echo warning("[warning](body)"), "\n";
echo warning("[warning](header)(body)"), "\n";
Выход:
<div class = "alert alert-error"><div class = "alert-content"> body </div></div>
<div class = "alert alert-error"><div class = "alert-content"><h2 class = "alert-title"> header </h2><div class = "alert-body"><p> body </p></div></div></div>
как только
[warning]был заменен первымpreg_replace, второйpreg_replaceбольше не вступит в силу. Вам нужно либо сначала проверить, есть ли 2 параметра (переключите 2 строки, если это работает), либо сделать регулярное выражение для 1 аргумента, чтобы оно не соответствовало случаю, когда их 2