Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Output a shortcode inside an echo for wordpress

I am trying to write a shortcode that has another shortcode nested inside of it. The [map id="1"] shortcode is being generated from a different plugin but I want to have the map display when I execute this shortcode.

I don't think this is the best way to go about this but I am still new to php coding.

<?php
add_shortcode( 'single-location-info', 'single_location_info_shortcode' );
    function single_location_info_shortcode(){
        return '<div class="single-location-info">
                    <div class="one-half first">
                        <h3>Header</h3>
                        <p>Copy..............</p>
                    </div>
                    <div class="one-half">
                        <h3>Header 2</h3>
                        <p>Copy 2............</p>
                        <?php do_shortcode( '[map id="1"]' ); ?>
                    </div>
                </div>';
                }
?>

I dont think I should be trying to call php from within a return.... I though I read somewhere that I should use a "heredoc" but I have been unable to get it to work correctly.

Any thoughs?

Thanks

like image 537
William Avatar asked Dec 20 '25 21:12

William


1 Answers

Your hunch is right. Don't return a string with a php function in the middle of it. (Not very readable, and the sample code above won't work)

A heredoc won't solve this issue. While useful, heredocs really are just another way of building a string in PHP.

There are a few potential solutions.

The "PHP" solution is to use the output buffer:

ob_start
ob_get_clean

Here's your modified code that will do what you are asking:

function single_location_info_shortcode( $atts ){
    // First, start the output buffer
    ob_start();

    // Then, run the shortcode
    do_shortcode( '[map id="1"]' );
    // Next, get the contents of the shortcode into a variable
    $map = ob_get_clean();

    // Lastly, put the contents of the map shortcode into this shortcode
    return '<div class="single-location-info">
                <div class="one-half first">
                    <h3>Header</h3>
                    <p>Copy..............</p>
                </div>
                <div class="one-half">
                    <h3>Header 2</h3>
                    <p>Copy 2............</p>
                    ' . $map . '
                </div>
            </div>';
     }

Alternate Method

The "WordPress way" of doing this would be to embed the shortcode in the content string, and run it through the WordPress the_content filter function:

function single_location_info_shortcode( $atts ) {
    // By passing through the 'the_content' filter, the shortcode is actually parsed by WordPress
    return apply_filters( 'the_content' , '<div class="single-location-info">
                <div class="one-half first">
                    <h3>Header</h3>
                    <p>Copy..............</p>
                </div>
                <div class="one-half">
                    <h3>Header 2</h3>
                    <p>Copy 2............</p>
                    [map id="1"]
                </div>
            </div>' );
     }
like image 144
random_user_name Avatar answered Dec 23 '25 09:12

random_user_name