/** * Returns the content of a Doc * * We need to use this special function, because the BP theme compat * layer messes with the filters on the_content, and we can't rely on * using that theme function within the context of a Doc * * @since 1.3 * * @return string $content */ function bp_docs_get_the_content() { if (function_exists('bp_restore_all_filters')) { bp_restore_all_filters('the_content'); } $content = apply_filters('the_content', get_queried_object()->post_content); if (function_exists('bp_remove_all_filters')) { bp_remove_all_filters('the_content'); } return apply_filters('bp_docs_get_the_content', $content); }
/** * Outputs the first embedded item in the activity oEmbed template. * * @since 2.6.0 */ function bp_activity_embed_media() { // Bail if oEmbed request explicitly hides media. if (isset($_GET['hide_media']) && true == wp_validate_boolean($_GET['hide_media'])) { /** * Do something after media is rendered for an activity oEmbed item. * * @since 2.6.0 */ do_action('bp_activity_embed_after_media'); return; } /** * Should we display media in the oEmbed template? * * @since 2.6.0 * * @param bool $retval Defaults to true. */ $allow_media = apply_filters('bp_activity_embed_display_media', true); // Find oEmbeds from only WP registered providers. bp_remove_all_filters('oembed_providers'); $media = bp_core_extract_media_from_content($GLOBALS['activities_template']->activity->content, 'embeds'); bp_restore_all_filters('oembed_providers'); // oEmbeds have precedence over inline video / audio. if (isset($media['embeds']) && true === $allow_media) { // Autoembed first URL. $oembed_defaults = wp_embed_defaults(); $oembed_args = array('width' => $oembed_defaults['width'], 'height' => $oembed_defaults['height'], 'discover' => true); $url = $media['embeds'][0]['url']; $cachekey = '_oembed_response_' . md5($url . serialize($oembed_args)); // Try to fetch oEmbed response from meta. $oembed = bp_activity_get_meta(bp_get_activity_id(), $cachekey); // No cache, so fetch full oEmbed response now! if ('' === $oembed) { $o = _wp_oembed_get_object(); $oembed = $o->fetch($o->get_provider($url, $oembed_args), $url, $oembed_args); // Cache oEmbed response. bp_activity_update_meta(bp_get_activity_id(), $cachekey, $oembed); } $content = ''; /** * Filters the default embed display max width. * * This is used if the oEmbed response does not return a thumbnail width. * * @since 2.6.0 * * @param int $width. */ $width = (int) apply_filters('bp_activity_embed_display_media_width', 550); // Set thumbnail. if ('photo' === $oembed->type) { $thumbnail = $oembed->url; } elseif (isset($oembed->thumbnail_url)) { $thumbnail = $oembed->thumbnail_url; /* Non-oEmbed standard attributes */ // Mixcloud } elseif (isset($oembed->image)) { $thumbnail = $oembed->image; // ReverbNation } elseif (isset($oembed->{'thumbnail-url'})) { $thumbnail = $oembed->{'thumbnail-url'}; } // Display thumb and related oEmbed meta. if (true === isset($thumbnail)) { $play_icon = $caption = ''; // Add play icon for non-photos. if ('photo' !== $oembed->type) { /** * ion-play icon from Ionicons. * * @link http://ionicons.com/ * @license MIT */ $play_icon = <<<EOD <svg id="Layer_1" style="enable-background:new 0 0 512 512;" version="1.1" viewBox="0 0 512 512" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M405.2,232.9L126.8,67.2c-3.4-2-6.9-3.2-10.9-3.2c-10.9,0-19.8,9-19.8,20H96v344h0.1c0,11,8.9,20,19.8,20 c4.1,0,7.5-1.4,11.2-3.4l278.1-165.5c6.6-5.5,10.8-13.8,10.8-23.1C416,246.7,411.8,238.5,405.2,232.9z"/></svg> EOD; $play_icon = sprintf('<a rel="nofollow" class="play-btn" href="%1$s" onclick="top.location.href=\'%1$s\'">%2$s</a>', esc_url($url), $play_icon); } // Thumb width $thumb_width = isset($oembed->thumbnail_width) && 'photo' !== $oembed->type && (int) $oembed->thumbnail_width < 550 ? (int) $oembed->thumbnail_width : $width; $float_width = 350; // Set up thumb. $content = sprintf('<div class="thumb" style="max-width:%1$spx">%2$s<a href="%3$s" rel="nofollow" onclick="top.location.href=\'%3$s\'"><img src="%4$s" /></a></div>', $thumb_width, $play_icon, esc_url($url), esc_url($thumbnail)); // Show title. if (isset($oembed->title)) { $caption .= sprintf('<p class="caption-title"><strong>%s</strong></p>', apply_filters('single_post_title', $oembed->title)); } // Show description (non-oEmbed standard) if (isset($oembed->description)) { $caption .= sprintf('<div class="caption-description">%s</div>', apply_filters('bp_activity_get_embed_excerpt', $oembed->description)); } // Show author info. if (isset($oembed->provider_name) && isset($oembed->author_name)) { /* translators: By [oEmbed author] on [oEmbed provider]. eg. By BuddyPress on YouTube. */ $anchor_text = sprintf(__('By %1$s on %2$s', 'buddypress'), $oembed->author_name, $oembed->provider_name); } elseif (isset($oembed->provider_name)) { $anchor_text = sprintf(__('View on %s', 'buddypress'), $oembed->provider_name); } if (true === isset($anchor_text)) { $caption .= sprintf('<a rel="nofollow" href="%1$s" onclick="top.location.href=\'%1$s\'">%2$s</a>', esc_url($url), apply_filters('the_title', $anchor_text)); } // Set up caption. if ('' !== $caption) { $css_class = isset($oembed->provider_name) ? sprintf(' provider-%s', sanitize_html_class(strtolower($oembed->provider_name))) : ''; $caption = sprintf('<div class="caption%1$s" style="width:%2$s">%3$s</div>', $css_class, $thumb_width > $float_width ? 100 . '%' : round(($width - (int) $thumb_width) / $width * 100) . '%', $caption); $content .= $caption; } } // Print rich content. if ('' !== $content) { printf('<div class="bp-activity-embed-display-media %s" style="max-width:%spx">%s</div>', $thumb_width < $float_width ? 'two-col' : 'one-col', $thumb_width < $float_width ? $width : $thumb_width, $content); } // Video / audio. } elseif (true === $allow_media) { // Call BP_Embed if it hasn't already loaded. bp_embed_init(); // Run shortcode and embed routine. $content = buddypress()->embed->run_shortcode($GLOBALS['activities_template']->activity->content); $content = buddypress()->embed->autoembed($content); // Try to find inline video / audio. $media = bp_core_extract_media_from_content($content, 96); // Video takes precedence. HTML5-only. if (isset($media['videos']) && 'shortcodes' === $media['videos'][0]['source']) { printf('<video controls preload="metadata"><source src="%1$s"><p>%2$s</p></video>', esc_url($media['videos'][0]['url']), esc_html__('Your browser does not support HTML5 video', 'buddypress')); // No video? Try audio. HTML5-only. } elseif (isset($media['audio']) && 'shortcodes' === $media['audio'][0]['source']) { printf('<audio controls preload="metadata"><source src="%1$s"><p>%2$s</p></audio>', esc_url($media['audio'][0]['url']), esc_html__('Your browser does not support HTML5 audio', 'buddypress')); } } /** This hook is documented in /bp-activity/bp-activity-embeds.php */ do_action('bp_activity_embed_after_media'); }