是否可以使用外部图像URL设置特色图像

时间:2014-08-20 作者:Volatil3

我知道有一些插件可以从远程URL获取图像并在本地存储。我只想知道是否可以将图像存储在媒体库中,而将其用作特色图像?

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

是的,这是可能的,而且很容易。

这是我建议的工作流程:

在某处放置一个UI以插入特色图像的URL。最好的选择可能是使用\'admin_post_thumbnail_html\' 过滤器挂钩的使用\'save_post\' 将URL(在安全和验证例程之后)保存在自定义post meta中的操作挂钩使用\'post_thumbnail_html\' 过滤器挂钩至输出正确<img> 如果需要特色图像的帖子具有带有外部特色图像的帖子元数据,则标记将覆盖默认设置

To work, this workflow needs the featured image to be shown in the template using get_the_post_thumnbail() or the_post_thumbnail() functions.

此外,我们必须确保\'_thumbnail_id\' 当我们为外部URL设置meta时,meta值具有非空值,否则has_post_thumbnail() 对于只有外部特征图像的帖子,将返回false。

事实上,一篇文章可能既有标准的本地特色图像,也有通过我们的工作流设置的图像,在这种情况下,将使用外部图像。

为了实现我们的工作流,我们需要一个函数来验证用作外部特征图像的URL,因为我们必须确保它是一个有效的图像URL。

有不同的方法来完成这项任务;这里我使用一种非常简单的方法,只查看URL,而不下载图像。这只适用于静态图像URL,不会验证图像是否确实存在,但速度很快。如果需要,请将其修改为更高级的版本(here 是一些帮助)。

function url_is_image( $url ) {
    if ( ! filter_var( $url, FILTER_VALIDATE_URL ) ) {
        return FALSE;
    }
    $ext = array( \'jpeg\', \'jpg\', \'gif\', \'png\' );
    $info = (array) pathinfo( parse_url( $url, PHP_URL_PATH ) );
    return isset( $info[\'extension\'] )
        && in_array( strtolower( $info[\'extension\'] ), $ext, TRUE );
}
很简单。现在,让我们添加上面工作流中描述的3个挂钩:

add_filter( \'admin_post_thumbnail_html\', \'thumbnail_url_field\' );

add_action( \'save_post\', \'thumbnail_url_field_save\', 10, 2 );

add_filter( \'post_thumbnail_html\', \'thumbnail_external_replace\', 10, PHP_INT_MAX );
以及相关功能。首先是在admin中输出字段的字段:

function thumbnail_url_field( $html ) {
    global $post;
    $value = get_post_meta( $post->ID, \'_thumbnail_ext_url\', TRUE ) ? : "";
    $nonce = wp_create_nonce( \'thumbnail_ext_url_\' . $post->ID . get_current_blog_id() );
    $html .= \'<input type="hidden" name="thumbnail_ext_url_nonce" value="\' 
        . esc_attr( $nonce ) . \'">\';
    $html .= \'<div><p>\' . __(\'Or\', \'txtdomain\') . \'</p>\';
    $html .= \'<p>\' . __( \'Enter the url for external image\', \'txtdomain\' ) . \'</p>\';
    $html .= \'<p><input type="url" name="thumbnail_ext_url" value="\' . $value . \'"></p>\';
    if ( ! empty($value) && url_is_image( $value ) ) {
        $html .= \'<p><img style="max-width:150px;height:auto;" src="\' 
            . esc_url($value) . \'"></p>\';
        $html .= \'<p>\' . __( \'Leave url blank to remove.\', \'txtdomain\' ) . \'</p>\';
    }
    $html .= \'</div>\';
    return $html;
}
请注意,我使用了\'txtdomain\' 作为文本域,但应使用正确的已注册文本域。

这是输出为空时的外观:

External URL for featured image: the field

这就是添加图像URL并保存/更新帖子后的效果:

External URL for featured image: the field after filling up and saved

现在,我们的管理UI完成了,让我们编写保存例程:

function thumbnail_url_field_save( $pid, $post ) {
    $cap = $post->post_type === \'page\' ? \'edit_page\' : \'edit_post\';
    if (
        ! current_user_can( $cap, $pid )
        || ! post_type_supports( $post->post_type, \'thumbnail\' )
        || defined( \'DOING_AUTOSAVE\' )
    ) {
        return;
    }
    $action = \'thumbnail_ext_url_\' . $pid . get_current_blog_id();
    $nonce = filter_input( INPUT_POST, \'thumbnail_ext_url_nonce\', FILTER_SANITIZE_STRING );
    $url = filter_input( INPUT_POST,  \'thumbnail_ext_url\', FILTER_VALIDATE_URL );
    if (
        empty( $nonce )
        || ! wp_verify_nonce( $nonce, $action )
        || ( ! empty( $url ) && ! url_is_image( $url ) )
    ) {
        return;
    }
    if ( ! empty( $url ) ) {
        update_post_meta( $pid, \'_thumbnail_ext_url\', esc_url($url) );
        if ( ! get_post_meta( $pid, \'_thumbnail_id\', TRUE ) ) {
            update_post_meta( $pid, \'_thumbnail_id\', \'by_url\' );
        }
    } elseif ( get_post_meta( $pid, \'_thumbnail_ext_url\', TRUE ) ) {
        delete_post_meta( $pid, \'_thumbnail_ext_url\' );
        if ( get_post_meta( $pid, \'_thumbnail_id\', TRUE ) === \'by_url\' ) {
            delete_post_meta( $pid, \'_thumbnail_id\' );
        }
    }
}
该函数在进行一些安全检查后,会查看发布的URL,如果没有问题,则将其保存在\'_thumbnail_ext_url\' 发布元数据。如果URL为空且元数据已保存,则会将其删除,只需清空外部URL字段即可删除元数据。

最后一件事是在meta中设置外部图像URL时输出特色图像标记:

function thumbnail_external_replace( $html, $post_id ) {
    $url =  get_post_meta( $post_id, \'_thumbnail_ext_url\', TRUE );
    if ( empty( $url ) || ! url_is_image( $url ) ) {
        return $html;
    }
    $alt = get_post_field( \'post_title\', $post_id ) . \' \' .  __( \'thumbnail\', \'txtdomain\' );
    $attr = array( \'alt\' => $alt );
    $attr = apply_filters( \'wp_get_attachment_image_attributes\', $attr, NULL );
    $attr = array_map( \'esc_attr\', $attr );
    $html = sprintf( \'<img src="%s"\', esc_url($url) );
    foreach ( $attr as $name => $value ) {
        $html .= " $name=" . \'"\' . $value . \'"\';
    }
    $html .= \' />\';
    return $html;
}
我们完成了。

在我没有使用的特色图像输出中,还有什么要做widthheight 属性,也不是WordPress通常添加的类,如\'attachment-$size\'. 这是因为嗅探图像的大小需要额外的工作来降低页面加载速度,尤其是当页面中有多个特色图像时。

如果需要这些属性,可以使用我的代码将回调添加到wp_get_attachment_image_attributes\' 过滤器(它是standard WordPress hook) 或者,您可以修改我的代码来嗅探图像大小并输出相关的属性和类。

插件Gist

此处发布的所有代码,除了添加适当的文本域初始化外,都可以作为Gist中的完整工作插件使用here. 那里的代码使用名称空间,因此需要PHP 5.3+。

注意:当然,您应该确保您拥有许可证和授权,可以在您的站点中使用和热链接外部图像。

结束

相关推荐

Removing blog page images

我有我的blog page here 然而,在我创建的一个网站上,我不太明白在哪里可以找到代码来去除我孩子主题上的图像。我使用的是2010年的代码,我已经设置了自己的博客模板页面,但它不起作用,所以我显然编辑了错误的文件。所以不是循环。php我想要编辑的文件,以便在主博客页面上删除这些图像?<?php /* How to display all other posts. */ ?> <?php else : ?> <div i