检测POST_CONTENT中的嵌入URL

时间:2013-09-18 作者:ian

我需要改变WP在内容中给定嵌入URL时输出html的方式。WP编辑器中的内容示例:

This is standard content and will be wrapped in a \'p\' tag. But check out this cool vid:

http://www.youtube.com/watch?v=3JJv4TvURj4

This will be output as another \'p\' tag. The above URL will be turned into an iFrame.
目标是让客户端输入这样简单的内容,并改变wordpress在页面上输出内容的方式。我一直在使用oembed_dataparse 到目前为止过滤效果良好,但I would like to take the video URL and pass it to another function outside of the filter. 我该怎么做?

我最初的方法是使用全局变量。以下是我的简化过滤代码:

add_filter(\'oembed_dataparse\', \'modal_embed\', 10, 3);
function modal_embed($html, $data, $url) {
    // This is supposed to store the URL globally so I can access it 
    // outside this filter.
    global $video_url;
    $video_url = $url;

    $custom_output = "<div class=\'video\'>$html</div>"; // Just an example. 
    return $custom_output;
}
我创建为的代码$custom_output 工作正常,并显示在页面上。问题是我无法访问$video_url 正如我所料,全球范围内。有什么想法吗?谢谢

1 个回复
最合适的回答,由SO网友:ian 整理而成

好的,明白了。我只是在wp core中翻了一下,找到了他们用来抓取自动检测的功能。WP使用phppreg_replace_callback WP内的功能autoembed 作用下面是代码,如中所示wp-includes/class-wp-embed.php:

/**
     * Passes any unlinked URLs that are on their own line to {@link WP_Embed::shortcode()} for potential embedding.
     *
     * @uses WP_Embed::autoembed_callback()
     *
     * @param string $content The content to be searched.
     * @return string Potentially modified $content.
     */
    function autoembed( $content ) {
        return preg_replace_callback( \'|^\\s*(https?://[^\\s"]+)\\s*$|im\', array( $this, \'autoembed_callback\' ), $content );
    }
因为我只打算让客户在每篇文章中输入一个视频,所以我使用preg_match 与此相同的RegEx模式一起使用,以实现我想要的:

function embed_url_lookup() {
    if (!have_posts()) return false;

    the_post(); // necessary to use get_the_content()

    $reg = preg_match(\'|^\\s*(https?://[^\\s"]+)\\s*$|im\', get_the_content(), $matches);

    if (!$reg) return false;

    return trim($matches[0]);

} // end embed_url_looku
这将找到第一个自动嵌入url并返回它。

结束

相关推荐

get_posts() and filters

我为添加了自定义筛选函数the_posts 在插件中筛选。add_filter(\'the_posts\', \'posts_filter\'); function posts_filter() { … } 这在主循环中运行得很好,这意味着帖子会按照我在posts_filter 作用但我正在打电话get_posts() 在ajax请求中获取一些帖子。在那里,过滤器不起作用。query_posts() 或自定义wp_query 不要工作太多。所以问题是:我如何才能在主循环旁获得按the_p