Support » Developing with WordPress » How do I create a shortcode for a WordPress sidebar?

  • Resolved starapple

    (@starapple)


    I have added a custom sidebar to my WordPress installation using the following script that also creates a shortcode:

    // Register Sidebars
    function custom_sidebars() {
    
        $args = array(
            'id'            => 'gutenbar',
            'class'         => 'abeng',
            'name'          => __( 'Abeng sidebar', 'text_domain' ),
            'description'   => __( 'Sidebar for block', 'text_domain' ),
        );
        register_sidebar( $args );
    
    }
    add_action( 'widgets_init', 'custom_sidebars' );
    add_shortcode( 'add_sidebar', 'custom_sidebars' );

    When I add the [add_sidebar] shortcode to a Gutenberg block the sidebar does not appear. However, when I use a plugin called Sidebar Shortcode [sidebar id=”gutenbar”] the sidebar is displayed perfectly. I assume that my shortcode is associated with a specific function and does not need a name or id for the sidebar to be chosen.

    I had been thinking that because the sidebar was added using a plugin that allows the insertion of functions available site-wide rather than only in a theme using its functions.php, that was the reason the shortcode did not do its job. But since the sidebar shows in the widgets area and allowed me to add widgets, and now works with this plugin, that’s obviously not the issue.

    Looking under the hood of the concisely written Sidebar Shortcode, I can’t see what I might want to add to make my code functional.

    Why am I doing this? I’m using full-width pages for my posts, disabling the theme’s default right sidebar (which doesn’t play well in a responsive design) but still need to reinsert the sidebar in a column.

    Thanks for any help.

Viewing 9 replies - 1 through 9 (of 9 total)
  • Hi

    The following code will register your shortcode and whenever you will call [add_sidebar] anywhere it will load the ‘gutenbar’ sidebar.

    add_shortcode( 'add_sidebar', 'wphelp_custom_sidebar' );
    function wphelp_custom_sidebar(){
        dynamic_sidebar('gutenbar');
    }

    custom_sidebars is just registering the sidebar but if you want to use that through shortcode then you have to call it through the function https://developer.wordpress.org/reference/functions/dynamic_sidebar/

    Moderator Jan Dembowski

    (@jdembowski)

    Forum Moderator and Brute Squad

    @starapple Don’t create duplicate topics. I’ve archived your other topic.

    Thread Starter starapple

    (@starapple)

    Thanks moderator. I’m sure you saw my follow up: “Could an admin please delete this as I corrected the title and reposted the question.”

    Thanks.

    Thread Starter starapple

    (@starapple)

    @prashantvatsh, thanks for your reply. It’s on the right track but seems to create an error in the block editor: “Updating failed. The response is not a valid JSON response.”

    The sidebar shows in the preview but at the top left of the page rather than in the column where I inserted the shortcode.

    Please try something like return dynamic_sidebar('gutenbar'); instead of just dynamic_sidebar('gutenbar');

    Thread Starter starapple

    (@starapple)

    Using return gives the same results. Not valid JSON and sidebar at top of post.

    ob_start(); 
    dynamic_sidebar( 'gutenbar'); 
    $sidebar_left = ob_get_clean(); 
    $html = ' <div class="sidebar-content"> ' . $sidebar_left . ' </div> '; 
    return $html;

    Please replace return dynamic_sidebar('gutenbar'); with the above code. Hopefully, this will work.

    Thread Starter starapple

    (@starapple)

    You’ve hit the nail on the head @prashantvatsh

    It seems that in me trying to avoid using a multiplicity of plugins, we’ve almost created another. lolol

    Thanks for your time an patience. A true Lion.

    Thread Starter starapple

    (@starapple)

    Will mark this as resolved.

Viewing 9 replies - 1 through 9 (of 9 total)
  • The topic ‘How do I create a shortcode for a WordPress sidebar?’ is closed to new replies.