提取插入到帖子内容上的第一个嵌入URL

时间:2011-01-27 作者:peroyomas

我想提取插入到帖子内容上的第一个oEmbed url,以便从标题或其他地方插入元标记,以使其样式与其他内容不同。

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

我假设您只对第一个能够成功发现实际oembed数据的URL感兴趣。oembed系统处理它找到的所有链接,但显然不是每个链接都有oembed。

您要使用的过滤器是embed\\u oembed\\u html,它获取oembed缓存的html、url、嵌入上的任何属性以及post\\u ID,这对您的代码很重要。

add_filter(\'embed_oembed_html\', \'my_function\',10,4);
function my_function( $cache, $url, $attr, $post_ID ) {
  global $my_previous_post_id;
  if ($my_previous_post_id != $post_ID) {
    // post ID changed, so this is the first oembed for the post
    // do something with $url
    $my_previous_post_id = $post_ID;
  }
  return $cache; // it\'s important that you return the $cache value as-is
}
现在,整个oembed系统与短代码同时运行:在\\u内容过滤器调用期间。因此,如果要获取标题的内容,必须在标题中启动主循环,在get\\u the\\u content()值上运行\\u content过滤器,然后调用rewind\\u posts()将查询返回到页面中实际主循环的开始位置。

这种行为会导致插件(如Nextgen gallery)出现问题,当您在标头中运行循环时,插件会做一些愚蠢的事情。没有办法解决这个问题,但事实是这些插件根本就坏了,你无法纠正它们的问题。我一直与证监会股票和证监会一起收到此类报告(因为他们也会将内容拉出来放在标题中)。坦白地说,你对此无能为力。

SO网友:Rarst

试试这个:

function get_first_oembed($id) {

    $meta = get_post_custom($id);

    foreach ($meta as $key => $value)
        if (false !== strpos($key, \'oembed\'))
            return $value[0];
}
嵌入内容似乎存储为HTML的呈现块,所以如果您想单独使用链接,还需要提取它。

SO网友:pcigler

我尝试了“稀有”的答案,但事实上这并不是解决问题的非常稳定的方法。如果你想var_dump 这个$meta 在上面的var中,您将注意到至少有一个另一个元字段_oembed_time_xxxxxxxxxxxx 这可能是为了破坏缓存。

而且,当我从帖子内容中删除oEmbed链接时,缓存的eEmbed元字符串没有被删除,这不是我想要的。

因此,我对wp-includes/class-oembed.phpwp-includes/class-wp-embed.php 得到了更多的固溶体:

function get_first_oembed_from_content( $content ) {
    if ( preg_match( \'|^\\s*(https?://[^\\s"]+)\\s*$|im\', $content, $matches ) ) {
        return wp_oembed_get( $matches[1] );
    }

    return false;
}
regex模式是从本机WP_Embed:autoembed() 功能,因此它是最可靠的。

从这里可以很容易地修改此函数并仅提取第一个URL。

结束

相关推荐

WP-cron.php-如何删除WP的Cron瞬变?

我有一个Wordpress网络,我的任务是禁用WP Cron并将其替换为Apache Cron。我已经设置了一个PHP脚本,当Apache Cron调用该脚本时,它将在网络下的所有站点中循环,并向该站点的wp Cron发出请求。php页面,从而执行其cron。我想使用Wordpress的瞬态特性来限制我的PHP脚本,因为Wordpress限制了自己的cron。然而,当我深入研究代码时,我看到doing\\u cron瞬态已设置(在cron.php#217中),但从未取消设置。瞬态是否一直未设置,或者Wor