裏紙に書く程度の内容

wp.uploadFileでoverwriteで上書きされない

wordpressのXML - RPC API を使って画像ファイルをアップロードししたいんだけど上書き設定がうまくいかないので対処法をメモ。

※本記事はWordpress ver 4.3.1 以前のものが対象になります。

4.4での修正方法はこちら

リファレンスを読むと同じ名前のファイルを上書きする場合は”overwrite”に”true”を指定すればいいよって書いてあるんだけど、これがうまくいかない。

https://codex.wordpress.org/XML-RPC_WordPress_API/Media

オプション指定の仕方が悪いのだと思って試行錯誤してみたけどどうしても上書きになりません。

仕方ないのでソース追うことに。

wp-includes/class-wp-xmlrpc-server.phpmw_newMediaObject()が”wp.uploadFile”のときに動くようです。 “overwrite”に関する部分はこんな感じ

    if ( !empty($data['overwrite']) && ($data['overwrite'] == true) ) {
      // Get postmeta info on the object.
      $old_file = $wpdb->get_row("
        SELECT ID
        FROM {$wpdb->posts}
        WHERE post_title = '{$name}'
          AND post_type = 'attachment'
      ");

      // Delete previous file.
      wp_delete_attachment($old_file->ID);

      // Make sure the new name is different by pre-pending the
      // previous post id.
      $filename = preg_replace('/^wpid\d+-/', '', $name);
      $name = "wpid{$old_file->ID}-{$filename}";      // (1)
    }

    // ~~~~~~ (中略) ~~~~~

    $attachment = array(
      'post_title' => $name,
      'post_content' => '',
      'post_type' => 'attachment',
      'post_parent' => $post_id,
      'post_mime_type' => $type,
      'guid' => $upload[ 'url' ]
    );

    // Save the data
    $id = wp_insert_attachment( $attachment, $upload[ 'file' ], $post_id );

_posttitleが同じものがあれば、削除しているようです。

しかし!

$nameには最初はファイル名が入っているんですが、(1) のところで”wpid*“に書き換えています。 そしてそれをそのままpostデータの”post_title”として登録してます。

ということは、SQLの部分で”post_title”がファイル名と同じものを検索しても引っかかるわけありません。

これはwpのバグのようで、チケット上がっていました。

https://core.trac.wordpress.org/ticket/17604

ver. 4.4で修正されるらしい。で、その4.4は今月(2015年12月)リリース予定みたいです。

https://codex.wordpress.org/WordPress_Versions

あと数日待ってもいいけど、簡単に直せそうなのでやっちまおう!

バージョンアップで上書きされてもなおってるはずなのでもんだいないだろう!!

というわけで修正。

tracのDescriptionに書いてある通りなんですが、”$name”,”$filename” を書き換えている部分を消せばとりあえずOKです。

      // Make sure the new name is different by pre-pending the
      // previous post id.
      // 以下2行をコメントアウト
      //$filename = preg_replace('/^wpid\d+-/', '', $name);
      //$name = "wpid{$old_file->ID}-{$filename}";

tracの情報を見ると5年前からあったバグのようです。 英語はよくわからんのですが途中でなおった風な雰囲気を醸しだているのにまたバグった?ような感じ。

4.4でほんとに治るのか不明なのでバージョンアップっが来たら要確認ですね。


[2015/12/10 追記]

ver 4.4 来ましたね。なおっていません!

というか、”overwrite”ってパラメータがなくなっています。tracに書いてあったのは「消すよ」ってことだったのかな?英語苦手ですわー。

4.4 での修正方法は近日中にアップ予定です。

4.4での修正方法はこちら

Index