Execute shortcode only in another shortcode

I wonder if it’s possible to do a shortcode only in another shortcode. For example I got following code pieces:

[heading]some pricing page[/heading]
[pricing_box]
  [heading]Some title[/heading]
[/pricing_box]

Now I don’t want to define one shortcode heading which would apply to both the nested one and the first level shortcode. I want the both heading shortcodes to produce different outputs.
Of course, I could try to solve this by renaming one of the shortcodes to title or something, but this doesn’t always result in optimal naming arrangements.

Related posts

Leave a Reply

1 comment

  1. To use a different callback for the nested headings switch the shortcode handler
    in the pricing_box callback and restore the main handler before you return
    the string.

    add_shortcode( 'pricing_box', 'shortcode_pricing_box' );
    add_shortcode( 'heading',     'shortcode_heading_main' );
    
    function shortcode_pricing_box( $atts, $content = '' )
    {
        // switch shortcode handlers
        add_shortcode( 'heading', 'shortcode_heading_pricing_box' );
    
        $out = '<div class="pricing-box">' . do_shortcode( $content ) . '</div>';
    
        // restore main handler
        add_shortcode( 'heading', 'shortcode_heading_main' );
    
        return $out;
    }
    
    function shortcode_heading_main( $atts, $content = '' )
    {
        return "<h2>$content</h2>";
    }
    
    function shortcode_heading_pricing_box( $atts, $content = '' )
    {
        return "<h3>$content</h3>";
    }