web-dev-qa-db-ja.com

添付ファイルのカスタムフィールドを保存する方法

メディア編集ページに[今すぐ購入]リンクを追加しましたが、他の投稿タイプのようにそのデータを保存することはできません。メディア/添付ファイルの追加/編集/更新後にトリガーされる他のフックはありますか?

私はこの機能を使っています:

function update_attachment_extra_info( $post_id ) {

   // code to update data


}
add_action( 'save_post', 'update_attachment_extra_info' );

しかし、このフックは起動されません。

1
shishir mishra

これは、 Buy Now という名前のカスタムメディアフィールドを追加する例です。この例では、メディア編集画面(ajax以外)と同様に、ajaxを介してカスタムフィールドの値をメディアオーバーレイ画面に保存します。

/**
 * Add custom field to media
 */
add_filter( 'attachment_fields_to_edit', 'wpse256463_attachment_fields', 10, 2 );
function wpse256463_attachment_fields( $fields, $post ) {
    $meta = get_post_meta( $post->ID, 'buy_now', true );
    $fields['buy_now'] = array(
            'label' =>  __( 'Buy Now', 'text-domain' ),
            'input' => 'text',
            'value' => $meta,
            'show_in_edit' => true,
    );

    return $fields;         
}

/**
 * Update custom field within media overlay (via ajax)
 */
add_action( 'wp_ajax_save-attachment-compat', 'wpse256463_media_fields', 0, 1 );
function wpse256463_media_fields() {
    $post_id = $_POST['id'];
    $meta = $_POST['attachments'][ $post_id ]['buy_now'];
    update_post_meta( $post_id , 'buy_now', $meta );

    clean_post_cache( $post_id );
}

/**
 * Update media custom field from edit media page (non ajax).
 */
add_action( 'edit_attachment', 'wpse256463_update_attachment_meta', 1 );
function wpse256463_update_attachment_meta( $post_id ) {
    $buy_now = isset( $_POST['attachments'][ $post_id ]['buy_now'] ) ? $_POST['attachments'][ $post_id ]['buy_now'] : false;
    update_post_meta( $post_id, 'buy_now', $buy_now );
    return;
}
2
Dave Romsey