usando html como atributo de código corto

4

He creado un shortcode que recupera y muestra las publicaciones más recomendadas basadas en una meta_key. Hay diferentes atributos, todos los cuales funcionan, excepto una vez donde el contenido del atributo es HTML.

El código completo es:

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');

Ahora, si utilizo un código abreviado como se muestra a continuación, los datos se devuelven correctamente como lista .:

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

Pero si configuro "antes" y & Los atributos 'after' luego se muestran como contenido en lugar de ejecutarse como html:

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

¿Necesito algunas otras funciones para desactivar el escape de HTML?

    
pregunta Harish Chouhan 28.09.2013 - 06:36

2 respuestas

3

Pase solo los nombres de los elementos y conviértalos en etiquetas en su shortcode:

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

En su devolución de llamada:

$return "<$container>$return</$container>";
    
respondido por el fuxia 28.09.2013 - 16:08
2

Prueba a 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;

}
    
respondido por el epilektric 28.09.2013 - 07:25

Lea otras preguntas en las etiquetas