質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

3058閲覧

ContactForm7に添付したファイルを投稿に挿入したい

bpbjsu

総合スコア24

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/11/20 16:57

編集2017/12/02 16:57

###状況
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);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/27 03:53

こちらはもう解決してますか?今更解決策は要りませんか?
bpbjsu

2018/01/27 11:14

度々申し訳ありません。教えて頂きたいです。
guest

回答1

0

$submission->uploaded_files() で取得できるようです。下記サイトにいくつか使用例があります。

【WPCF7_Submission::get_instance PHP Method Code Examples - HotExamples】
https://hotexamples.com/examples/-/WPCF7_Submission/get_instance/php-wpcf7_submission-get_instance-method-examples.html

wp_insert_attachment で WordPressに登録。

【関数リファレンス/wp insert attachment - WordPress Codex 日本語版】
https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wp_insert_attachment

update_field で記事に紐付け。

【ACF | update_field()】
https://www.advancedcustomfields.com/resources/update_field/

投稿2017/11/20 17:14

kei344

総合スコア69407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bpbjsu

2017/11/20 18:29

回答ありがとうございます。 早速、リンク先を参考にして以下のようにしてみましたが動作しません。 どこがまずいのか見当がつかない状態です。申し訳ございませんが教えて頂けませんでしょうか? //メール送信後に内容を投稿として保存 function gloc_wpcf7_insert_post(){ $submission = WPCF7_Submission::get_instance(); if ( $submission ) { $formdata = $submission->get_posted_data(); $formdata2 = $submission->uploaded_files(); $email = $formdata['rep-email']; $name = $formdata['rep-name']; $multifile = $formdata2['multifile-819']; // $filename はアップロード用ディレクトリにあるファイルのパス。 $filename = '../uploads/'; // ファイルの種類をチェックする。これを '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, $parent_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 ); $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); update_field($post_id, 'post-media',$multifile); } } } add_action('wpcf7_mail_sent', 'gloc_wpcf7_insert_post', 10, 1);
kei344

2017/11/20 18:45

コメントエリアではマークダウンが使えないため、コードはここではなく質問文に追記してください。(決して元のコードを消さないでください) また、一気に実装するのではなく、必要な値が取得できているかを1つずつ確認してみてください。
bpbjsu

2017/11/21 05:21

失礼しました、質問文に追記させていただきました。
kei344

2017/11/21 06:34

追記分とコメントのコードが違います。また、ファイルをuploaded_files()で受け取った後の処理が提示したリンク先と違うようです。
bpbjsu

2017/12/02 16:58

自分なりに編集したコードを追記させて頂きました。
kei344

2017/12/03 14:56

(★2)は解凍しておいて解凍済みのファイルを呼び出さずにzipファイルを渡しているからですね。 (★3)は'post-media'に何を入れるつもりかわかりませんがファイルをそのまま入れようとして入らないだけでは。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問