Shortcode API更适合于更改帖子内容,而不是执行响应内容的操作,因此需要更多的创造力来更改其他帖子数据,尽管仍然可以这样做。最后,考虑到您可以通过单击post editor UI中的按钮来完成相同的操作,使用短代码设置特色图像有点奇怪。
我强调,我下面的解决方案是未经测试的黑客,依赖于以非标准方式使用WordPress组件
溶液使用the Plugin API 到write a plugin 使用the Shortcode API 到register your shortcode.
为了将远程图像设置为特色图像,您需要下载图像,将其移动到永久位置(例如wp-content/uploads
), 将其附加到帖子上,然后设置特色图像。有几种方法可以做到这一点,但我认为最简单的方法是
使用download_url()
将远程映像下载到临时目录将临时文件路径传递给handle_media_sideload()
将文件移动到wp-content/uploads
, 生成附件元数据,并将其附加到帖子将返回的附件ID传递给set_post_thumbnail()
将其指定为特征图像在短代码的回调函数中应用上述函数的难点在于handle_media_sideload()
和set_post_thumbnail()
两者都需要post的ID,并且不会向shortcode回调传递post ID或post对象本身。当短代码应用于通过全局$post
对象,但在该点应用上述操作可能会导致每次显示帖子时下载并设置图像。
实现此攻击的一个可能的解决方法是使用类属性传递帖子ID,并从短代码回调中提前返回,短代码的内容未被修改。
另一种解决方案可能是,在保存帖子时(例如save_post
). 仍然可以注册短代码以返回空字符串。类似于
$featured_image_shortcode = \'post_image\';
wpse_211802_featured_image_shortcode( $atts, $content ) {
return \'\';
}
add_shortcode( $featured_image_shortcode, \'wpse_211802_featured_image_shortcode\' );
wpse_211802_featured_image_from_shortcode_url( $post_id ) {
$content = get_the_content( $post_id );
$shortcode_matches = array();
if( ! has_shortcode( $content, \'post_image\' ) )
return;
preg_match_all( \'\\[\' . $featured_image_shortcode . \'\\](.*)\\[\\/\' . $featured_image_shortcode . \'\\]\', $content, $shortcode_matches );
$url = $shortcode_matches[ 1 ][ 0 ];
$tempfile = download_url( $url );
if( is_wp_error( $tempfile ) ){
// download failed, handle error
return;
}
// Set variables for storage
preg_match( \'/[^\\?]+\\.(jpg|jpe|jpeg|gif|png)/i\', $url, $matches );
$desc = \'Featured Image for Post \' . $post_id;
$file_array = array(
\'name\' => basename( $matches[0] ),
\'tmp_name\' => $tempfile
);
// Sideload the downloaded file as an attachment to this post
$attachment_id = media_handle_sideload( $file_array, $post_id, $desc );
// If errors encountered while sideloading, delete the downloaded file
if ( is_wp_error( $attachment_id ) ) {
@unlink( $tempfile );
return;
}
// If all went well, set the featured image
set_post_thumbnail( $post_id, $attachment_id );
}
add_action( \'save_post\', \'wpse_211802_featured_image_from_shortcode_url\' );
您可能需要
require_once()
其他文件,以便上述功能正常运行。如果您做了类似的事情,我建议扩展错误处理和URL验证。
尽管如此,只需使用post editor UI上的按钮设置特色图像就可以轻松得多。