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

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

ただいまの
回答率

91.37%

  • PHP

    15137questions

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

  • WordPress

    4756questions

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

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

受付中

回答 1

投稿 2017/11/21 01:57 ・編集 2017/12/03 01:57

  • 評価
  • クリップ 0
  • VIEW 97

izumigt

score 12

状況

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);
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 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/21 02:14

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/21 03: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);

    キャンセル

  • 2017/11/21 03:45

    コメントエリアではマークダウンが使えないため、コードはここではなく質問文に追記してください。(決して元のコードを消さないでください)

    また、一気に実装するのではなく、必要な値が取得できているかを1つずつ確認してみてください。

    キャンセル

  • 2017/11/21 14:21

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

    キャンセル

  • 2017/11/21 15:34

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

    キャンセル

  • 2017/12/03 01:58

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

    キャンセル

  • 2017/12/03 23:56

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

    キャンセル

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

ただいまの回答率

91.37%

関連した質問

同じタグがついた質問を見る

  • PHP

    15137questions

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

  • WordPress

    4756questions

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