PDF image generatorという拙作プラグインをwordpress.orgに公開しているけれど、そこのフォーラムに「フロントエンドからの投稿では添付ファイルの親投稿が指定されないから、プラグインをカスタマイズする方法を希望うんたら」という、質問があった。プラグインとは関係がなさそうだったけども、つい流れで答えてしまったのでコードだけここにメモしておきます。私自身はなかなか会員制サイトとか作る機会はなさそうですが、万が一役に立つかもしれないしね。
たとえばこんな感じで投稿欄をページテンプレートに設置されている場合の話。
<style type="text/css">
#__wp-uploader-id-0 a.media-button-insert { font-size:0; }/*#__wp-uploader-id-0 == .media-frame*/
#__wp-uploader-id-0 a.media-button-insert:before { display:block; content:'記事に挿入する'; font-size:15px; }
</style>
<form action="<?php the_permalink();?>" id="<?php echo $post->ID; ?>" method="POST">
<?php
if ( isset( $_POST['editor_id'] ) ) {
$post_information = array(
'post_title' => 'test',
'post_content' => $_POST['editor_id'],
'post_type' => 'post',
'post_status' => 'pending'
);
wp_insert_post( $post_information );
}
wp_enqueue_media( array( 'post' => $post->ID )); // upload file to submitpage
$editor_id = 'editor_id';
$args = array(
'textarea_rows' => 15,
'quicktags' => false,
'textarea_name' => $editor_id,
'media_buttons' => true,
'drag_drop_upload' => true,
);
wp_editor( '','editor_id', $args );
?>
<button type="submit"><?php _e('Add Post') ?></button>
</form>
ここで大事な箇所は wp_enqueue_media( array( ‘post’ => $post->ID ))というところ。新しく作成される記事にはIDがまだ存在していないので、アップロードしたメディアを投稿フォームの設置されたページのIDに一旦添付します。そして、以下のようにsave_postフックで投稿処理中に、添付先IDを新しい記事に差し替えます。
<?php
function tempo_id_for_frontend( $attachment_id ){ // run after an attachment is added to the DB
global $post;
$user_id = $_SERVER["REMOTE_ADDR"]; // get_current_user_id();
$submit_id = get_page_by_path( 'your_submit_page_slug' )->ID; // set the page slug of the submit page
$attachment = get_post( $attachment_id );
if ( $attachment->post_parent == $submit_id && $user_id ){
$tempo_ids = get_post_meta( $submit_id, '_id_for_frontend', true); // set attachment id in the customfield of the submit page
if( !$tempo_ids ) $tempo_ids = array();
$tempo_ids = $tempo_ids += array( $attachment_id => $user_id );
update_post_meta( $submit_id, '_id_for_frontend', $tempo_ids );
}
return $attachment_id;
}
add_filter( 'add_attachment', 'tempo_id_for_frontend', 99, 2 );
function save_post_for_frontend ( $post_id ) {
if ( !is_admin() ){
$user_id = $_SERVER["REMOTE_ADDR"]; // wp_get_current_user()->ID;
$submit_id = get_page_by_path( 'your_submit_page_slug' )->ID; // set the page slug of the submit page
if( get_post_type( $post_id ) === 'post' && $user_id ){
$tempo_ids = get_post_meta( $submit_id, '_id_for_frontend', true);
if( $tempo_ids ) : foreach ($tempo_ids as $key => $val ) : // pick attachment ids from the customfield
if ( $val == $user_id ){
$at_post = array();
$at_post['ID'] = $key;
$at_post['post_parent'] = $post_id;
wp_update_post( $at_post );
}
unset( $tempo_ids[$key] );
endforeach; endif;
if( $tempo_ids ) update_post_meta( $submit_id, '_id_for_frontend', $tempo_ids );
else delete_post_meta( $submit_id, '_id_for_frontend' );
}
}
}
add_action( 'save_post', 'save_post_for_frontend' );
?>