使用wp-json接口将媒体项上传到特定路径

时间:2020-06-30 作者:Pezholio

我正在使用WP-JSON API将我的所有帖子从我的live站点导入到我的开发站点。对于帖子、类别和作者来说,它工作得很好,但当我上传图片时,API会将文件视为当天已上传(例如,在2020年6月,所有文件都会转到wp-content/uploads/2020/06), 这会导致图像链接中断。如何上传文件,使其与源文件在同一日期上传?

以下是我到目前为止的情况(在哪里$MEDIA 是生产服务器对的响应/wp-json/wp/v2/media 要列出所有媒体文件,请执行以下操作:

# Loop through the JSON response (encoding as base64, so each object is on a seperate line)
for media in $(printf %s "$MEDIA" | jq -r ".[] | @base64")
do
  media_body=$(printf %s "$media" | base64 -D)
  # Get URL and destination path
  source_url=$(printf %s "$media_body" | jq .source_url | tr -d \'"\')
  destination_path=$(printf %s "$media_body" | jq .media_details.file | tr -d \'"\')

  filename=$(basename "$destination_path")

  # Download media file to tmp directory
  curl -s "$source_url" > "/tmp/$filename"

  # Upload the media file to my dev server (store the response as a variable so we can get the ID)
  response=$(curl --request POST "http://localhost/wp-json/wp/v2/media/" \\
    -u admin:admin \\
    -s \\
    --header "cache-control: no-cache" \\
    --header "content-disposition: attachment; filename=$filename" \\
    --data-binary "@/tmp/$filename" \\
    --location)

  id=$(printf %s "$response" | jq -r ". | .id")
  body=$(printf %s "$media_body" | jq -r ". | {date: .date, date_gmt: .date_gmt, slug: .slug, status: \\"publish\\", title: .title.rendered}")

  # This outputs body eg {"date": "2020-05-27T12:12:53", "date_gmt": "2020-05-27T12:12:53", "slug": "cropped-shortcut-icon-png", "status": "publish", "title": "cropped-shortcut-icon.png" }

  # Update the image\'s metadata
  curl --location --request POST "http://localhost/wp-json/wp/v2/media/$id" \\
    -u admin:admin \\
    -s -o /dev/null \\
    --header \'Content-Type: application/json\' \\
    --data-raw "$body"
done

1 个回复
SO网友:mozboz

不认为这是可能的,但会做更多的研究。

由于服务器没有公开此功能,因此需要在服务器端执行一些操作以实现此功能。由于您正在通过客户端脚本进行所有操作,因此在服务器端编写一个可以使用脚本调用的小插件并不难:

向其发送媒体ID和目标路径(即原始URL)

  • 它接收到该ID,更改文件位置,然后更新媒体项目路径,例如:

    curl POST "http://localhost/wp-json/wp/v2/movemymedia"
    
    json: { mediaID: 1234, oldPath: "06/2018" }
    
    或者别的什么。

    看起来有点工作量,但可以保持现有结构的整洁。

    就我个人而言,我更喜欢在服务器上做这样的事情,因为服务器知道其所有本地设置,并且可以轻松地移动文件。也许您想考虑将脚本翻转到服务器端,而不是客户端推送内容。

  • 相关推荐

    从媒体上传器(wp.media)模式使用POST元过滤媒体

    我想有一个媒体上传模式,只显示具有特定post meta的图像媒体,比如“my\\u image\\u meta”。我怎样才能做到这一点?这是我的实际代码,它只是过滤图像: var mediaUploader; var $inputVal = $(\'input[name=\"geoposts_overlay_ids\"]\'); var $inputBt = $(\'#geoposts_overlays_select\'); $inputBt.cli