WordPress.org

Make WordPress Core

Ticket #10337: 10337.workinprogress.4.patch

File 10337.workinprogress.4.patch, 23.1 KB (added by Viper007Bond, 9 years ago)

Nearing initial commit worthy

  • wp-admin/admin-ajax.php

     
    111111
    112112        die('0');
    113113        break;
     114case 'oembed-cache' :
     115        $return = ( $wp_embed->cache_oembed( $_GET['post'] ) ) ? '1' : '0';
     116        die($return);
     117        break;
    114118default :
    115119        do_action( 'wp_ajax_' . $_GET['action'] );
    116120        die('0');
  • wp-admin/includes/schema.php

     
    305305        'widget_rss' => array(),
    306306
    307307        // 2.8
    308         'timezone_string' => ''
     308        'timezone_string' => '',
     309
     310        // 2.9
     311        'embed_autourls' => 0,
     312        'embed_size_w' => '',
     313        'embed_size_h' => 600,
    309314        );
    310315
    311316        // Set autoload to no for these options
  • wp-admin/options-media.php

     
    4444
    4545<tr valign="top">
    4646<th scope="row"><?php _e('Medium size') ?></th>
    47 <td><fieldset><legend class="screen-reader-text"><span><?php _e('Medium size') ?></span></legend>
     47<td><fieldset><legend class="screen-reader-text"><span><?php _e('Medium size'); ?></span></legend>
    4848<label for="medium_size_w"><?php _e('Max Width'); ?></label>
    4949<input name="medium_size_w" type="text" id="medium_size_w" value="<?php form_option('medium_size_w'); ?>" class="small-text" />
    5050<label for="medium_size_h"><?php _e('Max Height'); ?></label>
     
    5454
    5555<tr valign="top">
    5656<th scope="row"><?php _e('Large size') ?></th>
    57 <td><fieldset><legend class="screen-reader-text"><span><?php _e('Large size') ?></span></legend>
     57<td><fieldset><legend class="screen-reader-text"><span><?php _e('Large size'); ?></span></legend>
    5858<label for="large_size_w"><?php _e('Max Width'); ?></label>
    5959<input name="large_size_w" type="text" id="large_size_w" value="<?php form_option('large_size_w'); ?>" class="small-text" />
    6060<label for="large_size_h"><?php _e('Max Height'); ?></label>
     
    6565<?php do_settings_fields('media', 'default'); ?>
    6666</table>
    6767
     68<h3><?php _e('Embeds') ?></h3>
     69
     70<table class="form-table">
     71<tr valign="top">
     72<th scope="row"><?php _e('Auto-embeds'); ?></th>
     73<td><fieldset><legend class="screen-reader-text"><span><?php _e('Attempt to automatically embed all URLs'); ?></span></legend>
     74<label for="embed_autourls"><input name="embed_autourls" type="checkbox" id="embed_autourls" value="1" <?php checked( '1', get_option('embed_autourls') ); ?>/> <?php _e('Attempt to automatically embed all unlinked URLs'); ?></label>
     75</fieldset></td>
     76</tr>
     77
     78<tr valign="top">
     79<th scope="row"><?php _e('Embed size'); ?></th>
     80<td><fieldset><legend class="screen-reader-text"><span><?php _e('Embed size'); ?></span></legend>
     81<label for="embed_size_w"><?php _e('Max Width'); ?></label>
     82<input name="embed_size_w" type="text" id="embed_size_w" value="<?php
     83        $width = get_option('embed_size_w');
     84        if ( empty($width) ) {
     85                $width = $content_width;
     86        }
     87        echo esc_attr($width);
     88?>" class="small-text" />
     89<label for="embed_size_h"><?php _e('Max Height'); ?></label>
     90<input name="embed_size_h" type="text" id="embed_size_h" value="<?php form_option('embed_size_h'); ?>" class="small-text" />
     91</fieldset></td>
     92</tr>
     93
     94<?php do_settings_fields('media', 'embeds'); ?>
     95</table>
     96
    6897<?php do_settings_sections('media'); ?>
    6998
    7099<p class="submit">
  • wp-admin/options.php

     
    2525        'general' => array( 'blogname', 'blogdescription', 'admin_email', 'users_can_register', 'gmt_offset', 'date_format', 'time_format', 'start_of_week', 'default_role', 'timezone_string' ),
    2626        'discussion' => array( 'default_pingback_flag', 'default_ping_status', 'default_comment_status', 'comments_notify', 'moderation_notify', 'comment_moderation', 'require_name_email', 'comment_whitelist', 'comment_max_links', 'moderation_keys', 'blacklist_keys', 'show_avatars', 'avatar_rating', 'avatar_default', 'close_comments_for_old_posts', 'close_comments_days_old', 'thread_comments', 'thread_comments_depth', 'page_comments', 'comments_per_page', 'default_comments_page', 'comment_order', 'comment_registration' ),
    2727        'misc' => array( 'use_linksupdate', 'uploads_use_yearmonth_folders', 'upload_path', 'upload_url_path' ),
    28         'media' => array( 'thumbnail_size_w', 'thumbnail_size_h', 'thumbnail_crop', 'medium_size_w', 'medium_size_h', 'large_size_w', 'large_size_h', 'image_default_size', 'image_default_align', 'image_default_link_type' ),
     28        'media' => array( 'thumbnail_size_w', 'thumbnail_size_h', 'thumbnail_crop', 'medium_size_w', 'medium_size_h', 'large_size_w', 'large_size_h', 'image_default_size', 'image_default_align', 'image_default_link_type', 'embed_autourls', 'embed_size_w', 'embed_size_h' ),
    2929        'privacy' => array( 'blog_public' ),
    3030        'reading' => array( 'posts_per_page', 'posts_per_rss', 'rss_use_excerpt', 'blog_charset', 'show_on_front', 'page_on_front', 'page_for_posts' ),
    3131        'writing' => array( 'default_post_edit_rows', 'use_smilies', 'ping_sites', 'mailserver_url', 'mailserver_port', 'mailserver_login', 'mailserver_pass', 'default_category', 'default_email_category', 'use_balanceTags', 'default_link_category', 'enable_app', 'enable_xmlrpc' ),
  • wp-includes/class-oembed.php

     
     1<?php
     2
     3class WP_oEmbed {
     4        var $providers = array();
     5
     6        function WP_oEmbed() {
     7                return $this->__construct();
     8        }
     9
     10        function __construct() {
     11                // List out some popular sites, mainly ones that don't have discovery tags in their <head>
     12                $this->providers = apply_filters( 'oembed_providers', array(
     13                        'http://*.flickr.com/*'       => 'http://www.flickr.com/services/oembed/',
     14                        'http://*.viddler.com/*'      => 'http://lab.viddler.com/services/oembed/',
     15                        'http://qik.com/*'            => 'http://qik.com/api/oembed.{format}',
     16                        'http://*.revision3.com/*'    => 'http://revision3.com/api/oembed/',
     17                        'http://www.hulu.com/watch/*' => 'http://www.hulu.com/api/oembed.{format}',
     18                        //'http://www.vimeo.com/*'      => 'http://www.vimeo.com/api/oembed.{format}', // Discovery tag supported, leave it commented to use as a discovery test
     19
     20                        //'http://*.youtube.com/watch*' => 'http://oohembed.com/oohembed/',
     21                ) );
     22        }
     23
     24        // Pass a URL, returns false or HTML result
     25        function getHTML( $url, $args = '' ) {
     26                $provider = false;
     27
     28                foreach ( $this->providers as $scheme => $providerurl ) { // Needs a better variable name
     29
     30                        // Turn the asterisk-type provider URLs into regex
     31                        $regex = '#' . str_replace( '___wildcard___', '(.+)', preg_quote( str_replace( '*', '___wildcard___', $scheme ) ) ) . '#i';
     32
     33                        if ( preg_match( $regex, $url ) ) {
     34                                $provider = str_replace( '{format}', 'json', $providerurl ); // JSON is easier to deal with than XML
     35                                break;
     36                        }
     37                }
     38
     39                if ( !$provider )
     40                        $provider = $this->discover( $url );
     41
     42                if ( !$provider || false === $data = $this->fetch( $provider, $url, $args ) )
     43                        return false;
     44
     45                return apply_filters( 'oembed_output', $this->data2html( $data, $url ), $url, $args );
     46        }
     47
     48        // Pass a URL, returns the oEmbed provider URL(s) if it can find them in the <head>
     49        function discover( $url ) {
     50                $providers = array();
     51
     52                // Fetch URL content
     53                if ( $html = wp_remote_retrieve_body( wp_remote_get( $url ) ) ) {
     54
     55                        // <link> types that contain oEmbed provider URLs
     56                        $linktypes = apply_filters( 'oembed_linktypes', array(
     57                                'application/json+oembed' => 'json',
     58                                'text/xml+oembed' => 'xml',
     59                                'application/xml+oembed' => 'xml', // Incorrect, but used by at least Vimeo
     60                        ) );
     61
     62                        // Strip <body>
     63                        $html = substr( $html, 0, stripos( $html, '</head>' ) );
     64
     65                        // Do a quick check
     66                        $tagfound = false;
     67                        foreach ( $linktypes as $linktype => $format ) {
     68                                if ( stripos($html, $linktype) ) {
     69                                        $tagfound = true;
     70                                        break;
     71                                }
     72                        }
     73
     74                        if ( $tagfound && preg_match_all( '/<link([^<>]+)>/i', $html, $links ) ) {
     75                                foreach ( $links[1] as $link ) {
     76                                        $atts = shortcode_parse_atts( $link );
     77
     78                                        if ( !empty($atts['type']) && !empty($linktypes[$atts['type']]) && !empty($atts['href']) ) {
     79                                                $providers[$linktypes[$atts['type']]] = $atts['href'];
     80
     81                                                // Stop here if it's JSON (that's all we need)
     82                                                if ( 'json' == $linktypes[$atts['type']] )
     83                                                        break;
     84                                        }
     85                                }
     86                        }
     87                }
     88
     89                // JSON is preferred to XML
     90                if ( !empty($providers['json']) )
     91                        return $providers['json'];
     92                elseif ( !empty($providers['xml']) )
     93                        return $providers['xml'];
     94                else
     95                        return false;
     96        }
     97
     98        // Connects to an oEmbed provider and returns the result
     99        function fetch( $provider, $url, $args = '' ) {
     100                $args = wp_parse_args( $args, wp_embed_defaults() );
     101
     102                $provider = add_query_arg( 'format', 'json', $provider ); // JSON is easier to deal with than XML
     103
     104                $provider = add_query_arg( 'maxwidth', $args['width'], $provider );
     105                $provider = add_query_arg( 'maxheight', $args['height'], $provider );
     106                $provider = add_query_arg( 'url', urlencode($url), $provider );
     107
     108                if ( !$result = wp_remote_retrieve_body( wp_remote_get( $provider ) ) )
     109                        return false;
     110
     111                $data = false;
     112
     113                // JSON?
     114                // Example: http://vimeo.com/api/oembed.json?url=http%3A%2F%2Fvimeo.com%2F240975
     115                if ( $data = json_decode($result) ) {
     116                        return $data;
     117                }
     118
     119                // Must be XML. Start out with the super-easy PHP5 functions.
     120                // Example: http://vimeo.com/api/oembed.xml?url=http%3A%2F%2Fvimeo.com%2F240975
     121                elseif ( function_exists('simplexml_load_string') ) {
     122                        libxml_use_internal_errors('true');
     123
     124                        $data = simplexml_load_string($result);
     125
     126                        if ( is_object($data) )
     127                                return $data;
     128                }
     129
     130                // Still must be XML, but no PHP5 support. Use PHP4 (ugh).
     131                // Example: http://vimeo.com/api/oembed.xml?url=http%3A%2F%2Fvimeo.com%2F240975
     132                else {
     133                        // Code me!
     134                }
     135
     136                return false;
     137        }
     138
     139        // Takes a data set and returns the HTML
     140        function data2html( $data, $url ) {
     141                if ( !is_object($data) || empty($data->type) )
     142                        return false;
     143
     144                switch ( $data->type ) {
     145                        case 'photo':
     146                                if ( empty($data->url) || empty($data->width) || empty($data->height) )
     147                                        return false;
     148
     149                                $title = ( !empty($data->title) ) ? $data->title : '';
     150                                return '<img src="' . esc_attr( clean_url( $data->url ) ) . '" alt="' . esc_attr($title) . '" width="' . esc_attr($data->width) . '" height="' . esc_attr($data->height) . '" />';
     151
     152                        case 'video':
     153                        case 'rich':
     154                                if ( is_feed() )
     155                                        return 'CODE ME';
     156                                else
     157                                        return ( !empty($data->html) ) ? $data->html : false;
     158
     159                        case 'link':
     160                                return ( !empty($data->title) ) ? '<a href="' . clean_url($url) . '">' . esc_html($data->title) . '</a>' : false;
     161                }
     162
     163                return false;
     164        }
     165}
     166
     167function &_wp_oembed_get_object() {
     168        static $oembed;
     169
     170        if ( is_null($oembed) )
     171                $oembed = new WP_oEmbed();
     172
     173        return $oembed;
     174}
  • wp-includes/formatting.php

     
    12671267        return $ret;
    12681268}
    12691269
     1270function make_link($url) {
     1271        return apply_filters( 'make_link', '<a href="' . esc_attr($url) . '">' . esc_html($url) . '</a>' );
     1272}
     1273
    12701274/**
    12711275 * Adds rel nofollow string to all HTML A elements in content.
    12721276 *
     
    23522356                case 'medium_size_h':
    23532357                case 'large_size_w':
    23542358                case 'large_size_h':
     2359                case 'embed_size_w':
     2360                case 'embed_size_h':
    23552361                case 'default_post_edit_rows':
    23562362                case 'mailserver_port':
    23572363                case 'comment_max_links':
  • wp-includes/media.php

     
    933933
    934934        return false;
    935935}
     936
     937
     938
     939
     940
     941
     942/*
     943
     944        TODO:
     945
     946        * oEmbed PHP4 XML
     947        * Videos in feeds? It's currently just a link (handlers manually; WP_Embed class aborts before oEmbed)
     948        * Phpdoc
     949        * Auto-embed: Fix aggressive auto-embedding for all URLS. For example, it catches the click text of this: <a href="#">http://google.com/</a>  It should ignore inside <a>'s
     950        * Auto-embed: Ignore inside shortcodes, i.e. don't catch this: [tag]http://google.com/[/tag]
     951        * Add more default handlers (WP.com ones perhaps?)
     952        * Should the stuff be wrapped in a div/span for styling purposes? Maybe a filter can do this?
     953        * Add a bunch more filters (oEmbed output, handler outputs, etc.)
     954
     955*/
     956
     957
     958// Embed class
     959class WP_Embed {
     960        var $handlers = array();
     961        var $post_ID;
     962        var $usecache = true;
     963        var $linkifunknown = true;
     964
     965        // PHP4 constructor
     966        function WP_Embed() {
     967                return $this->__construct();
     968        }
     969
     970        // PHP5 constructor
     971        function __construct() {
     972                // After a post is saved, cache oEmbed items via AJAX
     973                add_action( 'edit_form_advanced', array(&$this, 'maybe_run_ajax_cache') );
     974
     975                // Hack to get the [embed] shortcode to run before wpautop()
     976                add_filter( 'the_content', array(&$this, 'runshortcode'), 9 );
     977
     978                // Per Matt's idea, this attempts to embed all URLs in a post
     979                // It's a bit buggy, see comments on WP_Embed::autoembed()
     980                if ( get_option('embed_autourls') )
     981                        add_filter( 'the_content', array(&$this, 'autoembed'), 9 );
     982        }
     983
     984        // Run do_shortcode() with only the [embed] shortcode active
     985        // This is so it can be run earlier than normal
     986        function runshortcode( $content ) {
     987                global $shortcode_tags;
     988
     989                // Backup current registered shortcodes and clear them all out
     990                $orig_shortcode_tags = $shortcode_tags;
     991                remove_all_shortcodes();
     992
     993                add_shortcode( 'embed', array(&$this, 'shortcode') );
     994
     995                // Do the shortcode (only the [embed] one is registered)
     996                $content = do_shortcode( $content );
     997
     998                // Put the original shortcodes back
     999                $shortcode_tags = $orig_shortcode_tags;
     1000
     1001                return $content;
     1002        }
     1003
     1004        // If a post was saved, then cache oEmbed results via AJAX
     1005        function maybe_run_ajax_cache() {
     1006                global $post_ID;
     1007
     1008                if ( empty($post_ID) || empty($_GET['message']) || 1 != $_GET['message'] )
     1009                        return;
     1010
     1011?>
     1012<script type="text/javascript">
     1013/* <![CDATA[ */
     1014        jQuery(document).ready(function($){
     1015                $.get("<?php echo admin_url( 'admin-ajax.php?action=oembed-cache&post=' . $post_ID ); ?>");
     1016        });
     1017/* ]]> */
     1018</script>
     1019<?php
     1020        }
     1021
     1022        // Register a handler for WP_Embed::shortcode()
     1023        // wp_embed_register_handler() is a wrapper for this, so call that instead
     1024        function register_handler( $id, $regex, $callback, $priority = 10 ) {
     1025                $this->handlers[$priority][$id] = array(
     1026                        'regex'    => $regex,
     1027                        'callback' => $callback,
     1028                );
     1029        }
     1030
     1031        // wp_embed_unregister_handler() is a wrapper for this, so call that instead
     1032        function unregister_handler( $id, $priority = 10 ) {
     1033                if ( isset($this->handlers[$priority][$id]) )
     1034                        unset($this->handlers[$priority][$id]);
     1035        }
     1036
     1037        // [embed] handler
     1038        function shortcode( $attr, $url = '' ) {
     1039                global $post, $_wp_using_ext_object_cache;
     1040
     1041                $rawattr = $attr;
     1042                $attr = wp_parse_args( $attr, wp_embed_defaults() );
     1043
     1044                // Look for known internal handlers
     1045                ksort( $this->handlers );
     1046                foreach ( $this->handlers as $priority => $handlers ) {
     1047                        foreach ( $handlers as $id => $handler ) {
     1048                                if ( preg_match( $handler['regex'], $url, $matches ) && is_callable( $handler['callback'] ) ) {
     1049                                        return call_user_func( $handler['callback'], $matches, $attr, $url, $rawattr );
     1050                                }
     1051                        }
     1052                }
     1053
     1054                if ( empty($url) )
     1055                        return '';
     1056
     1057                if ( is_feed() )
     1058                        return $this->make_link( $url );
     1059
     1060                // Unknown URL format. Let oEmbed have a go.
     1061                if ( current_user_can('unfiltered_html') ) {
     1062                        $post_ID = ( !empty($post->ID) ) ? $post->ID : null;
     1063                        if ( !empty($this->post_ID) ) // Potentially set by WP_Embed::cache_oembed()
     1064                                $post_ID = $this->post_ID;
     1065
     1066                        // Check for a cached result (stored in the post meta)
     1067                        if ( $post_ID ) {
     1068                                $cachekey = '_oembed_' . md5( $url . implode( '|', $attr ) );
     1069
     1070                                if ( $this->usecache ) {
     1071
     1072                                        $cache = ( $_wp_using_ext_object_cache ) ? wp_cache_get( "{$post_ID}_{$cachekey}", 'oembed' ) : get_post_meta( $post_ID, $cachekey, true );
     1073
     1074                                        // Failures are cached
     1075                                        if ( '{{unknown}}' === $cache )
     1076                                                return $this->make_link( $url );
     1077
     1078                                        if ( !empty($cache) )
     1079                                                return $cache;
     1080                                }
     1081                        }
     1082
     1083                        $html = wp_oembed_get( $url, $attr );
     1084
     1085                        // Cache the result
     1086                        if ( $post_ID ) {
     1087                                $cache = ( $html ) ? $html : '{{unknown}}';
     1088
     1089                                if ( $_wp_using_ext_object_cache )
     1090                                        wp_cache_set( "{$post_ID}_{$cachekey}", $cache, 'oembed' );
     1091                                else
     1092                                        update_post_meta( $post_ID, $cachekey, $cache );
     1093                        }
     1094
     1095                        if ( $html )
     1096                                return $html;
     1097                }
     1098
     1099                // Still unknown
     1100                return $this->make_link( $url );
     1101        }
     1102
     1103        // Cache all oEmbed results for the given post ID to it's post meta
     1104        function cache_oembed( $post_ID ) {
     1105                $post = get_post( $post_ID );
     1106
     1107                // post_type check is incase of "save_post" usage
     1108                if ( empty($post->ID) || !in_array( $post->post_type, array( 'post', 'page' ) ) )
     1109                        return;
     1110
     1111                // Dump existing caches
     1112                $post_metas = get_post_custom_keys( $post->ID );
     1113                foreach( $post_metas as $post_meta_key ) {
     1114                        if ( '_oembed_' == substr( $post_meta_key, 0, 8 ) )
     1115                                delete_post_meta( $post->ID, $post_meta_key );
     1116                }
     1117
     1118                // Trigger a caching
     1119                if ( !empty($post->post_content) ) {
     1120                        $this->post_ID = $post->ID;
     1121                        $this->usecache = false;
     1122
     1123                        $content = $this->runshortcode( $post->post_content );
     1124                        if ( get_option('embed_autourls') )
     1125                                $this->autoembed( $content );
     1126
     1127                        $this->usecache = true;
     1128                }
     1129        }
     1130
     1131        // Helper function that makes a HTML link to the passed URL
     1132        function make_link( $url ) {
     1133                return ( $this->linkifunknown ) ? make_link($url) : $url;
     1134        }
     1135
     1136        // With help from WP_Emebed::_autoembed(), this attempts to convert all URLs in a post into embeds
     1137        // This incorrectly turns links where the clickable text is a URL into an embed
     1138        // For example, it incorectly processes this: <a href="#">http://example.com/</a>
     1139        function autoembed( $content ) {
     1140                // Stolen from make_clickable()
     1141                $content = ' ' . $content;
     1142                $content = preg_replace_callback( '#(?<=[\s>])(\()?([\w]+?://(?:[\w\\x80-\\xff\#$%&~/\-=?@\[\](+]|[.,;:](?![\s<])|(?(1)\)(?![\s<])|\)))+)#is',  array(&$this, '_autoembed'), $content );
     1143                return trim( $content );
     1144        }
     1145
     1146        // A helper function for WP_Embed::autoembed() that converts a URL into an embed
     1147        function _autoembed( $match ) {
     1148                $this->linkifunknown = false;
     1149                $return = $this->shortcode( array(), $match[2] );
     1150                $this->linkifunknown = true;
     1151                return $return;
     1152        }
     1153}
     1154$wp_embed = new WP_Embed();
     1155
     1156
     1157// Wrapper to register a new hander for a URL format inside [embed]
     1158function wp_embed_register_handler( $id, $regex, $callback, $priority = 10 ) {
     1159        global $wp_embed;
     1160        return $wp_embed->register_handler( $id, $regex, $callback, $priority );
     1161}
     1162
     1163// Wrapper to unregister a new hander for a URL format inside [embed]
     1164function wp_embed_unregister_handler( $id, $priority = 10 ) {
     1165        global $wp_embed;
     1166        return $wp_embed->unregister_handler( $id, $priority );
     1167}
     1168
     1169// A helper function to return some default attributes for embeds
     1170function wp_embed_defaults() {
     1171        if ( !empty($GLOBALS['content_width']) )
     1172                $theme_width = (int) $GLOBALS['content_width'];
     1173
     1174        if ( !($width = get_option('embed_size_w')) && !empty($theme_width) )
     1175                $width = $theme_width;
     1176
     1177        if ( !$width )
     1178                $width = 500;
     1179
     1180        return apply_filters( 'embed_defaults', array(
     1181                'width' => $width,
     1182                'height' => 700,
     1183        ) );
     1184}
     1185
     1186// Based on a supplied width/height ratio, return the biggest possible dimensions based on the max width/height
     1187function wp_embed_calcdims( $example_width, $example_height, $max_width, $max_height ) {
     1188        return wp_constrain_dimensions( $example_width * 1000000, $example_height * 1000000, $max_width, $max_height );
     1189}
     1190
     1191// Wrapper to load the WP_oEmbed class and use it to get some HTML
     1192function wp_oembed_get( $url, $args = '' ) {
     1193        require_once( 'class-oembed.php' );
     1194        $oembed_object = _wp_oembed_get_object();
     1195        return $oembed_object->getHTML( $url, $args );
     1196}
     1197
     1198
     1199// YouTube doesn't support oEmbed, so handle it internally
     1200wp_embed_register_handler( 'youtube', '#http://(www.youtube|youtube|[A-Za-z]{2}.youtube)\.com/(watch\?v=|w/\?v=|\?v=)([\w-]+)(.*?)#i', 'wp_embed_handler_youtube' );
     1201function wp_embed_handler_youtube( $matches, $attr, $url, $rawattr ) {
     1202        if ( is_feed() )
     1203                return "<a href='" . get_permalink() . "'><img src='http://img.youtube.com/vi/{$matches[3]}/0.jpg' alt='" . __('YouTube') . "' /></a>";
     1204
     1205        // If the user supplied a fixed width AND height, use it
     1206        if ( !empty($rawattr['width']) && !empty($rawattr['height']) ) {
     1207                $width  = (int) $rawattr['width'];
     1208                $height = (int) $rawattr['height'];
     1209        } else {
     1210                list( $width, $height ) = wp_embed_calcdims( 425, 344, $attr['width'], $attr['height'] );
     1211        }
     1212
     1213        return apply_filters( 'embed_youtube', "<object width='$width' height='$height'><param name='movie' value='http://www.youtube.com/v/{$matches[3]}&amp;hl=en&amp;fs=1'></param><param name='allowFullScreen' value='true'></param><param name='allowscriptaccess' value='always'></param><embed src='http://www.youtube.com/v/{$matches[3]}&amp;hl=en&amp;fs=1' type='application/x-shockwave-flash' allowscriptaccess='always' allowfullscreen='true' width='$width' height='$height'></embed></object>", $matches, $attr, $url, $rawattr );
     1214}
     1215
     1216
     1217// PollDaddy
     1218wp_embed_register_handler( 'polldaddy', '#http://answers.polldaddy.com/poll/(\d+)(.*?)#i', 'wp_embed_handler_polldaddy' );
     1219function wp_embed_handler_polldaddy( $matches, $attr, $url, $rawattr ) {
     1220        if ( is_feed() )
     1221                return make_link($url);
     1222
     1223        return apply_filters( 'embed_polldaddy', '<script type="text/javascript" src="http://s3.polldaddy.com/p/' . esc_attr($matches[1]) . '"></script>', $matches, $attr, $url, $rawattr );
     1224}
     1225
     1226
     1227// DailyMotion
     1228// Example: http://www.dailymotion.com/video/x4cqyl_ferrari-p45-owner-exclusive-intervi_auto
     1229wp_embed_register_handler( 'dailymotion', '#http://(www.dailymotion|dailymotion)\.com/(.+)/([0-9a-zA-Z]+)\_(.*?)#i', 'wp_embed_handler_dailymotion' );
     1230function wp_embed_handler_dailymotion( $matches, $attr, $url, $rawattr ) {
     1231        if ( is_feed() )
     1232                return make_link($url);
     1233
     1234        // If the user supplied a fixed width AND height, use it
     1235        if ( !empty($rawattr['width']) && !empty($rawattr['height']) ) {
     1236                $width  = (int) $rawattr['width'];
     1237                $height = (int) $rawattr['height'];
     1238        } else {
     1239                list( $width, $height ) = wp_embed_calcdims( 480, 291, $attr['width'], $attr['height'] );
     1240        }
     1241
     1242        return apply_filters( 'embed_dailymotion', "<object width='$width' height='$height' classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000'><param name='movie' value='http://www.dailymotion.com/swf/{$matches[3]}&amp;related=0'></param><param name='allowFullScreen' value='true'></param><param name='allowScriptAccess' value='always'></param><embed src='http://www.dailymotion.com/swf/{$matches[3]}&amp;related=0' type='application/x-shockwave-flash' width='$width' height='$height' allowFullScreen='true' allowScriptAccess='always'></embed></object>", $matches, $attr, $url, $rawattr );;
     1243}