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人2回まで
  • 13歳以上
  • 登録:2012/03/11 17:14:58
  • 終了:2012/03/12 09:32:20

ベストアンサー

id:rouge_2008 No.1

rouge_2008回答回数594ベストアンサー獲得回数3512012/03/12 01:43:39

ポイント200pt

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

他5件のコメントを見る
id: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

2012/03/12 22:17:24
id:kadopi

ケアレスミスが多いですね、申し訳ありません。

2012/03/12 23:10:47
  • id:kuroyuli
    質問に直接答える形では無いので、コメントで失礼します。元々ブログ用のシステムであるWordPressで会員用サイトを作るのは、面倒で限界もあると思います。専用のシステムであるXOOPSなども検討されてみてはいかがでしょうか?
  • id:kadopi
    門屋 徹郎 2012/03/12 08:44:51
    ありがとうございます。
    そうなんですよね(笑)本当は専用のシステムを組めればベストなのですが、時間と技術的なスキルを検討してプロトタイプとしてでもいいから完成させようということでWPで組むことにしました。
    スキルがないって悲しいなぁ・・OTZ

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません