通过筛选器更改WordPress图像URL

时间:2019-03-27 作者:Harry

我计划创建一个wordpress插件,将上传的图像卸载到外部网站,并从那里显示它们。

到目前为止我所做的:

1) 每当上传图像时,我的自定义函数就会触发,并将图像(包括缩略图)上载到外部站点,并将URL存储到数据库。

这里没有问题。但是我如何告诉wordpress而不是显示默认图像url显示我的url?我只是在寻找正确的过滤器/挂钩。我在谷歌上搜索了12个小时,仍然没有找到正确的答案。

我想要的是,无论何时请求图像,过滤器都会更改:

http://localhost/wordpress/wp-content/uploads/2019/03/dog-1200x1108.png

http://example.com/BAHIAPJGJSHSH.png
有2个插件可以实现这一点:DigitalOcean Spaces SyncWP Offload Media

这2个插件可以做到这一点,尽管我正在尝试在另一个图像宿主中实现它。我试着查找源代码,但没有找到答案。

谁能给我指一下正确的方向吗?wordpress如何显示图像?如何通过过滤器更改url?

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

您很可能希望使用过滤器。主要问题是开发人员需要确保使用正确的函数,如“The\\u post\\u thumbnail()”等。您可以使用wp\\u get\\u attachment\\u urlhttps://codex.wordpress.org/Function_Reference/wp_get_attachment_url

我在进行本地开发时使用此选项,但希望从生产服务器加载所有本地映像,因为我的本地计算机上没有任何映像。

if($_SERVER[\'REMOTE_ADDR\'] === \'127.0.0.1\') 
{
    // Replace src paths
    add_filter(\'wp_get_attachment_url\', function ($url) 
    {
        if(file_exists($url)) 
        {
            return $url;
        }
        return str_replace(WP_HOME, \'https://www.some-production-site.com\', $url);
    });

    // Replace srcset paths
    add_filter(\'wp_calculate_image_srcset\', function($sources)
    {
        foreach($sources as &$source) 
        {
            if(!file_exists($source[\'url\'])) 
            {
                $source[\'url\'] = str_replace(WP_HOME, \'https://www.some-production-site.com\', $source[\'url\']);
            }
        }
        return $sources;
    });
}

SO网友:Ionut Ardelean

srcset不能那样工作。如果需要,这里有一个解决方案。

add_filter(\'wp_calculate_image_srcset\', function($sources)
{
    $sr = array();
    foreach($sources as $source) 
    {            
        $source[\'url\'] = str_replace(\'http://localhost\', \'https://www.some-production-site.com\', $source[\'url\']);           
        $sr[] =  $source;           
    }       
    return $sr;
});

相关推荐

使用Add_Filters()、Apply_Filter()、Add_action()和do_action()扩展插件

假设我正在开发一个与预订相关的插件。下次我想在那个插件上添加一个附加组件来支付。然后,我为贝宝支付添加了另一个附加组件。假设下面是html中的支付网关UI界面<div class=\"payments-options\"> <div class=\"bank-payment\"></div> <div class=\"cash-on-delivery\"></div> <!--- Here i