如何用R通过knit2wp将含交互式内容的Rmarkdown发布到WordPress
R发布带交互式内容的Rmarkdown到WordPress解决方案
核心逻辑:先将交互式组件单独渲染为内嵌所有依赖的独立HTML,上传至WordPress媒体库获取公网URL,再在Rmd中通过iframe引用该URL后发布。
1. 渲染交互式组件为独立HTML
将ggplotly等htmlwidget组件单独导出为单文件HTML,所有JS、样式依赖全部内嵌,避免外部依赖加载失败:
library(ggplot2) library(plotly) library(htmlwidgets) # 生成交互式图表 g <- ggplot(cars, aes(dist, speed)) + geom_point() ply_plot <- ggplotly(g) # 导出为自包含HTML文件 saveWidget( widget = ply_plot, file = "cars_scatter.html", selfcontained = TRUE, title = "车速与刹车距离交互图" )
2. 上传HTML文件至WordPress媒体库
使用wordpressr包完成认证和文件上传,获取上传后的公网访问URL:
library(wordpressr) # WordPress账号认证,推荐使用后台生成的应用密码,不要直接用登录密码 wp_auth( site_url = "https://blog.site.com", username = "你的WordPress用户名", password = "你的WordPress应用密码" ) # 上传HTML文件 upload_result <- wp_upload_media( file_path = "cars_scatter.html", media_type = "text/html" ) # 提取上传后的公开访问URL interactive_plot_url <- upload_result$source_url
注意:如果WordPress默认禁止HTML格式文件上传,可在站点根目录
wp-config.php中添加define('ALLOW_UNFILTERED_UPLOADS', true);放开权限,或使用媒体上传权限管理类插件放开HTML格式限制。
3. 修改Rmd文件插入iframe
在原Rmd中删除交互式图表生成代码,替换为动态iframe渲染代码块,注意给代码块添加results='asis'和echo=FALSE参数:
# 代码块头:{r, results='asis', echo=FALSE} cat( glue::glue( '<iframe src="{interactive_plot_url}" width="100%" height="500px" frameborder="0" allowfullscreen></iframe>' ) )
4. 调用knit2wp发布内容
使用你原有发布逻辑即可正常发布,交互式图表可以正常加载:
options( WordpressLogin = c(你的用户名 = '你的应用密码'), WordpressURL = 'https://blog.site.com/xmlrpc.php' ) knit2wp( input = 'test.Rmd', title = '测试交互内容发布', publish = FALSE, action = "newPost" )
常见问题说明
- 之前的
path.expand报错是因为iframe引用的是本地文件路径,未上传到WordPress服务器,路径解析失败导致 - 部分WordPress主题会过滤iframe标签,可在发布后检查文章页HTML源码确认iframe是否被正常保留,如被过滤可安装自定义HTML权限类插件解决
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

