tips

フロントエンドから記事を新規追加するときにメディアの添付先を当該記事に設定する。

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' );

?>

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です