Intereting Posts
Отключить автоматическое сохранение и публикацию изменений внутри темы или плагина Шаблон цикла и страницы: мой WP_query не принимает аргументы Получить URL-адрес текущего сообщения, но не номер страницы WP Query-Связь между двумя настраиваемыми типами сообщений и их полями Получение мягких ошибок 404 (статус 200) при включении кеширования плагинов Вариант предварительной загрузки кэша W3TC Изменить тему из плагина на основе query_vars Admin search post meta Комментарии не заданы с помощью настраиваемого шаблона Обновите собственный репозиторий плагинов на Multisite Установка ссылки страницы в нижнем колонтитуле? Зарегистрируйте скрипт, который будет установлен как в админе, так и в интерфейсе Как реализовать комментарии по отдельным полям в WordPress? URL-адреса медиа / привязки не перенаправляются с использованием фальшивой структуры URL-адреса Добавить поле в форму для регистрации WordPress

Как разбирать вложенные короткие коды?

Вложенные короткие коды не будут корректно анализировать:

[row] [col size="6"]...[/col] [col size="6"] [row] [col size="6"]...[/col] [col size="6"]...[/col] [/row] [/col] [/row] 

Из документации WordPress я понимаю, что это ограничение для коротких кодов WordPress. Возможно ли, чтобы это работало?

Изменить: Вот мой код коротких кодов, он отлично работает, если его не вложенный (то есть, короткий код строки не используется внутри короткого кода col).

 add_shortcode( 'row', 'row_cb' ); function row_cb( $atts, $content = null ) { $output = ''; $output .= '<div class="row">'; $output .= do_shortcode( $content ); $output .= '</div>'; return $output; } add_shortcode( 'col', 'col_cb' ); function col_cb( $atts, $content = null ) { extract( shortcode_atts( array( 'size' => '', ), $atts ) ); $output = ''; $output .= '<div class="col">'; $output .= do_shortcode( $content ); $output .= '</div>'; return $output; } 

На самом деле это решение. Используемый короткий код имеет переменную $ content, без фильтра do_shortcode , например:

 do_shortcode($content) 

Откройте файл, где есть короткие коды, и измените $ content для do_shortcode ($ content). Это будет работать.

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

Я использовал рекурсивное регулярное выражение (notice |(?R) ), поэтому он может быть не таким быстрым, как официальный do_shortcode, но он допускает вложение коротких кодов с тем же именем.

Мой запрос на это состоял в том, чтобы не иметь фиксированного списка коротких кодов (поэтому все существующие в коротких кодах содержимого должны быть проанализированы), чтобы разрешить любой уровень вложенности, а также использовать структуру $ atts, которая содержит некоторые параметры, существующие в время заполнения этого точного контента.

Для $ atts я также написал свою собственную функцию, так как я хотел, чтобы $ atts включал как все, что исходит из контента (а не только те, значение по умолчанию которых определено), и значения по умолчанию для этих полей, существующих в массиве по умолчанию и не исходя из значений короткого кода.

Вот моя функция atts:

 function complete_atts_with_defaults( $pairs, $atts = array() ) { $out = $atts; foreach ($pairs as $name => $default) { if ( array_key_exists($name, $atts) && !empty( $atts[$name] ) ) { continue; } //else $out[$name] = $default; } return $out; } 

И вот другой код:

 define( 'OUR_SHORTCODE_FULL_REGEX', '@\[([a-z0-9_]+)([^\]]*)\]((?:[^[]|(?R))+)\[\/\1\]@' ); define( 'OUR_SHORTCODE_HALF_REGEX', '@\[([a-z0-9_]+)([^\]]*)\/\]@' ); function fill_all_post_placeholders( $text, $atts = array() ) { //... $text = str_replace( '%5B', '[', $text ); $text = str_replace( '%5D', ']', $text ); $atts = complete_atts_with_defaults( array( 'value1' => 'Hi :)', 'value2' => '', 'value3' => '', ), $atts ); //... $text = preg_replace_callback( OUR_SHORTCODE_HALF_REGEX, function( $match ) use ( $atts ) { return replace_half_shortcode_placeholder( $match[1], $match[2], $atts ); }, $text ); $text = preg_replace_callback( OUR_SHORTCODE_FULL_REGEX, function( $match ) use ( $atts ) { return replace_shortcode_placeholder( $match[1], $match[2], $match[3], $atts ); }, $text ); return $text; } function replace_shortcode_placeholder( $name, $params, $content, $atts ) { $content = preg_replace_callback( OUR_SHORTCODE_FULL_REGEX, function( $match ) use ( $atts ) { return replace_shortcode_placeholder( $match[1], $match[2], $match[3], $atts ); }, $content ); // $function_to_call = '_rp_' . $name; // if ( function_exists( $function_to_call ) ) { return $function_to_call( $name, $params, $atts ); } // //else // $value = $atts[ $name ]; // if ( empty( $value ) ) { return ''; } // //else // return $value; return '<br>name: ' . $name . ' <br>params: ' . $params . ' <br>content: (' . $content . ')<br><br>'; } function replace_half_shortcode_placeholder( $name, $params, $atts ) { // $function_to_call = '_rp_' . $name; // if ( function_exists( $function_to_call ) ) { return $function_to_call( $name, $params, $atts ); } // //else // $value = $atts[ $name ]; // if ( empty( $value ) ) { return ''; } // //else // return $value; return '<br>name half: ' . $name . ' <br>params half: ' . $params . '<br><br>'; } 

Я оставил для вас непринужденную область комментариев, чтобы вы могли видеть, как эти функции могут быть использованы.

Эти «короткие кодовые» мои не зарегистрированы, как вы можете видеть в комментариях, они работают по-разному, динамически.

Кроме того, необходимым правилом для этих коротких кодов для работы было бы, чтобы всегда добавлять '/' к самозакрывающимся тегам, как это делалось бы в XML. (В коде они называются «полукоды»).

Пример содержимого, проанализированного этим кодом (извините за тарабарщину):

 [show_text_if campaign="2899"]subscribing to this newsletter [show_text_if campaign="2901" field_value="'a href='http://ajshdash.com/asdhal/asdasdasd'" field_value2="айксчд асй даксчй д"]subscribing to this new newsletter[/show_text_if] [red value1="dfsdfs" value2="sdfkls dfh skjha skd"/][/show_text_if] [color value3="askdfjajls" value4="lskdfhjsldhfs df"/] [show_text_if_not campaign="2899"]asdklja slkd alkd alskdj alsjd alsj als jdalsk jals dalskj asjd <a href="http://example.com/experiment/" target="_blank">Experiment</a> once more hooray! [green value4="askljjlaskd"/] Я сегодня это Я и я! :)[/show_text_if_not] [show_text_if field_name="campaign" field_value="2899"]slkjd alsjkd aljsd ajs d new[/show_text_if] 

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

Ваш обратный вызов для короткого кода должен выглядеть примерно так:

 add_shortcode('col', 'col_cb'); add_shortcode('row', 'row_cb'); function col_cb( $atts, $content ) { $content = do_shortcode($content); // ... } function row_cb( $atts, $content ) { $content = do_shortcode($content); // ... }