how to insert shortcode into wordpress menu

I have made a menu item with this code.
The menu item shows up but the shortcode output is not there.
Is there something I can add or a different method that will do this.
I have added also in hopes this might help.

add_filter('wp_nav_items', 'do_shortcode', 7);

Or maybe someone knows this is not possible and can tell me.

Read More
/* Nav Menu */
function add_profile_link_to_nav(){ 
 if ( is_user_logged_in() ) { ?> 

<ul> 
  <li class="menu-item"id="one"> <a href="http://example.com/members/">All  Members</a>
  <ul class="sub-menu"> 
      <li class="menu-item"><?php echo custom_execute_shortcode(); ?> </li>
  </ul> 
 </li>
</ul>    <!--end menu--->
<?php } 
}
add_action( "wp_nav_items","add_profile_link_to_nav" );

function custom_execute_shortcode() {
$myfunction= '[my shortcode"]';
$myfunction_parsed = do_shortcode($myfunction);
return $myfunction_parsed;
}

Thanks

Related posts

Leave a Reply

3 comments

  1. You can’t use shortcodes directly in the menu URL on the menu page, because the brackets get stripped out. But you can use placeholders like this: #profile_link#.

    With the following code in functions.php, you can create a custom menu item with the URL #profile_link#, and it will replace that with your shortcode.

    /**
     * Filters all menu item URLs for a #placeholder#.
     *
     * @param WP_Post[] $menu_items All of the nave menu items, sorted for display.
     *
     * @return WP_Post[] The menu items with any placeholders properly filled in.
     */
    function my_dynamic_menu_items( $menu_items ) {
    
        // A list of placeholders to replace.
        // You can add more placeholders to the list as needed.
        $placeholders = array(
            '#profile_link#' => array(
                'shortcode' => 'my_shortcode',
                'atts' => array(), // Shortcode attributes.
                'content' => '', // Content for the shortcode.
            ),
        );
    
        foreach ( $menu_items as $menu_item ) {
    
            if ( isset( $placeholders[ $menu_item->url ] ) ) {
    
                global $shortcode_tags;
    
                $placeholder = $placeholders[ $menu_item->url ];
    
                if ( isset( $shortcode_tags[ $placeholder['shortcode'] ] ) ) {
    
                    $menu_item->url = call_user_func( 
                        $shortcode_tags[ $placeholder['shortcode'] ]
                        , $placeholder['atts']
                        , $placeholder['content']
                        , $placeholder['shortcode']
                    );
                }
            }
        }
    
        return $menu_items;
    }
    add_filter( 'wp_nav_menu_objects', 'my_dynamic_menu_items' );
    

    You just need to set 'shortcode' in the $placeholders array, and optionally 'atts' and 'content'.

    For example, if your shortcode is like this:

    [example id="5" other="test"]Shortcode content[/example]
    

    You would update:

    '#placeholder#' => array(
        'shortcode' => 'example';
        'atts' => array( 'id' => '5', 'other' => 'test' );
        'content' => 'Shortcode content';
    ),
    

    Note that I don’t use do_shortcode() because it is a resource intensive function and isn’t the right tool for the job in this case.

  2. Enable description on the menu page, paste to the description textarea of the link your shortcode, in functions.php add next code:

    add_filter('walker_nav_menu_start_el', function($item_output, $item) {
        if (!is_object($item) || !isset($item->object)) {
            return $item_output;
        }
    
        if ($item->ID === 829) {
            $item_output = do_shortcode($item->description);
        }
    
        return $item_output;
    }, 20, 2);