Intereting Posts
Как исправить код в php? Страница продолжает обновляться с помощью формы Ajax WordPress Menu Walker: добавьте #hashes к ссылкам дочерней страницы (только) Как использовать фильтр «widget_text» для конкретного текстового виджета с идентификатором цикл не отображает сообщения на странице пользовательских шаблонов Как использовать запрос WHERE NOT EXISTS, чтобы избежать дублирования записи с помощью $ wpdb для сохранения в пользовательской таблице? Постоянная ссылка для страницы не работает, и ссылка на страницу задает «Объект не найден!». Ошибка HTTP 500 при попытке доступа к странице администрирования WP PHP Предупреждение: неверный аргумент, предоставленный для foreach Как вставить виджет поиска amazon в сообщения или страницы? Есть ли способ добавить изображения в медиабиблиотеку по пути на сервере? Область администратора пробита из-за странных проблем Перенаправление старой ссылки на новую wp_get_current_user всегда возвращает 0 Многоступенчатая форма, настраиваемый плагин

Получить атрибуты вложенных коротких кодов

Когда вы определили свои короткие коды следующим образом:

[myform] Foo: [mytextbox name="foo"] [/myform] 

И в вашем php:

 function shortcode_myform($atts, $content = null) { return '<form action="#" method="post">' . do_shortcode($content) . '</form>'; } add_shortcode('myform','shortcode_myform'); function shortcode_mytextbox($atts) { return '<input type="text" name="'$atts['name']'" />'; } add_shortcode('mytextbox','shortcode_mytextbox'); 

Каким будет самый элегантный способ получить атрибут имени любых дочерних элементов myform атрибута внутри функции myform ?

Я решил, что могу использовать сеансы или глобалы, но это не похоже на то, что нужно делать.

Solutions Collecting From Web of "Получить атрибуты вложенных коротких кодов"

Поскольку никто не отправил полный ответ, я использовал метод s_ha_dum, описанный и написанный функцией, которая возвращает shortcode => array / map.

 function attribute_map($str, $att = null) { $res = array(); $reg = get_shortcode_regex(); preg_match_all('~'.$reg.'~',$str, $matches); foreach($matches[2] as $key => $name) { $parsed = shortcode_parse_atts($matches[3][$key]); $parsed = is_array($parsed) ? $parsed : array(); if(array_key_exists($name, $res)) { $arr = array(); if(is_array($res[$name])) { $arr = $res[$name]; } else { $arr[] = $res[$name]; } $arr[] = array_key_exists($att, $parsed) ? $parsed[$att] : $parsed; $res[$name] = $arr; } else { $res[$name][] = array_key_exists($att, $parsed) ? $parsed[$att] : $parsed; } } return $res; } 

Пример использования:

Содержание страницы:

 [outer_shortcode] [inner_code url="#" title="Hello"] [/outer_shortcode] 

Реализация коротких кодов:

 add_shortcode('outer_shortcode',function($atts,$content) { return attribute_map($content); }); add_shortcode('inner_shortcode',function($atts,$content) { return ''; }); 

Это позволит:

 Array ( [inner_shortcode] => Array ( [url] => # [title] => Hello ) )