###状況
WordPressプラグイン「ContactForm7」を利用して、投稿フォームを作成しました。
各項目に入力して貰った内容を、投稿内のカスタムフィールド(Advanced Custom Fieldsを使用)に反映させる所までは作成できたのですが、添付された画像などを反映させることが出来ません。(※正確にはファイル名が取得されます。)
また、複数のファイルを受け取りたいため、プラグイン「ultifile Upload Field for Contact Form 7」を使用しています。
この場合、カスタムフィールド内に○○○.zipという文字列として登録されます。
画像を投稿内のカスタムフィールドに、画像として反映させる方法はないでしょうか?
//functions.php //rep-○○○、multifile-819は「ContactForm7」で使用しているタグ //メール送信後に内容を投稿として保存 function gloc_wpcf7_insert_post(){ $submission = WPCF7_Submission::get_instance(); if ( $submission ) { $formdata = $submission->get_posted_data(); $email = $formdata['rep-email']; $name = $formdata['rep-name']; $multifile = $formdata['multifile-819']; $new_post = array( 'post_type' => 'post', 'post_title' => $formdata['rep-name'], 'post_status' => 'draft', 'post_content' => $formdata['rep-text'] ); $post_id = wp_insert_post( $new_post ); //カスタムフィールドに挿入 if($post_id) { update_post_meta($post_id, 'post-name',$name); update_post_meta($post_id, 'post-email',$email); update_post_meta($post_id, 'post-media',$multifile); } } } add_action('wpcf7_mail_sent', 'gloc_wpcf7_insert_post', 10, 1);
###追記(不使用)
コメントのアドバイスに従い、以下のようにしてみました。
間違えている部分を教えて頂けたら幸いです。
//メール送信後に内容を投稿として保存 function gloc_wpcf7_insert_post(){ $submission = WPCF7_Submission::get_instance(); if ( $submission ) { $formdata = $submission->get_posted_data(); $email = $formdata['rep-email']; $name = $formdata['rep-name']; $multifile = $formdata['multifile-819']; $new_post = array( 'post_type' => 'post', 'post_title' => $formdata['rep-name'], 'post_status' => 'draft', 'post_content' => $formdata['rep-text'] ); //下書き保存した記事のID取得 $post_id = wp_insert_post( $new_post ); // $filename はアップロード用ディレクトリにあるファイルのパス。 $filename = $multifile; // ファイルの種類をチェックする。これを 'post_mime_type' に使う。 $filetype = wp_check_filetype( basename( $filename ), null ); // アップロード用ディレクトリのパスを取得。 $wp_upload_dir = wp_upload_dir(); // 添付ファイル用の投稿データの配列を準備。 $attachment = array( //'guid' => $wp_upload_dir['url'] . '/' . basename( $filename ), 'post_mime_type' => $filetype['type'], 'post_title' => preg_replace( '/.[^.]+$/', '', basename( $filename ) ), 'post_content' => '', 'post_status' => 'inherit' ); // 添付ファイルを追加。 $attach_id = wp_insert_attachment( $attachment, $filename, $post_id ); // wp_generate_attachment_metadata() の実行に必要なので下記ファイルを含める。 require_once( ABSPATH . 'wp-admin/includes/image.php' ); // 添付ファイルのメタデータを生成し、データベースを更新。 $attach_data = wp_generate_attachment_metadata( $attach_id, $filename ); wp_update_attachment_metadata( $attach_id, $attach_data ); if($post_id) { update_post_meta($post_id, 'post-name',$name); update_post_meta($post_id, 'post-email',$email); //update_post_meta($post_id, 'post-media',$multifile); update_field('post-media', $multifile, $post_id); } } } add_action('wpcf7_mail_sent', 'gloc_wpcf7_insert_post', 10, 1);
###追記2
(★2)以下のようにしてみましたがカスタムフィールド内に「ultifile Upload Field for Contact Form 7」で作成されたzipのフルパスが返りメディアライブラリにzipが登録されます(※WP本来のカスタムフィールドにフルパスが返り、プラグインで作成したカスタムフィールドには何も返りません)
(★3)update_fieldを使用した場合は何も返りません。
また、(★2)を使用した際(★1)部分のように、ZipArchiveを使用してみましたが、解凍したものをメディアライブラリ及び投稿内に登録できませんでした。
何を間違えているのかわからない状態です。
おかしな部分を教えていただけませんでしょうか?
//メール送信後に内容を投稿として保存 function gloc_wpcf7_insert_post(){ $submission = WPCF7_Submission::get_instance(); if ( $submission ) { $formdata = $submission->get_posted_data(); $media = $submission->uploaded_files(); //ファイルのパス取得準備 $name = $formdata['rep-name']; $email = $formdata['rep-email']; $multifile = $media['multifile-819']; //投稿内にzipのフルパスを取得 $new_post = array( 'post_type' => 'post', 'post_status' => 'draft', 'post_title' => $formdata['rep-name'], 'post_content' => $formdata['rep-text'] ); // (★1)ZIPファイルのパス指定 $zip_path = $multifile; $zip = new ZipArchive(); // ZIPファイルをオープン $res = $zip->open($zip_path); // zipファイルのオープンに成功した場合 if ($res === true) { // 圧縮ファイル内の全てのファイルを指定した解凍先に展開する $zip->extractTo('uploads/'); // ZIPファイルをクローズ $zip->close(); } //メディアライブラリへ添付ファイルを追加 // $filename はアップロード用ディレクトリにあるファイルのパス。 $filename = $multifile; // ファイルの種類をチェックする。これを 'post_mime_type' に使う。 $filetype = wp_check_filetype( basename( $filename ), null ); // アップロード用ディレクトリのパスを取得。 $wp_upload_dir = wp_upload_dir(); // 添付ファイル用の投稿データの配列を準備。 $attachment = array( 'guid' => $wp_upload_dir['url'] . '/' . basename( $filename ), 'post_mime_type' => $filetype['type'],//mime形式を指定「image/png」「image/jpeg」など 'post_title' => preg_replace( '/.[^.]+$/', '', basename( $filename ) ),//ファイル名を指定 'post_content' => '',//空の文字列を指定 'post_status' => 'inherit'//投稿ステータスを指定 ); // 添付ファイルを追加。 $attach_id = wp_insert_attachment( $attachment, $filename, $post_id ); // wp_generate_attachment_metadata() の実行に必要なので下記ファイルを含める。 require_once( ABSPATH . 'wp-admin/includes/image.php' ); // 添付ファイルのメタデータを生成し、データベースを更新。 $attach_data = wp_generate_attachment_metadata( $attach_id, $filename ); wp_update_attachment_metadata( $attach_id, $attach_data ); //下書き保存した記事のID取得 $post_id = wp_insert_post( $new_post ); //update_fieldに対応 $field_key = 'post-media'; $value = $multifile; //カスタムフィールドに内容を入力 if($post_id) { update_post_meta($post_id, 'post-name',$name); update_post_meta($post_id, 'post-email',$email); //update_post_meta($post_id, 'post-media',$filename); //(★2)画像のIDを取得してしまう update_field($field_key, $value, $post_id); //(★3)なにも取得できない } } } add_action('wpcf7_mail_sent', 'gloc_wpcf7_insert_post', 10, 1);