Introduction
Background: EPiServer is the CMS for the Norwegian Government main site, www.regjeringen.no and we use WordPress for more ad hoc sites.
Task: Based on the design guide for regjeringen.no, add 23 video to WordPress.
23 video supports oembed, so adding it is easy
<?php // replace NAME with your 23 video site name wp_oembed_add_provider( 'https://NAME.23video.com/*', 'https://NAME.23video.com/oembed' );
and adding a video gave me this
which is not per the design guide.
Modifying the HTML
Please see inline comments. If something is unclear, ask.
/** * Rewrite the oEmbed HTML * * @param string $output The returned oEmbed HTML * @param object $data A data object result from an oEmbed provider * @param string $url The URL of the content to be embedded. * @return string The modified HTML */ function nettv_embed_filter( $output, $data, $url ) { /** * We have two sites, one for video and one for live streaming, is this oEmbed one of those? */ if ( false !== strstr( $url,'SITE01.23video.com' ) || false !== strstr( $url,'SITE01.23video.com' ) ) { if ( false !== strstr( $url,'SITE01' ) ) { $video_host = 'SITE01.23video.com'; } else { $video_host = 'SITE02.23video.com'; } /** * Video and Live have different URLs */ if (isset($data->photo_id)) { $photo_id = $data->photo_id; $nettv_url = "//%s/v.ihtml/player.html?source=share&photo_id=%s&autoPlay=0"; } elseif (isset($data->live_id)) { $photo_id = $data->live_id; $nettv_url = "//%s/v.ihtml/player.html?live_id=%s&source=site&autoPlay=1"; } else { //Something went wrong, return the URL to the video. return sprintf('<a href="%s">%s</a>', esc_url($output), esc_url($output)); } /** * Create the HTML. I use the <div class="webBroadcastBlock"></div><!--/webBroadcastBlock--> wrapper for my custom autop function. * @var string */ $output = sprintf('<div class="webBroadcastBlock"><h2><span class="media-banner"><span class="media-banner-nett-tv">Nett-tv</span><span class="media-banner-archived"></span></span>%1$s</h2><a href="%2$s" data-lightbox-opener="nett-tv" data-lightbox-title="%3$s" data-lightbox-closetxt="%4$s" data-lightbox-labeltxt="Nett-tv" data-lightbox-label-status=""><img src="%5$s" alt="%6$s" /><p>%7$s</p></a></div><!--/webBroadcastBlock-->', trim($data->title), sprintf($nettv_url,$video_host, $photo_id), trim($data->title), __('Close','dss-web'), $data->thumbnail_url, __('View','dss-web'), __('View','dss-web') ); } return $output; }
wpautop
wpautop is a pain and it messed up my modified oembed HTML code. I "solved" (if you have a better soultion, please tell me) the problem by writing a custom wpautop that autopees everything except my code.
First, disable the default wpautop
remove_filter('the_content', 'wpautop'); remove_filter('the_content', 'wptexturize')
Then add the custom wpautop
function nettv_no_autop($content) { $new_content = ''; $pattern_full = '{(<div class="webBroadcastBlock">.*?</div><!--/webBroadcastBlock-->)}is'; $pattern_contents = '{(<div class="webBroadcastBlock">(.*?)</div><!--/webBroadcastBlock-->)}is'; $pieces = preg_split($pattern_full, $content, -1, PREG_SPLIT_DELIM_CAPTURE); foreach ($pieces as $piece) { /** * If the pattern matches, it's my custom HTML code. Return the HTML without passing it throug wpautop. */ if (preg_match($pattern_contents, $piece, $matches)) { $new_content .= $matches[1]; } else { $new_content .= wptexturize(wpautop($piece)); } } return $new_content; } add_filter('the_content', 'nettv_no_autop', 99);
Result
(click the image to see an animation)