how to insert shortcode into wordpress menu

前端 未结 3 1364
旧巷少年郎
旧巷少年郎 2021-02-04 13:36

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 hav

3条回答
  •  时光说笑
    2021-02-04 14:04

    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.

提交回复
热议问题