web-dev-qa-db-fra.com

Comment enregistrer des champs personnalisés pour les pièces jointes

J'ai ajouté un lien personnalisé "Acheter maintenant" sur la page d'édition du média, mais je ne suis pas en mesure de sauvegarder ces données comme d'autres types d'articles. Existe-t-il un autre crochet déclenché après l'ajout/la modification/la mise à jour d'un support/d'une pièce jointe?

J'utilise cette fonction:

function update_attachment_extra_info( $post_id ) {

   // code to update data


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

Mais ce crochet n'est pas déclenché.

1
shishir mishra

Voici un exemple qui ajoute un champ multimédia personnalisé nommé Buy Now . Cet exemple enregistre la valeur du champ personnalisé sur l'écran de superposition de support via ajax, ainsi que l'écran d'édition de support (non 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