人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Wordpressで会員サイトを作っています。
そこで会員に管理画面に入らなくても記事を生成するページを作りたいと思い色々探してみました。
イメージとしてはカスタムフィールドも使ったこのページのような感じです。
http://yosshi.biz/34/wordpress%E3%81%AE%E5%85%A5%E5%8A%9B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%8B%E3%82%89custom-field%E3%81%AB%E3%82%BB%E3%83%83%E3%83%88%E3%81%99%E3%82%8B/

また関数として「wp_insert_post()」というのを知って以下のページも見つけたのですが、
http://weble.org/2011/03/23/wordpress-wp_insert_post
http://codetter.com/?p=179

これをどのテンプレートにどのように組めばいいのかがいまいちよく分かりません。
お手数ですがご教授願います。


●質問者: 門屋 徹郎
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● rouge_2008
●200ポイント ベストアンサー

WordPressのルートディレクトリに、以下のコードを記述したphpを配置し、フォームのアクションに指定するといいです。
(フォームは固定ページとして作成すればいいと思いますが、専用のページテンプレートに記述した方が良さそうです。
固定ページの本文に記述しても動作はしますが、WordPressの標準機能で意図しない箇所に勝手にbrが追加されていたので・・・)

<?php

// どちらをロードしても大丈夫でしたが、ドキュメントで紹介されているのはwp-blog-header.phpでした。
// http://codex.wordpress.org/Integrating_WordPress_with_Your_Website
require('./wp-blog-header.php');
//require('./wp-load.php');

if(!empty($_POST)) {
 // フォームに合わせて、それぞれ任意の変数名・項目数にしてください。
 // この例では、投稿本文、投稿タイトル、投稿のタグ、投稿者名、映画、本になっています。(投稿者名、映画、本は、カスタムフィールドとして追加します。)
 $content = esc_html($_POST['content']);
 $title = esc_html($_POST['title']);
 $tags = esc_html($_POST['tag']);
 $author = esc_html($_POST['post_author']);
 $movie = esc_html($_POST['movie']);
 $book = esc_html($_POST['book']);

 $post = array(
 //'ID' => [ <投稿 ID> ], // 既存の投稿を更新する場合。
 //"menu_order" => "0", // 追加する投稿が固定ページの場合、ページの並び順を番号で指定できます。
 "comment_status" => "open", // 'closed' はコメントを閉じます。
 "ping_status" => "open", // 'closed' はピンバック/トラックバックをオフにします。
 //"pinged" => "", // ピンバック済。
 "post_author" => "1", // 作成者のユーザー ID。
 //'post_category' => $category, // カテゴリーを追加。
 "post_content" => $content, // 投稿の全文。
 //"post_date" => $postdate, // 投稿の作成日時。
 //"post_date_gmt" => $postdate_gmt, // 投稿の作成日時(GMT)。
 //"post_excerpt" => "", // 投稿の抜粋。
 //"post_name" => "", // 投稿スラッグ。
 //"post_parent" => "", // 親投稿の ID。
 //"post_password" => "", // 投稿の閲覧時にパスワードが必要になります。
 "post_status" => "publish", // 公開ステータス。 
 "post_title" => $title, // 投稿のタイトル。
 "post_type" => "post", // 投稿タイプ名。
 'tags_input' => $tags, // 投稿タグ。
 //"to_ping" => " ", //? (PINGするかしないか?)
 //"post_modified" => " ",
 //"post_modified_gmt" => " ",
 //"post_content_filtered" => " ",
 //"guid" => " ",
 //"post_mime_type" => " ",
 //"comment_count" => "0"
 );
 
 $post_id = wp_insert_post($post);

 if($post_id != '0') {
 add_post_meta($post_id, 'mcf_author', $author); // 任意のカスタムフィールド名に変更してください。
 add_post_meta($post_id, 'mcf_movie', $movie); // 任意のカスタムフィールド名に変更してください。
 add_post_meta($post_id, 'mcf_book', $book); // 任意のカスタムフィールド名に変更してください。
 }

}

header('Location: http://example.jp/thanks'); // 事前に作成しておいたサンクスページに遷移させます。

?>


まず先に「wp_insert_post()」で記事IDを取得し、取得したIDで「add_post_meta()」を実行して、カスタムフィールドを追加する流れになっています。

http://wpdocs.sourceforge.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_post
http://wpdocs.sourceforge.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/add_post_meta

・ページテンプレートについて
http://wpdocs.sourceforge.jp/Pages#Page_Templates


門屋 徹郎さんのコメント
ありがとうございます! ページテンプレートに記述するというのはこの処理用にテンプレートを作って組み込みということですね。これで一度テストしてみます。

rouge_2008さんのコメント
追記です・・・m(__)m テーマを利用しない場合は、wp-load.phpを読み込む方が良いそうです。 上記のphpの場合、テンプレートは使用しません。 http://ja.forums.wordpress.org/topic/3475?replies=20#post-14312 >> WordPress のタグが使いたい場合は、wp-blog-header.php ではなく wp-load.php を Require するほうがより良いですね。 この辺も参考にしてみてください。 http://ja.forums.wordpress.org/topic/1918?replies=6 << http://ja.forums.wordpress.org/topic/3475?replies=20#post-14321 >> WordPress のタグ等を使用したいだけであれば、wp-load.phpを require するだけで充分だからです。 ソースを読んでもらえば分かるのですが、 wp-blog-header.php では wp-load.php を require した後、グローバル変数 $wp_query を作って wp-includes/template-loader.php を require しています。 これらは、WordPress テーマのテンプレート上にデータを展開するために必要な処理です。 wp-login.php など、テーマのテンプレート上にデータを展開する必要が無い処理では wp-load.php だけを require していますね。 <<

門屋 徹郎さんのコメント
追加のアドバイスありがとうございます! あの・・質問締めきっててあれなんですが・・カスタムフィールドも合わせて追加する場合、フォーム画面はどう作ればいいでしょうか・・? またその際上記のphpファイルの add_post_meta($post_id, 'mcf_book', $book);内の'mcf_bok'は日本語でいいのでしょうか? もしお答え頂けるのでしたらで結構ですので・・失礼します。

rouge_2008さんのコメント
すみません。途中で送信してしまいました・・・ カスタムフィールドに追加したい項目も同じフォームで一緒に送信し、phpで受け取って処理しますので、他の項目と同じように普通にフォームの入力項目として作成します。 前半部分の次の記述で、フォームから送信された各カスタムフィールドの内容を取得しています。 ※例では、フォームの「name="post_author"」「name="movie"」「name="book"」の入力項目から送信された値を、カスタムフィールドの値として取得しています。 (任意で変更して大丈夫ですが、$_POST['?????']を変更する場合は、フォームの項目名も合わせて変更します。値を代入している変数を変更する場合は、add_post_meta()の値の変数指定を合わせて変更します。) >|| $author = esc_html($_POST['post_author']); $movie = esc_html($_POST['movie']); $book = esc_html($_POST['book']); ||< > またその際上記のphpファイルの add_post_meta($post_id, 'mcf_book', $book);内の'mcf_bok'は日本語でいいのでしょうか? 日本語でも大丈夫です。 ファイルの文字コードはUTF-8(BOMなし)にしてください。(カスタムフィールド名を英語にする場合でもUTF-8(BOMなし)で保存します。)

門屋 徹郎さんのコメント
なるほど・・。 実はまだ投稿に成功していません。こちらのフォームの問題だと思うのですが。。 頂いたサンプルコードは http:/root/sample.php に置きました。 フォーム側のコードは >|| <form name="postform" id="postform" action="post.php" method="POST"> <p> タイトル<br /> <input type="text" id="title" name="title" size="50" /> </p> <p> 本文<br /> <textarea id="content" name="content" rows="10" cols="80"></textarea> </p> <p> エリア<br /> <select id="area" name="area"> <option selected>選択して下さい</option> <option value="北海道">北海道</option> ↓ <option value="沖縄県">沖縄県</option> <select> </p> <p> <input type="button" name="submit" value="送信" onclick="sendform(); return false;" /> </p> </form> <p>送信結果<br /> <textarea id="response" rows="10" cols="80"></textarea> </p> ||< としました。 sample.phpの中身は $area = esc_html($_POST['エリア']); を追加し、 if($post_id != '0') { add_post_meta($post_id,'mcf_author',$author); } に変更しました。 やっぱりカスタムフィールドの処理でしょうか・・???

rouge_2008さんのコメント
> 頂いたサンプルコードは http:/root/sample.php に置きました。 そうなのでしたら、post.phpではなく、actionにはsample.phpを指定する必要があります。 >|| <form name="postform" id="postform" action="sample.php" method="POST"> ||< ※上記はフォームの固定ページも「http://example.jp/XXXXX」など、WPのルートにある場合です。 それから、「onclick="sendform(); return false;"」でjavascriptに処理を渡しているようですが、まずは普通にPHPに処理を渡して、投稿が完了するか確認してみてください。 >|| <input type="button" name="submit" value="送信" /> ||< それから、次のようにエリアの入力項目を「name="area"」としているようですから、 >|| <select id="area" name="area"> ||< $_POSTの値の取得と変数への代入は次のようになります。 >|| $area = esc_html($_POST['area']); ||< 次のようにadd_post_meta()に指定します。 >|| add_post_meta($post_id,'エリアなど任意の名前',$area); ||< 上記は次のようになっています。回答に記載したwp_insert_post()のドキュメントページを確認してください。 >|| add_post_meta(wp_insert_post()の返り値(投稿ID),'カスタムフィールドの名前',値を代入した変数); ||< http://php.net/manual/ja/reserved.variables.post.php http://www.atmarkit.co.jp/flinux/rensai/mysql5_02/mysql5_02a.html

門屋 徹郎さんのコメント
ケアレスミスが多いですね、申し訳ありません。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ