こんにちわ、ご返信ありがとうございます。
すいません、ちょうど自己解決してしまいました。
ソースの方はあまりに汚い&長いのでお見せするのはどうかと思い躊躇していました。
結論から言うとwp_remote_postでPOSTして得たメディアIDはその後の実際のポスト投稿をする際になぜか400エラーでそのメディアIDが使えなくなりました。しかし、cURLを使うってアップロードするとうまくいきました(なぜなのか全くわかりませんが・・・)
ほとんどAIに頼って作ったので、以下のコード部分で正解かどうかわかりませんが、多分・・・
ダメな例
$endpoint = 'https://api.x.com/2/media/upload';
$init_args = array(
'headers' => array(
'Authorization' => 'Bearer ' . $access_token,
),
'body' => array(
'command' => 'INIT',
'media_type' => $media_type,
'total_bytes' => $file_size,
'media_category' => $media_category,
),
);
$response = wp_remote_post($endpoint, $init_args);
$init_data = json_decode(wp_remote_retrieve_body($response), true);
$media_id = $init_data['data']['id'];
で取得したメディアIDは後でポストするときにメディアIDを指定しても
{"errors":[{"parameters":{"media.media_ids":["メディアID番号"]},"message":"Your media IDs are invalid."}],"title":"Invalid Request","detail":"One or more parameters to your request was invalid.","type":"https://api.twitter.com/2/problems/invalid-request"}
で弾かれました。
逆にうまくいったのは(これも多分)
$endpoint = 'https://api.twitter.com/2/media/upload';
$retry_count = 0;
$max_retries = 3;
$retry_delay = 5;
if ($media_category === 'tweet_image') {
while ($retry_count < $max_retries) {
$headers = [
'Authorization: Bearer ' . $access_token,
'Content-Type: multipart/form-data'
];
$body = [
'media' => new CURLFile($file_path, $media_type, basename($file_path)),
'media_category' => $media_category
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $endpoint);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$response_data = json_decode($response, true);
$media_id = $response_data['id'] ?? $response_data['media_id_string'] ?? null;
return $media_id;
}
DB名&カラムをV1.0OAuthから流用・引っ越ししたので、変数名がベアラトークンではなくアクセストークンなのはご容赦ください。
そして、別関数から上記のコードを呼び出し、メディアIDを取得して、以下でポストしています。(だいぶ端折ってます)
$tweet_endpoint = 'https://api.twitter.com/2/tweets';
$tweet_text = $c['post'];
$params = array(
"text" => $tweet_text
);
$media_ids = array_merge($media_ids, $images_for_tweet);
$params["media"] = array("media_ids" => $media_ids);
$post_args = array(
'headers' => $headers,
'body' => wp_json_encode($params),
'timeout' => 30,
);
$tweet_response = wp_remote_post($tweet_endpoint, $post_args);
これだとうまく画像付き(動画もチャックアップロードで確認もしました)ポストができるのを確認しました。
正直まだWebプログラミングやってみて一か月もたっておらず、コーディングはほぼAI任せなので、初心者丸出しです。
なので、
$response = wp_remote_post($endpoint, $init_args);
で取得したメディアIDが無効なのに、
$response = curl_exec($ch);
で取得したメディアIDが有効なのも、実際やってみてうまくいったというだけの結果論で、「何故そうなったのか?」という点は未解決のままです。
cURLを使ってみた理由は、公式ページにcURLでのサンプルが書いてあったので、ダメもとで試したらうまくいった、というだけです。
https://docs.x.com/x-api/media/quickstart/media-upload-chunked
とりあえず、1.1エンドポイントが使えなくなる前にV2エンドポイントにメディアアップロード&ポスト投稿ができたので良かったです。