Question

I've created a custom post type called sermons and added a meta box to this post type to insert a MP3 URL for each post. The MP3 URL works/displays fine on my sermons page template but the player does not appear when I create a shortcode for Recent Sermons in my functions file. All of the other elements appear in the loop (title, featured image, date) but no audio player.

add_shortcode( 'recent_sermons', 'recent_sermons' );

function recent_sermons( $atts ) {
    ob_start();
    // define attributes and their defaults
    extract( shortcode_atts( array (
        'posts' => 8,
    ), $atts ) );

    // define query parameters based on attributes
    $options = array(
        'posts_per_page' => $posts,
        'post_type' => 'sermons',
    );
    $query = new WP_Query( $options );
    // run the loop based on the query

    if ( $query->have_posts() ) { ?>
<div class="my-sermon-loop">
<?php while ( $query->have_posts() ) : $query->the_post(); ?>
<div class="sermon rec-post-wrap">
        <div class="sermon-post">
            <div class="float-lft">
            <h2><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php printf(__('%s', 'everypraise'), the_title_attribute('echo=0')); ?>"><?php the_title(); ?></a></h2>
                <div class="loop-post-meta">
                    <ul>
                        <li class="date"><?php the_time(__('F jS, Y', 'everypraise')) ?></li>
                    </ul>
                </div>
            </div>
            <div class="float-rt"> <a href="<?php the_permalink() ?>" rel="bookmark" title="<?php printf(__('%s', 'everypraise'), the_title_attribute('echo=0')); ?>"><?php the_post_thumbnail( 'sermons-thumb' ); ?></a> </div>
            <div class="cleared"></div>
                <div class="sermon-audio">
<?php echo apply_filters('the_content', get_post_meta($post->ID, 'wpshed_textfield', true)); ?>
                </div>
        </div>
    </div>
            <?php endwhile;
            wp_reset_postdata(); ?>
</div>
<?php $myvariable = ob_get_clean();
    return $myvariable;
    }
}
Was it helpful?

Solution

The following will work inside the Output Buffer (ob_* functions). The global $post is just for testing, in your code it's defined in the loop.

add_shortcode( 'test-wp-embed', function( $atts, $content )
{
    global $post, $wp_embed;
    ob_start();
    $mp3 = get_post_meta( $post->ID, 'wpshed_textfield', true );
    echo do_shortcode( $wp_embed->autoembed( $mp3 ) );
    $myvariable = ob_get_clean();
    return $myvariable;
});

But I'd suggest changing your code to use get_posts instead of WP_Query. In that case and without the output buffering, this works:

add_shortcode( 'test-wp-oembed', function( $atts, $content )
{
    global $post;
    $mp3 = apply_filters( 'the_content', get_post_meta($post->ID, 'wpshed_textfield', true ) );
    return $mp3;
});
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top