前回会員登録について書きましたが、今回は記事を外部から投稿する方法についてです。
ちなみに今回記述した外部から投稿させる仕組みを利用してCodetterやWeb制作者の(苦笑)というサービスを運営しています。
ADs
例として、カテゴリの指定と記事内容のみを記事として投稿する場合のHTMLは以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<form action="/" method="post"> <?php $nonce= wp_create_nonce ('my-nonce'); ?> <input type="hidden" id="_wpnonce" name="_wpnonce" value="<?php echo $nonce ?>" /> <dl class="table"> <dt class="ib">カテゴリ</dt> <dd class="ib"> <select name="formct" id="formct"> <?php //カテゴリ一覧をドロップダウンで出力 $args=array( 'orderby' => 'name', 'order' => 'DESC', 'hide_empty' => false ); $categories=get_categories($args); $crcat = get_query_var('cat'); foreach($categories as $category) { if($crcat == $category->term_id){ echo '<option selected="selected" value="'.$category->term_id.'">'.$category->name.'</option>'; } else { echo '<option value="'.$category->term_id.'">'.$category->name.'</option>'; } } ?></select></dd> <dt class="b">テキスト</dt> <dd class="b"><textarea name="formtext" id="formtext" cols="30" rows="10"></textarea></dd> </dl> <input type="submit" value="投稿する" /> </form> |
上記HTMLからPOSTされた内容を受けて、記事として投稿します。
その他投稿時間の指定やユーザーの指定など通常の記事投稿と同じ内容が指定できますので、詳しくはCodexを確認してみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$nonce=$_REQUEST['_wpnonce']; if (!wp_verify_nonce($nonce, 'my-nonce') ) { echo '<p>ワンタイムトークンが異なります。</p>'; } else { $postarr = Array( 'post_status' => 'publish', 'post_category' => Array($_POST["formct"])), 'post_content' => htmlspecialchars($_POST["formtext"]) ); //ここで記事投稿完了 $insert_id = wp_insert_post($postarr); } |
カスタムフィールドやカスタム投稿タイプの指定は、wp_insert_postの処理が完了して記事IDが生成された後でないと行えません。
たとえばカスタムフィールドに投稿者のIPアドレスを登録する場合、上記PHPの$insert_idを受けて以下の様な処理になります。
1 2 3 4 5 6 |
$insert_id = wp_insert_post($postarr); if($insert_id){ $ip = gethostbyaddr($_SERVER["REMOTE_ADDR"]); update_post_meta($insert_id, 'postuserip', $ip); } |
画像の投稿も許可する場合、カスタムフィールドと同様に投稿IDが生成されてから画像添付処理を行います。
HTMLはtype=fileのフォームが必要なのと、formタグ自身にenctypeを追加することを忘れないようにしてください。
1 2 3 4 5 |
formタグはenctypeが必要 <form action="/" method="post" enctype="multipart/form-data"> type="file"のフォームも必要 <input type="file" sise="50" name="formpict" id="formpict" /> |
そして$insert_id(投稿ID)が生成されてformpictがPOSTされた場合に添付ファイルアップロードの処理を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
if($insert_id && $_POST['formpict']){ $upload_dir_var = wp_upload_dir(); $upload_dir = $upload_dir_var['path']; $filename = basename($_FILES['pict01']['name']); $filename = trim($filename); $filename = ereg_replace(" ", "-", $filename); $typefile = $_FILES['pict01']['type']; $uploaddir = realpath($upload_dir); $uploadfile = $uploaddir.'/'.$filename; $slugname = preg_replace('/\.[^.]+$/', '', basename($uploadfile)); if ( file_exists($uploadfile) ) { $count = "0"; while ( file_exists($uploadfile) ) { $count++; if ( $typefile == 'image/jpeg' ) { $exten = 'jpg'; } elseif ( $typefile == 'image/png' ) { $exten = 'png'; } elseif ( $typefile == 'image/gif' ) { $exten = 'gif'; } $uploadfile = $uploaddir.'/'.$slugname.'-'.$count.'.'.$exten; } } if (move_uploaded_file($_FILES['pict01']['tmp_name'], $uploadfile)) { $slugname = preg_replace('/\.[^.]+$/', '', basename($uploadfile)); $attachment = array( 'post_mime_type' => $typefile, 'post_title' => $slugname, 'post_content' => '', 'post_status' => 'inherit' ); $attach_id = wp_insert_attachment( $attachment, $uploadfile, $post_id ); require_once(ABSPATH . "wp-admin" . '/includes/image.php'); $attach_data = wp_generate_attachment_metadata( $attach_id, $uploadfile ); wp_update_attachment_metadata( $attach_id, $attach_data ); } else { //エラー時の処理はここに書く } } |
以上、長々と書きましたが、ショートコードで簡単に投稿フォームを生成してくれるプラグインが存在します。
プラグインをインストール後、以下のようなショートコードを投稿すると投稿フォームが表示されます。
1 |
[user-submitted-posts] |
なお、このプラグインはnonceを使用していないのでそのまま使用するとCSRFの脆弱性が存在します。
対策は以前投稿したWordPressプラグイン[User Submitted Posts]がnonceを使っていないのをなんとかするという記事をご覧ください。
ADs