Support » Plugins » calling 2.8 widgets directly from template/plugin

  • Hi,

    I’d like to call a 2.8 widget (extended WP_Widget class) directly from a template and / or plugin.
    The template i am trying to get a widget working doesn’t have a sidebar, so I tried to initiate the widget class and call a specific widget like this:

    $sb = new WP_Widget();

    but it gives me some errors..
    Warning: Missing argument 2 for WP_Widget::__construct(), called in (……)
    and a Fatal error: Call to undefined method WP_widget::demowidget(….)

    The widget i am trying to call is working fine with my standard sidebar. I am sure it is not the widget itself..
    Do i need to load/include some other files? I didnt follow the widget development, so i dont really know wtf.

    Basically what i wanna do is: I want to call one (or more) specific widget(s) within a custom post/page template and not the whole sidebar which is defined on your widget admin page..


Viewing 7 replies - 1 through 7 (of 7 total)
  • Moderator Samuel Wood (Otto)

    (@otto42) Admin

    Widgets are not made to be called directly. They go into registered sidebars.

    If you want to use a widget directly, you’ll probably have to hack it up a bit to make it capable of a direct function call.

    it is actually pretty easy.
    After toying around for a bit I managed to call a widget from everywhere:

    $instance = array("title" => "My Widget", "number" => 9);
    $args = array("title" => "My Widget", "before_title" => "<h2>", "after_title" => "</h2>");
    $sb = new My_Widget_Class();

    @naabster – awesome snippet! I’m using it to call widgets from post/pages via shortcodes. The only problem with it is that the $instance[‘number’] doesn’t pass the number to the widget method. But this will work:

    $instance = array("title" => "My Widget", "number" => 9);
    $args = array("title" => "My Widget", "before_title" => "<h2>", "after_title" => "</h2>");
    $sb = new My_Widget_Class();
    $sb->number = $instance['number'];

    When calling a widget from a post/page via shortcode, it’s being output at the top of the post/page. I guess its because the widget method echoes the content instead of returning it by reference. Is there a way to get around it and output widget content in specific place?

    P.S. The workaround I came up with is to assign all the HTML within the widget method to a $variable and add a simple condition at the end to check if $instance[‘return’] is true – if yes – it returns the value or else prints it out. The return instance is declared as true in the shortcode function.

    Great! Exactly what I was looking for!

    That is VERY useful! Glad I found it. Thanks.

    I have a problem that may solved by a variation of that code.

    In this section of my template:

    <?php if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar('left-side-widgets') ) : ?>

    I would like to add something like:

    <?php else : ?>
    <?php /* alternate sidebar file if no widgets detected in dynamic sidebar */ ?>

    <?php endif; ?>

    Obviously, I would like to include an alternate file if no widgets exist in that specific dynamic sidebar.

    How can I create that “switch”?

    I can use:
    to grab the file if I must.

    Thanks for any help…



    Thanks for the snippet!

    I’ve ran into this kind of problem:
    if (sidebar has widget) –> show sidebar
    else –> show some widgets by hand

    The results:

    Function to verify if sidebar has a widget:

    function is_sidebar_active($sidebar_id, $force = false){
    		static $sidebars_widgets;
    		if($force || !isset($sidebars_widgets)){
    			$sidebars_widgets = get_option('sidebars_widgets', array());
    		if((int)$sidebar_id) $sidebar_id = sprintf('sidebar-%d', $sidebar_id);
    		return is_array($sidebars_widgets[$sidebar_id]) && count($sidebars_widgets[$sidebar_id]);

    Code in sidebar.php:

    if (is_sidebar_active(1))
    				dynamic_sidebar('Blogs: Lateral Interna');
    			else {
    				$args = array (
    					'title' => '',
    					'before_widget' => '<li class="widget">',
    					'after_widget' => '</li>',
    					'before_title' => '<h2>',
    					'after_title' => '</h2>'
    				$instance = array ( 'title' => 'Categorias', 'number' => 1 );
    				$widget = new WP_Widget_Categories();
    				$args = array ( 'title' => '' );
    				$instance = array ( 'title' => 'Tweets @revistatitude', 'number' => 1 );
    				$widget = new WP_Widget_Tweets();

    Hope it helps someone.

Viewing 7 replies - 1 through 7 (of 7 total)
  • The topic ‘calling 2.8 widgets directly from template/plugin’ is closed to new replies.