网上有很多文章提及到 WordPress 的 Embed 功能,大部分文章都建议用户移除这个功能,原因无非是这个功能会在一定程度上拖慢网站的速度。看了很多文章,有说 Embed 的,有说 oEmbed 的,有说 Post Embed 的,对于知识有限的小白,光是看到这些奇奇怪怪的字母就已经很是头大了,于是决定自己查阅官方文档及 WordPress 源代码,简单了解一下,以下内容可能会有错误,希望看到的大神可以指正下。

核心文件

首先在了解 WordPress 的 Embed 功能之前,我们需要知道控制该功能的类文件、CSS 文件及 JS 文件分别是位于

wp-include 文件夹下的:class-oembed.php、class-wp-embed.php、class-wp-oembed-controller.php;

wp-include/css 文件夹下的:wp-embed-template-ie.css、wp-embed-template-ie.min.css、wp-embed-template.css、wp-embed-template.min.css;

wp-include/js 文件夹下的:wp-embed-template.js、wp-embed-template.min.js、wp-embed.js、wp-embed.min.js。

CSS 与 JS 文件自是不必多说,主要是实现一些效果及前端美化的。禁用 Embed 功能一方面是希望减少这类静态资源的加载,另一方面是因为目前支持 Embed 的网站大部分是国外的,由于国内环境以及国外线路的问题一些网站可能无法正常加载或者加载速度慢,这也就使得我们无法很好地使用这个功能了。主要还是说一下三个 PHP 文件。

class-oembed.php :实现链接卡片式嵌入的核心文件,基本上是定义那些网址可以实现嵌入式卡片功能的,WordPress 的 Embed 功能主要是由该文件驱动,WordPress 2.9 版本开始引入,WordPress 3.5 版本之前需要后台开启,之后默认隐藏自动开启;

class-wp-embed.php :实现 WordPress 链接卡片式嵌入的类文件, 调用 class-oembed.php,不过由于支持的网站大部分是国外的,国内用起来会影响网站速度,WordPress 2.9 版本开始引入该文件;

class-wp-oembed-controller.php :WordPress 4.4 版本新发布的功能,让你可以在任意 WordPress 站点都可以用嵌入的方式插入 WordPress 文章。

屏蔽代码

关于 WordPress Embed 功能的原理的话大概是上面这些,都是一些个人的理解,可能有错误希望大神指正。最后关于该功能的屏蔽,你可以使用 WordPress 官方插件库中的插件 Disable Embeds,也可以使用下面这段代码:

/**
 * Disable embeds
 */
if ( !function_exists( 'disable_embeds_init' ) ) :
    function disable_embeds_init(){
        global $wp;
        $wp->public_query_vars = array_diff($wp->public_query_vars, array('embed'));
        remove_action('rest_api_init', 'wp_oembed_register_route');
        add_filter('embed_oembed_discover', '__return_false');
        remove_filter('oembed_dataparse', 'wp_filter_oembed_result', 10);
        remove_action('wp_head', 'wp_oembed_add_discovery_links');
        remove_action('wp_head', 'wp_oembed_add_host_js');
        add_filter('tiny_mce_plugins', 'disable_embeds_tiny_mce_plugin');
        add_filter('rewrite_rules_array', 'disable_embeds_rewrites');
    }
    add_action('init', 'disable_embeds_init', 9999);

    function disable_embeds_tiny_mce_plugin($plugins){
        return array_diff($plugins, array('wpembed'));
    }
    function disable_embeds_rewrites($rules){
        foreach ($rules as $rule => $rewrite) {
            if (false !== strpos($rewrite, 'embed=true')) {
                unset($rules[$rule]);
            }
        }
        return $rules;
    }
    function disable_embeds_remove_rewrite_rules(){
        add_filter('rewrite_rules_array', 'disable_embeds_rewrites');
        flush_rewrite_rules();
    }
    register_activation_hook(__FILE__, 'disable_embeds_remove_rewrite_rules');

    function disable_embeds_flush_rewrite_rules(){
        remove_filter('rewrite_rules_array', 'disable_embeds_rewrites');
        flush_rewrite_rules();
    }
    register_deactivation_hook(__FILE__, 'disable_embeds_flush_rewrite_rules');
endif;

代码在原有插件源码的基础上加了个判断一方面避免某些主题集成了此功能,另一方面避免启用了相关插件。将代码直接丢到主题的 functions.php 文件中去即可。

参考文档:https://wordpress.org/support/article/embeds/