#1 楼
是的,这是可能的,并且非常容易。这是我建议的工作流程:
将UI放在某个位置以插入特色图像的URL。最好的选择是使用
'admin_post_thumbnail_html'
过滤器挂钩使用
'save_post'
过滤器挂钩将URL(在安全和验证例程之后)保存在自定义帖子元中使用
'post_thumbnail_html'
过滤器挂钩输出正确的<img>
标记,覆盖默认值,如果需要其特色图像的帖子具有带有外部特色图像的帖子元要工作,此工作流程需要使用
get_the_post_thumnbail()
或the_post_thumbnail()
函数在模板中显示该特色图像。此外,在为外部URL设置meta时,必须确保
'_thumbnail_id'
的meta值具有非空值,否则has_post_thumbnail()
对于仅具有外部特色图片的帖子将返回false。事实上,通过我们的工作流程,帖子可能既有标准的本地特色图像又有一套,在这种情况下,将使用外部。
要实现我们的工作流程,我们需要一个函数来验证用作外部URL的功能。特色图片,因为我们必须确保它是有效的图片网址。
有多种方法可以执行此任务;在这里,我使用一种非常简单的方法,仅查看URL,而不下载图像。这仅适用于静态图片网址,并且不能验证图片实际存在,但是速度很快。如果需要,可以将其修改为更高级的功能(这里有一些帮助)。
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'
作为文本域,但是您应该使用正确的注册文本域。输出为空时:
这是添加图像URL并保存/更新帖子后的外观:
因此,现在我们的管理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'
post meta中。如果URL为空且保存了meta,则将其删除,只需清空外部URL字段即可删除meta。最后的事情是在设置了我们的外部图片URL后输出特色图片标记meta:
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;
}
我们完成了。
要做的事情
在特色图片输出中,我没有使用
width
或height
属性,也没有使用WordPress通常添加的类,例如'attachment-$size'
。这是因为嗅探图像的大小需要额外的工作,这会减慢页面的加载速度,尤其是在页面中有多个特色图像的情况下。如果需要这些属性,可以使用我的代码在其中添加回调
wp_get_attachment_image_attributes'
过滤器(这是一个标准的WordPress挂钩),或者您可以更改我的代码以嗅探图像大小并输出相关的属性和类。插件Gist
此处发布的所有代码,除了添加适当的代码文本域初始化,可以在此处作为Gist中的完整插件使用。其中的代码使用命名空间,因此需要PHP 5.3+。
注意事项
当然,您应该确保自己具有从外部使用和热链接网站中图像的许可和授权。 />
评论
我在哪里放置此代码
– Ankit Agrawal
18/12/5在10:14
您能解释一下我们必须在哪个页面上编写哪些代码。我是PHP / Wordpress的新手,所以请逐步解释。谢谢
– Ankit Agrawal
18/12/10在13:09
@AnkitAgrawal看看这里
– gmazzap♦
18/12/10在15:03
不适用于5.4或5.5。
–人
20/07/10在15:22
评论
您可以使用存储外部图像URL的自定义字段来完成此操作。每次出现the_post_thumnail()(或类似函数)时,使其难以工作,或使其与主题或插件定义的不同图像大小一起工作,可能会很困难。您可以使用此插件将外部图片网址设置为特色图片:wordpress.org/plugins/wp-remote-thumbnail
它是在本地存储图像还是在远程调用?
@ Volatil3我尚未测试,但阅读了插件说明后,我会说它远程调用它。