использование html в качестве атрибута shortcode

Я создал короткий код, который извлекает и отображает верхние рекомендуемые сообщения на основе мета-ключа. Существуют разные атрибуты, которые все работают, за исключением случаев, когда содержимое атрибута является HTML.

Полный код:

function dot_irt_top_posts ( $atts ) { // get our variable from $atts extract(shortcode_atts(array( 'before' => '<li>', 'after' => '</li>', 'number' => '10', 'post_type' => 'post', 'year' => '', 'monthnum' => '', 'show_count' => '1', ), $atts)); global $wpdb; $request = "SELECT * FROM $wpdb->posts, $wpdb->postmeta"; $request .= " WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id"; if ($year != '') { $request .= " AND YEAR(post_date) = '$year'"; } if ($monthnum != '') { $request .= " AND MONTH(post_date) = '$monthnum'"; } $request .= " AND post_status='publish' AND post_type='$post_type' AND meta_key='_recommended'"; $request .= " ORDER BY $wpdb->postmeta.meta_value+0 DESC LIMIT $number"; $posts = $wpdb->get_results($request); $return = ''; foreach ($posts as $item) { $post_title = stripslashes($item->post_title); $permalink = get_permalink($item->ID); $post_count = $item->meta_value; $return .= $before; $return .= '<a href="' . $permalink . '" title="' . $post_title.'" rel="nofollow">' . $post_title . '</a> '; if ( $show_count == '1') { $return .= '<span class="votes">' . $post_count . '</span> '; } //$return .= get_the_post_thumbnail($item->ID, 'showcase-thumbnail'); $return .= $after; } return '<div class="top_10_posts">' . $return . '</div>'; } add_shortcode('irt_top_posts','dot_irt_top_posts'); 

Теперь, если я использую короткий код, как показано ниже, данные вернутся правильно как список:

  <ul> [irt_top_posts post_type='showcase' number='10'] </ul> 

Но если я устанавливаю атрибуты «раньше» и «после», они отображаются как контент, а не исполняются как html:

  <div> [irt_top_posts post_type='showcase' before='<div>' after='</div>' number='10'] </div> 

Нужны ли мне некоторые другие функции для отключения экранирования HTML?

Передайте только имена элементов и преобразуйте их в теги в своем коротком коде:

 [irt_top_posts post_type='showcase' container='div' number='10'] 

В вашем обратном вызове:

 $return "<$container>$return</$container>"; 

Попробуйте использовать html_entity_decode() .

 function foo ( $atts ) { extract(shortcode_atts(array( 'before' => '<li>', 'after' => '</li>', ), $atts)); $before = html_entity_decode( $before ); $after = html_entity_decode( $after ); $return = $before . 'something' . $after; return $return; }