17Nov 2011 4 Comments */?>

Como ejecutar un widget con un shortcode

Categorías: Tips de wordpress, Tutoriales, Wordpress - Tags: ,

Hace un tiempo les explique como ejecutar un shortcode dentro de un widget en el sidebar. Pero que pasa cuando queremos ejecutar un widget dentro de un shortcode ?? Hace poco me encontre con esta situación y haciendo un poco de investigación me encontre con una solución. No recuerdo donde porque el código lo modifique a mi gusto, pero quiero decir que no es creación mía aunque no pueda dar creditos a su autor.
A partir de ahora van a poder ejecutar un widget con un shortcode de la siguiente forma

1
[widget nombre="mi_nombre_de_widget"]

Como funciona?

Para ello vamos a usar la función the_widget().

Y como lo hacemos?

  • Comprobamos que existe el widget
  • Si existe….
  • Capturamos el buffer
  • Imprimimos el widget
  • Terminamos la captura del buffer
  • Devolvemos lo capturado
  • Si no existe…
  • Imprimimos error
Como siempre incluimos el siguiente código en functions.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function mqw_widget($atts) {
 
    global $wp_widget_factory;
 
    extract(shortcode_atts(array(
        'nombre' => FALSE
    ), $atts));
 
    $nombre = wp_specialchars($nombre);
 
    if (!is_a($wp_widget_factory->widgets[$nombre], 'WP_Widget')):
        $wp_class = 'WP_Widget_'.ucwords(strtolower($class));
 
        if (!is_a($wp_widget_factory->widgets[$wp_class], 'WP_Widget')):
            return '<p>'.sprintf(__("%s: No se encuentra esta clase. Estas seguro que el widget se llama así?"),'<strong>'.$class.'</strong>').'</p>';
        else:
            $class = $wp_class;
        endif;
    endif;
 
    ob_start();
    the_widget($widget_name, $instance, array('widget_id'=>'arbitrary-instance-'.$id,
        'before_widget' => '',
        'after_widget' => '',
        'before_title' => '',
        'after_title' => ''
    ));
    $output = ob_get_contents();
    ob_end_clean();
    return $output;
 
}
add_shortcode('widget','mqw_widget');

Miren bien el nombre de sus widgets, no es el que aparece en Apariencia -> Widgets, sino más bien el nombre de la clase con que registraron sus widgets en los archivos de sus themes.

Saludos!!!

Damián Logghe

Programador freelancer y emprendedor en sueños. Contento de ser mi jefe y poder hacer lo que me gusta. WordPress es mi principal fuente de ingreso y me escribo tanto para ayudar como para tener una guia de memoria. Quieres contratarme? Déjame un mensaje.

More Posts - Website

Follow Me:
TwitterFacebookLinkedInGoogle Plus

  • Este sitio esta activo? lo que pasa es que no veo fecha en los post y me gustaria saber si es una comunidad creciente o no, existen pocas instancias de conocimientos colectivos sobre wp en español y seria un agrado tener alguna alternativa..

  • Si claro ;D , en la parte principal no me pareció importante poner fechas. Si miras en el sidebar y le das click por ejemplo a post Recent vas a ver que todos los días hay artículos.
    Saludos!

  • Ilmer

    Lo intente, pero lamentablemente no me funciono. Eso me dio paso para buscar y bucar hasta que encontre este: Widget Shortcode, es un plugin que hace este trabajo sencillo.

  • paula andriole

    Gracias Damián! peleé un poco pero finalmente funcionó. Me ahorraste un montón de trabajo. Buenísimo tu aporte!