【问题标题】:Create oembed previews for my selfhosted WP?为我的自托管 WP 创建 oembed 预览?
【发布时间】:2026-01-03 02:30:01
【问题描述】:

我有一个在虚拟主机系统上运行的简单 WP 实例。我一直想知道为什么当我分享我的文章链接时没有预览,例如在脸书。我读到 WP 支持 oEmbed,所以我很困惑,因为最终生成的 HTML 源代码中没有一行... 更困惑,因为似乎你们中的 get your previews 可以加入 wordpress.com 网络?

简而言之:如何为我自己的本地博客启用/添加 oEmbed 支持并提供我的帖子的预览?

附:不,这不是关于嵌入其他平台内容(yt、flickr、...)并在视频、图像...上获得 html 预览。

【问题讨论】:

    标签: wordpress self-hosting oembed


    【解决方案1】:

    自托管的 o​​Embed 提供程序:一个简单的 Hello World 演示

    这是一个非常简单的 自托管 oembed 提供程序(站点 A)演示,它在 oembed.com 上为 rich 实现 json 规范类型响应。其他可用的类型是 linkphotovideo

    站点 A:

    本网站是一个自托管的oembed 提供者,它支持json 格式并且只实现必需的 oembed 规范并跳过可选参数。

    我们还为未找到的网址实施404,为不可用的格式实施501

    这里用到的关键函数是url_to_postid()status_header()get_post()wp_send_json()

    /**
     * Demo: A simple self-hosted oEmbed provider.
     */
    
    add_action( 'template_redirect', 'simple_oembed_provider_so27693829' ) 
    
    function simple_oembed_provider_so27693829()
    {
        // Catch the user input:
        $input = filter_input_array( INPUT_GET, array(
            'simple-oembed'   => FILTER_SANITIZE_NUMBER_INT,
             'url'       => FILTER_SANITIZE_URL,
             'format'    => FILTER_SANITIZE_STRING,
             'maxwidth'  => FILTER_SANITIZE_NUMBER_INT,
             'maxheight' => FILTER_SANITIZE_NUMBER_INT,
            )
        );
    
        // Our oembed service is activated:
        if( 1 == $input['simple-oembed'] )
        {
            //--------------
            // We only support json format:
            //--------------
            if( 'json' != $input['format'] ) 
            {
                status_header( 501 ); 
                nocache_headers();
                exit();
    
            $pid = url_to_postid( $input['url'] );
    
            //--------------
            // The url doesn't exists:
            //--------------
            if( 0 == $pid ) 
            {
                status_header( 404 );     
                nocache_headers();
                exit();
            }
    
            //--------------
            // json output:
            //--------------
            else
            {
                $post = get_post( $pid );
                $data = array(
                    'version' => '1.0',
                    'type'    => 'rich',
                    'width'   => empty( $input['maxwidth'] ) ? 600 : min( 600, $input['maxwidth'] ),
                    'height'  => empty( $input['maxheight'] ) ? 400 : min( 400, $input['maxheight'] ), 
                    'html'    => sprintf(
                       '<div class="simple-oembed"><h2><a href="%s">%s</a></h2><p>%s</p></div>',
                        get_permalink( $pid ),
                        apply_filters( 'the_title', $post->post_title ),    
                        'Check out this great post!'
                    )
                );
                wp_send_json( $data );
            }
        }
    }
    

    网站 B:

    要测试站点 A 提供的 oembed 服务,我们必须通过以下方式注册它:

    add_action( 'init', 'add_our_oembed_provider_so27693829' );
    
    function add_our_oembed_provider_so27693829()
    {
        wp_oembed_add_provider( 
            $format   = 'http://site-a.tld/*', 
            $provider = 'http://site-a.tld/?simple-oembed=1&' 
        );
    }
    

    在站点 B。

    然后当我们在编辑器中添加site-a.tld 链接时,我们得到:

    保存前:

    保存后:

    这里site-b.tld会向site-a.tld发送如下GET请求:

    http://site-a.tld/?simple-oembed=1
    &format=json
    &maxwidth=625
    &maxheight=938
    &url=http://site-a.tld/hello-world/
    

    给出以下 200 状态响应:

    {
        "version":"1.0",
        "type":"rich",
        "width":600,
        "height":400,
        "html":"<div class=\"simple-oembed\"><h2><a href=\"http:\/\/site-a.tld\/hello-world\/\">Hello World from Site A<\/a><\/h2><p>Check out this great post!<\/p><\/div>"
    }
    

    ps:我没有提到自动 oEmbed 发现。

    有用的资源:

    【讨论】:

    • 感谢您的详细回答 :) 令我惊讶的是,我的 WP 中没有列出提到的 The oEmbed Provider 插件。我安装了它,现在一切都很好。谢谢!
    • 嗨@Mam,不客气,我很高兴听到你找到了答案;-)
    • 只有一个注释:我发现,我正在寻找#OpenGraph 插件。虽然 OpenEmbed 非常相似,但由于跨站点脚本问题,通常只允许少量主要站点使用。 OG 非常有限,但通常允许:-)
    【解决方案2】:

    您可以简单地将 OG 元标记添加到主题 header.php 中 wp_head() 之前的部分:

    我从我的主题 header.php 中复制了这个,因此您可能需要根据需要进行更改。

    编辑:您可以在 github 上在线查看我的主题 header.php:https://github.com/service4me/sandbox-wordpress-theme/blob/master/header.php

    OG 标题:

    <meta property="og:title" content="<?php is_front_page() ? bloginfo('description') : wp_title( '');?> - <?php echo wp_specialchars( get_bloginfo('name'), 1 ) ?>" />
    

    OG 类型:

    <meta property="og:type" content="<?php if ( is_single() ) { ?>article<?php } else { ?>Website<?php } ?>" />
    

    OG 网址:

    <meta property="og:url" content="<?php echo "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; ?>" />
    

    OG 图片:

    <meta property="og:image" content="<?php if ( is_single() && has_post_thumbnail() ) { 
    
          $ogImageUrl = wp_get_attachment_image_src(get_post_thumbnail_id(),’large’, true);
    
          echo $ogImageUrl[0];
    
        } else {
    
          echo bloginfo('template_directory'), '/img/logo.png';
    
        } ?>" />
    

    OG 说明:

    <meta property="og:description" content="<?php if ( is_front_page() ) {
    
          bloginfo('description');
    
        } else {
    
          if ( is_single() ) {
    
            echo htmlspecialchars( get_the_excerpt() );
    
          } else {
    
            wp_title( '');
    
          }
    
        } ?>" />
    

    OG 语言环境:

    <meta property="og:locale" content="de_AT" />
    

    【讨论】:

    • 也感谢您的回答。同样对于 OG,有现成的插件可以提供您手动编码的内容;-)
    • 所有东西都有插件,但它们可能存在错误和安全漏洞,所以我更喜欢在有能力的时候自己编写代码。那我就知道到底发生了什么
    最近更新 更多