将所有YouTube链接转换为嵌入

时间:2014-11-19 作者:user2933912

我有此功能可以将任何帖子或页面中的YouTube URL转换为嵌入:-

function embed_youtube_an($post_content) {
  global $posts; 
  //preg_match(\'|http://www.youtube.com/watch?v=([a-zA-Z0-9]+)|\', $posts->post_content, $matches);
  preg_match(\'#http://w?w?w?.?youtube.com/watch\\?v=([A-Za-z0-9\\-_]+)#s\', $posts->post_content, $matches);

 if (!empty($matches[1])) { 
    $post_content = \'<object width="415" height="250">\';
      $post_content .= \'<param name="movie" value="http://www.youtube.com/v/\' . $matches[1] . \'&hl=en_US&fs=1&"></param>\';
      $post_content .= \'<param name="allowFullScreen" value="true"></param>\';
      $post_content .= \'<param name="allowscriptaccess" value="always"></param>\';
      $post_content .= \'<embed src="http://www.youtube.com/v/\' . $matches[1] . \'&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="415" height="250"></embed>\';
      $post_content .= \'</object>\';
      $post_content = $post_content;

  }
     return $post_content;
}

add_filter(\'the_content\', \'embed_youtube_an\');
但当打开帖子时,所有YouTube URL都不会显示在嵌入中。

问题出在哪里?

3 个回复
SO网友:Howdy_McGee

EDIT

查看编辑后,您可能需要尝试以下操作These Instructions

要将视频或其他对象嵌入帖子或页面,请将其URL放入内容区域。确保URL位于其自己的行上,并且没有超链接(查看帖子时可单击)。

听起来你想用wp_get_oembed() - 示例如下所示:

从支持的oEmbed提供程序检索URL的嵌入代码:

<?php $embed_code = wp_oembed_get(\'http://www.youtube.com/watch?v=tkEvSjdDfiA\'); ?>
从受支持的oEmbed提供程序检索URL的嵌入代码-带width参数:

<?php $embed_code = wp_oembed_get(\'http://www.youtube.com/watch?v=tkEvSjdDfiA\', array(\'width\'=>400)); ?>
如果这不起作用,你可能会申请\'the_content\' filter:

apply_filters( \'the_content\', \'http://www.youtube.com/watch?v=tkEvSjdDfiA\' );
但这个过滤器对于您想要实现的目标来说可能是杀伤力过大了。

SO网友:Jim Maguire

输入URL时,将编辑器置于文本模式。很多人没有注意到可视化编辑器会转换HTML特殊字符,并停用链接。

SO网友:Pieter Goosen

您错误地使用了the_content filter.

为什么代码不起作用

您不会将任何内容返回到引用的内容

即使您的条件失败,您也应该将引用的内容传回,否则如果条件返回,将不会显示任何内容false

您的preg_match 函数使用了错误的subject. 在此处使用引用的内容。(这只是一个说明,您不需要致电全球$post)

您的pattern 也是错误的,它不匹配任何模式,因此失败并按原样返回内容

根据您当前的代码,我已经使用了parse_url()parse_str() 幸亏this answer. 需要注意的是,从您的原始问题来看,您使用的格式如下

  • http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=relatedhttp://www.youtube.com/watch?v=C4kxS1ksqtw.
此代码only 在格式上工作watch?v=

我已相应修改了您的代码:

add_filter(\'the_content\', function ($post_content) 
{ 
    parse_str( parse_url( $post_content, PHP_URL_QUERY ),  $matches);

    if (!empty($matches[\'v\'])) { 
        $post_content = \'<object width="415" height="250">\';
        $post_content .= \'<param name="movie" value="http://www.youtube.com/v/\' . $matches[\'v\'] . \'&hl=en_US&fs=1&"></param>\';
        $post_content .= \'<param name="allowFullScreen" value="true"></param>\';
        $post_content .= \'<param name="allowscriptaccess" value="always"></param>\';
        $post_content .= \'<embed src="http://www.youtube.com/v/\' . $matches[\'v\'] . \'&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="415" height="250"></embed>\';
        $post_content .= \'</object>\';
        $post_content = $post_content;
    }
    return $post_content;
});
EDIT

作为测试,以下代码

<?php
$string = \'http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=related\';
parse_str( parse_url( $string, PHP_URL_QUERY ),  $matches);
?><pre><?php var_dump($matches); ?></pre><?php
转储时提供以下输出

array(2) {
  ["v"]=>
  string(11) "C4kxS1ksqtw"
  ["feature"]=>
  string(7) "related"
}   

结束

相关推荐

为YouTube视频标记内的_Content()应用高度和宽度

我正在显示此功能中的视频和内容the_content()为此,我使用you tube[嵌入]链接。我如何给出高度和宽度???此外,我正在使用the_post_thumbnail() 对于图像,它有大小问题,我尝试过这个the_post_thumbnail(\'\',array(\'width\' => \'240\',\'height\' => \'170\') ); 但失败了