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

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

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

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

PHP

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

プラグイン

プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。

Q&A

解決済

2回答

6936閲覧

【WP】MW WP Formで公開ページから送信されたデータを画像付きで投稿に保存したい

rjunakc

総合スコア368

WordPress

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

PHP

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

プラグイン

プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。

0グッド

0クリップ

投稿2020/05/26 03:09

前提・実現したいこと

WordPressのMW WP Formを利用して、未ログインの方からメールを送ってもらった際に、画像のアップロードも許可し、その情報を投稿に下書き状態で保存したいと考えています。
以下のコードでテキスト情報は問題なく投稿に下書き保存されました。

WordPress

1// MW WP Form 2タイトル:[mwform_text name="title"] 3カテゴリ:[mwform_radio name="category" children="1:カテゴリ1,2:カテゴリ2"] 4本文:[mwform_textarea name="honbun" rows="10"]

PHP

1// functions.php 2function save_posts_form_xxx(){ 3 $new_post = array( 4 'post_type' => 'post', 5 'post_status' => 'draft', 6 'post_title' => $_POST['title'], 7 'post_author' => 1, 8 'post_content' => $_POST['honbun'], 9 'post_category' => array( $_POST['category'] ), 10 ); 11 $post_id = wp_insert_post( $new_post, true ); 12} 13add_filter( 'mwform_before_send_admin_mail_mw-wp-form-xxx', 'save_posts_form_xxx' ); 14// xxxはMW WP Formのフォームキー 15

ここでファイルを追加し、画像やファイルのアップロードをできるようにしたのですが、それを投稿に保存する方法が知りたいです。

試したこと

フォームタグを追加し、上記「mwform_before_send_admin_mail_mw-wp-form-xxx」フックの中で値を取得してみたのですが

WordPress

1// 上記に追加 2[mwform_file name="photo"]

PHP

1// functions.php 2function save_posts_form_xxx(){ 3 // $new_post = array( 4 // 'post_type' => 'post', 5 // 'post_status' => 'draft', 6 // 'post_title' => $_POST['title'], 7 // 'post_author' => 1, 8 // 'post_content' => $_POST['honbun'], 9 // 'post_category' => array( $_POST['category'] ), 10 // ); 11 // $post_id = wp_insert_post( $new_post, true ); 12 13 // 取得した値を確認 14 var_dump($_POST['photo']); 15 exit; 16} 17add_filter( 'mwform_before_send_admin_mail_mw-wp-form-xxx', 'save_posts_form_xxx' ); 18
// 出力 string(000) "https://www.xxxxxxxxx.jp/wp-content/uploads/mw-wp-form_uploads/000000000000000000000.png"

このように表示されます。恐らくテンポラリの画像URLだと思います。
(このURLにアクセスしても何も表示されませんでした。)

知りたいこと

上記フック内でアップロードした画像を投稿のアイキャッチ画像に設定する方法が知りたいです。
画像IDが取得できれば、なんとかできそうな気がするのですが、既に実装されている方や方法をご存じの方がいれば、ご教授いただきたいと思います。

ちなみに、普通に画像を投稿してメディアに保存されることは確認済です。

補足情報

WordPress及びMW WP Formは2020/5/26現在の最新版を使用しています。

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

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

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

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

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

guest

回答2

0

自己解決

スマートではない方法ですが、以下のフックでやりたいことは可能になりました。

PHP

1// functions.php 2function save_posts_form_xxx(){ 3 $new_post = array( 4 'post_type' => 'post', 5 'post_status' => 'draft', 6 'post_title' => $_POST['title'], 7 'post_author' => 1, 8 'post_content' => $_POST['honbun'], 9 'post_category' => array( $_POST['category'] ), 10 ); 11 $post_id = wp_insert_post( $new_post, true ); 12 13 // ■画像の登録 14 // テンポラリURLの取得 15 $filename = $_POST['photo_image']; 16 // ファイルタイプを取得 17 $filetype = wp_check_filetype( basename( $filename ), null ); 18 // uploadディレクトリを取得 19 $wp_upload_dir = wp_upload_dir(); 20 // アップロードパスを取得 21 $guid = $wp_upload_dir['url'] . '/' . basename( $filename ); 22 // メディアライブラリ登録用情報 23 $attachment = array( 24 'guid' => $guid, 25 'post_mime_type' => $filetype['type'], 26 'post_title' => preg_replace( '/.[^.]+$/', '', basename( $filename ) ), 27 'post_content' => '', 28 'post_status' => 'inherit' 29 ); 30 // メディアライブラリへ登録 31 $attach_id = wp_insert_attachment( $attachment, $guid, $post_id ); 32 // 「wp_generate_attachment_metadata」を利用するために読込 33 require_once( ABSPATH . 'wp-admin/includes/image.php' ); 34 // 画像のメタデータを生成 35 $attach_data = wp_generate_attachment_metadata( $attach_id, $filename ); 36 // 画像を登録 37 wp_update_attachment_metadata( $attach_id, $attach_data ); 38 // アイキャッチ画像に設定 39 set_post_thumbnail( $post_id, $attach_id ); 40} 41add_filter( 'mwform_before_send_admin_mail_mw-wp-form-xxx', 'save_posts_form_xxx' );

これだと、プラグインによる通常のメディアライブラリへの登録と、このフックの画像登録の2重にDBへ登録されるため、メディアライブラリ一覧ではダブって表示されますが、やりたいことは可能になりました。

現状、動いているので今回はこれで解決とさせていただきます。

投稿2020/05/27 04:53

rjunakc

総合スコア368

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

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

hayato7

2020/05/27 06:54

結局そういう風にやる必要がでてくるんですね。 あの時点で、メディアライブラリに保存されていないということは、MW WP Formの改修をお願いする以外ありませんね。 メディアのダブりは、「問い合わせデータをデータベースに保存」をオフにするしかなさそうです。
rjunakc

2020/05/27 07:35

そうなんです。結局hayato7さんの仰るとおり、独自処理でしか現在のところできないような感触です。 「問い合わせデータをデータベースに保存」をオフにすると、今度は「$_POST['photo_image']」が受け取れなくなるようでした。 結局ダブらせるしかないのかもしれません。
guest

0

以前似たようなことをしましたが、その時はMW WP formのメディア保存を利用せずに、渡ってきたデータから独自処理でメディア保存を行ったので、今回とは少し異なる対応です。(メディア保存をりようしない場合も、POSTの中の画像URLにはすでにデータがなかったので、移動先のURLを作り出して、そこにある画像を保存していました。)

ひとまずですが、mwform_before_send_admin_mail_mw-wp-form- のフックでは、第二引数にフォームのデータが渡ってくるので、それを受け取り、その中に画像IDが入っていないか確認してみるのがいいと思います。

以下、追記
確認してみましたところ、MW WP FORMでメディア保存をしている場合、URLが取得できました。

php

1$url = $data->get_raw('[欲しい画像のinputタグのname]'); 2$img_id = attachment_url_to_postid( $url );

これで、画像idが取得できるのではないでしょうか。

投稿2020/05/26 04:38

編集2020/05/26 10:37
hayato7

総合スコア1135

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

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

rjunakc

2020/05/26 04:53

save_posts_form_xxx($aaa, $bbb)とすると、 Fatal error: Uncaught ArgumentCountError: Too few arguments to function save_posts_form_xxx(), 1 passed in /xxx/yyy/zzz/wp-includes/class-wp-hook.php on line 289というエラーが表示されますが、なぜでしょう? save_posts_form_xxx($aaa)だとエラーは表示されず、メールの情報が入っているようです。(画像の情報は上記と同じものしかありませんでした。)
rjunakc

2020/05/26 05:08

自己解決です。 add_filterで$accepted_argsを指定していませんでした。
rjunakc

2020/05/26 05:12

残念ながらどちらの引数にもそれらしきIDはありませんでした。 この時点では画像もテンポラリのものらしきアドレスしかありません。まだ正式にアップロードされていなく、投稿IDが割り振られていないのでしょうか。
rjunakc

2020/05/27 04:43

追記ありがとうございます。 確認したところ、確かに「$data->get_raw」でアップロードURLは取得できましたが、その時点ではDBに登録されていないのか、「attachment_url_to_postid( $url );」では「int(0)」が返ってきました。 ※FTPで見たところファイルはアップロードされています。
rjunakc

2020/05/27 04:55

hayato7様 お時間を割いて頂きありがとうございました。 「$data->get_raw」など有用な情報をいただきましたが、別途自己解決したため解決とさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問