get_the_content not working within shortcode

I have an issue with a shortcode that I’m writing for wordpress. I’m trying to use the get_the_content() function but instead of pulling the contents of the custom post type I’ve created it’s pulling the contents of the page the shortcode is sitting on. Other functions are all working fine e.g. get_the_title() and get_the_post_thumbnail(). I pass the ID in the functions and it works great for everything else, just not get_the_content.

get_the_content($testimonial_item->ID);

The shortcode contains pagination and other elements which all work correctly, It’s just this one function that causing me grief. The full code is below, any help would be greatly appreciated.

function ncweb_display_testimonial_items($atts, $content = null) {

extract( shortcode_atts( array(
    'per_page' => 6
), $atts ) );

/* pagination parameters */

// check what page we are on
if ( isset ($_GET['testimonial-page'] ) ) $page = $_GET['testimonial-page']; else $page = 1;

// default number of pages
$total_pages = 1;

// portfolio offset. Used in the get_posts() query to show only portfolio for the current page
$offset = $per_page * ($page-1);

// setup the portfolio args for retrieving the total number of portfolio items
$testimonial_count_args = array(
    'post_type' => 'ncweb-testimonials',
    'posts_per_page' => -1
);
$testimonial_count = count(get_posts($testimonial_count_args));

// calculate the total number of pages
$total_pages = ceil($testimonial_count/$per_page);

/* end pagination parameters */

// main image query
$testimonial_args = array(
    'post_type' => 'ncweb-testimonials',
    'numberposts' => $per_page,
    'offset' => $offset
);

$testimonial_items = get_posts($testimonial_args);

// start our output buffer
ob_start();

if($testimonial_items) :

    /*** main portfolio loop ***/

        $counter = 1;
        echo '<div class="testimonial-items" id="testimonial-items">';

        foreach($testimonial_items as $testimonial_item) :

        $testimonial_company = get_post_meta($testimonial_item->ID, 'ncweb_testimonial_company', true);
        $testimonial_client = get_post_meta($testimonial_item->ID, 'ncweb_testimonial_client_name', true);

        echo '<aside class="testimonial-list-item row">';
        echo '<div class="col-xs-12 testimonial-list-item-info">';
        echo '<div class="testimonial-image">'. get_the_post_thumbnail($testimonial_item->ID) .'</div>';
        echo '<div class="testimonial-client"><span class="testimonial-client-name">'. $testimonial_client .'</span><br/><span class="testimonial-company">'. $testimonial_company .'</span></div>';
        echo '</div>'; //end of testimonial-list-item-info
        echo '<div class="col-xs-12 testimonial-item-content">'. get_the_content($testimonial_item->ID); .'</div>';
        echo '</aside>';

        $counter++;

        endforeach;
        echo '</div>';

        /*** display pagination ***/

        // pagination base
        echo '<div id="testimonial-pagination">';

            $base = get_permalink(get_the_ID()) . '%_%';

            echo paginate_links( array(
                'base' => $base,
                'format' => '?testimonial-page=%#%',
                'prev_text' => __('Previous', 'ncweb'),
                'next_text' => __('Next', 'ncweb'),
                'total' => $total_pages,
                'current' => $page,
                'end_size' => 1,
                'mid_size' => 5
            ));

        echo '</div>';

    /*** end pagination display ***/


else :
    echo '<p>' . __('No testimonial items found.', 'ncweb') . '</p>';
endif; // end if($images)

return ob_get_clean();

}
add_shortcode( 'testimonial-items', 'ncweb_display_testimonial_items' );

Related posts

Leave a Reply

3 comments

  1. This is because the get_the_content() function is a wrapper and it’s only arguments are the Read More text and the stripteaser argument.

    What you actually want is.

    $post= get_post($testimonial_item->ID);
    $testimonial_items = $post->content ;
    $testimonial_items = apply_filters('the_content', $testimonial_items);
    

    Then you will have what you are looking for.

  2. You can try this code to get the perfect output when using shortcode in content.

    <?php 
      ob_start();
      the_content();
      $content_output = ob_get_clean();
      echo $content_output;
    ?>
  3. Cleanest way to output the_content using a shortcode is this:

    function my_sc_content() {
        ob_start();
            $my_content = the_content();
            echo $my_content;
            $output_string = ob_get_contents();
        ob_end_clean();
        return $output_string;
    }
    
    add_shortcode('my-content','my_sc_content');