Passe apenas os nomes dos elementos e converta-os em tags no seu shortcode:
[irt_top_posts post_type='showcase' container='div' number='10']
Em seu retorno de chamada:
$return "<$container>$return</$container>";
Eu criei um shortcode que recupera e exibe as principais postagens recomendadas com base em meta_key. Existem atributos diferentes, que funcionam todos, exceto uma vez em que o conteúdo do atributo é HTML.
O código completo é:
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');
Agora, se eu usar um shortcode como abaixo, os dados serão retornados corretamente como lista.:
<ul>
[irt_top_posts post_type='showcase' number='10']
</ul>
Mas se eu definir 'antes' & Depois de 'atributos', eles são exibidos como conteúdo, em vez de serem executados como html:
<div>
[irt_top_posts post_type='showcase' before='<div>' after='</div>' number='10']
</div>
Preciso de algumas outras funções para desativar o HTML de escape?
Passe apenas os nomes dos elementos e converta-os em tags no seu shortcode:
[irt_top_posts post_type='showcase' container='div' number='10']
Em seu retorno de chamada:
$return "<$container>$return</$container>";
Tente usar 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;
}
Tags shortcode