BuddyPressのユーザーページに投稿機能とユーザー投稿一覧
ユーザー投稿用のフォームを組み込もう
BuddyPressでのユーザーページの基本的な追加方法は前回の記事を参考にしてくださいね。
まずはフォームをざっと作ります。
works_add.php フォーム部分
以下がフォームのHTMLになります。ファイルのアップロードをしたいフォームでは formタグにenctype multipart/form-dataを忘れずの設定してください。
また、タグ、画像など同じ項目に複数データを登録するようなものはname属性に[]を忘れずに設置。action先は自分自身、ということで空。
だいたいフォームの項目はこんな感じ。カスタムフィールド、タグ、画像(アイキャッチ含む)、カテゴリーもやるので、一通りのフロントエンドからの記事登録はこなせる仕様にしたいと思います。
works_add.php PHP部分
functions.phpに書くことも出来なくないのですが、けっこうプログラム自体長くなってしまうので、同一ファイルのHTMLよりも上に書くことにしました。
画像のアップロードに関する処理はこちらの記事を参考にしてください。
記事投稿に関するwp_insert_post($post)に関してはcodexを参考に。
投稿者のIDについては$bp->loggedin_user->idで現在ログイン中のユーザーIDで登録します。
フォームで入力された内容を登録するのですが、htmlを除去するstrip_tugs()を使いました。
また、post_categoryは個別に指定してあげてください。これを設定しないと未分類になります。あらかじめ管理画面からカテゴリーを追加し、そのカテゴリーIDを設定して下さい。
/*画像をアップロードして、アイキャッチを登録する処理*/
function insert_attachment($file_handler,$post_id,$setthumb='false')
{
if ($_FILES[$file_handler]['error'] !== UPLOAD_ERR_OK) __return_false();
require_once(ABSPATH . "wp-admin" . '/includes/image.php');
require_once(ABSPATH . "wp-admin" . '/includes/file.php');
require_once(ABSPATH . "wp-admin" . '/includes/media.php');
$attach_id = media_handle_upload( $file_handler, $post_id );
if ($setthumb)
update_post_meta($post_id,'_thumbnail_id',$attach_id);
return $attach_id;
}
/*画像をアップロードして、アイキャッチを登録する処理ここまで*/
/*タグの入力があれば、HTMLの排除をしつつ登録*/
if(isset($_POST['field_3'])){
foreach($_POST['field_3'] as $tags){
if($tags !=""){
$tag .= strip_tags($tags).','; //入力されたタグをカンマ区切りでつなげる
}
}
$tag = mb_substr($tag, 0, -1);//最後に余分なカンマを削除
/*タグに関する処理、ここまで*/
$post = array(
//'ID' => [ <投稿 ID> ] // 既存の投稿を更新する場合。
'comment_status' => 'closed', // 'closed' はコメントを閉じます。
'ping_status' => 'closed', // 'closed' はピンバック/トラックバックをオフにします。
'post_author' => $bp->loggedin_user->id, // 作成者のユーザー ID。ログインしているID
'post_category' => array(2), // カテゴリーを追加。配列で複数OK
'post_content' => $_POST['field_4'], // 投稿の全文。
'post_date' => date('Y-m-d H:i:s'),
'post_date_gmt' => date('Y-m-d H:i:s'), // 投稿の作成日時(GMT)。
'post_status' => 'publish', // 公開ステータス。
'post_title' => strip_tags($_POST['field_1']), // 投稿のタイトル。
'post_type' => 'post', // 投稿タイプ名。
'tags_input' => $tag// 投稿タグ。
);
$insert_id = wp_insert_post($post);//$insert_idには投稿のID(「wp_posts」テーブルの「ID」)が入る。 投稿に失敗した場合は0が返る。
if($insert_id) {
update_post_meta($insert_id, 'url', strip_tags($_POST['field_2'])); // キーが「key1」のカスタムフィールドの値に「カスタム1」を投稿
/*画像アップロードに関すること*/
global $post;
if ($_FILES) {
$files = $_FILES['upload_attachment'];
foreach ($files['name'] as $key => $value) {
if ($files['name'][$key]) {
$file = array(
'name' => $files['name'][$key],
'type' => $files['type'][$key],
'tmp_name' => $files['tmp_name'][$key],
'error' => $files['error'][$key],
'size' => $files['size'][$key]
);
$_FILES = array("upload_attachment" => $file);
foreach ($_FILES as $file => $array) {
$newupload = insert_attachment($file,$insert_id);
}
}
}
}
/* 投稿に成功した時の処理等を記述 */
} else {
/* 投稿に失敗した時の処理等を記述 */
}
}
次に登録された内容を各ユーザーページに出力します。