セッション関数を使わずにファイルアップロード機能を設置するためにはどうすればいいでしょうか?
解決したいこと
WordPressでキャッシュ機能を使う際にセッション関数は推奨されていないため別の方法で添付ファイルを保存したい
発生している問題・エラー
ファイルアップロードが可能な掲示板を作成しているのですが、コードを書いた後に $_SESSION が WordPress で非推奨だと知りどのように修正すべきか悩んでおります。
該当するソースコード
function bbs_answer_confirm()
{
// 統一ユーザーIDを取得
$user_id = $_COOKIE['user_id'] ?? null;
if (!$user_id) {
wp_send_json_error(['message' => 'ユーザーIDが見つかりません']);
exit;
}
// トランジェントからデータ取得
$transient_key = 'bbs_answer_' . $user_id;
$answer_data = get_transient($transient_key);
if (!$answer_data) {
wp_send_json_error(['message' => '投稿データが見つかりません']);
exit;
}
// データベースへの保存処理
global $wpdb;
// 親質問のIDを取得
$unique_id = $answer_data['unique_id'];
$sql = "SELECT * FROM {$wpdb->prefix}sortable WHERE unique_id = %s";
$query = $wpdb->prepare($sql, $unique_id);
$rows = $wpdb->get_results($query);
if (empty($rows)) {
wp_send_json_error(['message' => '親質問が見つかりません']);
exit;
}
$parent_id = $rows[0]->id;
// 回答をデータベースに挿入
$sql = "INSERT INTO {$wpdb->prefix}sortable(parent_id, text, name, ip, user_id) VALUES(%d, %s, %s, %s, %s)";
$query = $wpdb->prepare(
$sql,
$parent_id,
$answer_data['text'],
$answer_data['name'],
$_SERVER['REMOTE_ADDR'],
$user_id // 投稿者のユーザーIDも保存
);
$query_result = $wpdb->query($query);
if ($query_result === false) {
wp_send_json_error(['message' => '投稿に失敗しました: ' . $wpdb->last_error]);
exit;
}
$new_post_id = $wpdb->insert_id;
// 添付ファイルの処理
if (!empty($answer_data['attach'])) {
$upload_dir = wp_upload_dir();
$filenames = [];
// 新しい投稿のunique_idを取得
$sql = "SELECT unique_id FROM {$wpdb->prefix}sortable WHERE id = %d";
$query = $wpdb->prepare($sql, $new_post_id);
$new_unique_id = $wpdb->get_var($query);
foreach ($answer_data['attach'] as $i => $file_data) {
$type = explode('/', $file_data['type']);
$ext = $type[1] ?? 'tmp';
if ($i == 3) {
$n = 'usericon';
} else {
$n = $i + 1;
}
$filename = "{$new_unique_id}_{$n}.{$ext}";
$filenames[$i] = $filename;
$attach_path = $upload_dir['basedir'] . '/attach/' . $filename;
file_put_contents($attach_path, $file_data['data']);
}
// ファイル名をデータベースに更新
$sql = "UPDATE {$wpdb->prefix}sortable SET attach1=%s, attach2=%s, attach3=%s, usericon=%s WHERE id=%d";
$query = $wpdb->prepare(
$sql,
$filenames[0] ?? '',
$filenames[1] ?? '',
$filenames[2] ?? '',
$filenames[3] ?? '',
$new_post_id
);
$wpdb->query($query);
}
// 成功時はトランジェントを削除
delete_transient($transient_key);
wp_send_json_success(['message' => '回答が投稿されました']);
exit;
}
add_action('wp_ajax_bbs_answer_confirm', 'bbs_answer_confirm');
add_action('wp_ajax_nopriv_bbs_answer_confirm', 'bbs_answer_confirm');
自分で試したこと
AIに聞いたところトランジェントを使用した方法を教えてくれた為そちらを実装してみたのですが、ファイルがアップロードされた場合の $answer_data['attach'] にバイナリ(file_get_contents)の大きなデータが含まれており失敗しているようです。
AIが教えてくれたコード
/* 回答タイトルとスタンプ画像なし(回答掲示板) */
function bbs_answer_confirm()
{
// 統一ユーザーIDを取得
$user_id = $_COOKIE['user_id'] ?? null;
if (!$user_id) {
wp_send_json(['error' => 'ユーザーIDが見つかりません']);
exit;
}
// トランジェントからデータ取得
$transient_key = 'bbs_answer_' . $user_id;
$answer_data = get_transient($transient_key);
if (!$answer_data) {
wp_send_json(['error' => '投稿データが見つかりません']);
exit;
}
// データベースへの保存処理
global $wpdb;
// 親質問のIDを取得
$unique_id = $answer_data['unique_id'];
$sql = "SELECT * FROM {$wpdb->prefix}sortable WHERE unique_id = %s";
$query = $wpdb->prepare($sql, $unique_id);
$rows = $wpdb->get_results($query);
if (empty($rows)) {
wp_send_json(['error' => '親質問が見つかりません']);
exit;
}
$parent_id = $rows[0]->id;
// 回答をデータベースに挿入
$sql = "INSERT INTO {$wpdb->prefix}sortable(parent_id, text, name, ip, user_id) VALUES(%d, %s, %s, %s, %s)";
$query = $wpdb->prepare(
$sql,
$parent_id,
$answer_data['text'],
$answer_data['name'],
$_SERVER['REMOTE_ADDR'],
$user_id // 投稿者のユーザーIDも保存
);
$query_result = $wpdb->query($query);
if ($query_result === false) {
wp_send_json(['error' => '投稿に失敗しました: ' . $wpdb->last_error]);
exit;
}
$new_post_id = $wpdb->insert_id;
// 添付ファイルの処理
if (!empty($answer_data['attach'])) {
$upload_dir = wp_upload_dir();
$filenames = [];
// 新しい投稿のunique_idを取得
$sql = "SELECT unique_id FROM {$wpdb->prefix}sortable WHERE id = %d";
$query = $wpdb->prepare($sql, $new_post_id);
$new_unique_id = $wpdb->get_var($query);
foreach ($answer_data['attach'] as $i => $file_data) {
$type = explode('/', $file_data['type']);
$ext = $type[1] ?? 'tmp';
if ($i == 3) {
$n = 'usericon';
} else {
$n = $i + 1;
}
$filename = "{$new_unique_id}_{$n}.{$ext}";
$filenames[$i] = $filename;
$attach_path = $upload_dir['basedir'] . '/attach/' . $filename;
file_put_contents($attach_path, $file_data['data']);
}
// ファイル名をデータベースに更新
$sql = "UPDATE {$wpdb->prefix}sortable SET attach1=%s, attach2=%s, attach3=%s, usericon=%s WHERE id=%d";
$query = $wpdb->prepare(
$sql,
$filenames[0] ?? '',
$filenames[1] ?? '',
$filenames[2] ?? '',
$filenames[3] ?? '',
$new_post_id
);
$wpdb->query($query);
}
// 成功時はトランジェントを削除
delete_transient($transient_key);
wp_send_json(['error' => '']);
exit;
}