Aggiungere un pulsante di caricamento nel metabox

7 ago 2013, 13:24:47
Visualizzazioni: 17.7K
Voti: 4

Voglio aggiungere un pulsante per caricare immagini e recuperare l'URL. Qualcuno può aiutarmi? Ci sto provando da diversi giorni. Sto usando il codice da questo thread Create more Meta Boxes as needed.

add_action( 'add_meta_boxes', 'dynamic_add_custom_box' );

/* Fa qualcosa con i dati inseriti */
add_action( 'save_post', 'dynamic_save_postdata' );

/* Aggiunge un box nella colonna principale nelle schermate di modifica di Post e Pagine */
function dynamic_add_custom_box() {
    add_meta_box(
        'dynamic_sectionid',
        __( 'Informazioni Cliente', 'myplugin_textdomain' ),
        'dynamic_inner_custom_box',
        'page');
}

/* Stampa il contenuto del box */
function dynamic_inner_custom_box() {
    global $post;
    // Usa nonce per la verifica
    wp_nonce_field( plugin_basename( __FILE__ ), 'dynamicMeta_noncename' );
    ?>
    <div id="meta_inner">
    <?php

    // Ottieni i meta salvati come array
    $ourwork = get_post_meta($post->ID,'ourwork',true);

    $c = 0;
    if ( is_array( $ourwork ) ) {
        foreach( $ourwork as  $track ) {
            if ( isset( $track['thumb'] ) || isset( $track['client-img1'] ) || isset( $track['client-img2'] ) || isset( $track['client-img3'] ) || isset( $track['client-img4'] ) || isset( $track['client-desc'] ) ) {
                printf( '<p><strong>Immagine Thumbnail</strong> &nbsp;:&nbsp;<input type="button" name="ourwork[%1$s][thumb]" value="%2$s" size="50" /><br/><br/><strong>Immagine Cliente 1</strong> : <input type="button" name="ourwork[%1$s][client-img1]" value="%3$s" size="50" /><br/><br/>
                <strong>Immagine Cliente 2</strong> : <input type="button" name="ourwork[%1$s][client-img2]" value="%4$s" size="50"/><br/><br/>
                <strong>Immagine Cliente 3</strong> : <input type="button" name="ourwork[%1$s][client-img3]" value="%5$s" size="50" /><br/><br/>
                <strong>Immagine Cliente 4</strong> : <input type="button" name="ourwork[%1$s][client-img4]" value="%6$s" size="50" />
                <br/><br/>
                <strong>Link Cliente &nbsp;&nbsp;&nbsp;&nbsp;1</strong> : <input type="text" name="ourwork[%1$s][client-link1]" value="%7$s" size="50" />
                <br/><br/>
                <strong>Descrizione Cliente</strong> :<br/><textarea id="elm1" class="tinymce_data" name="ourwork[%1$s][client-desc]" cols="75" rows="6" >%8$s</textarea><br/>
                <span class="remove">%9$s</span></p>', $c, $track['thumb'], $track['client-img1'], $track['client-img2'] , $track['client-img3'], $track['client-img4'], $track['client-link1'], $track['client-desc'],  __( '<span class="button">Rimuovi Sezione</span>' ) );
                $c = $c +1;
            }
        }
    }
    ?>
<span id="here"></span>
<span class="add"><?php _e('<span class="button">Aggiungi Sezione</span>'); ?></span>
<script>
    var $ =jQuery.noConflict();
    $(document).ready(function() {
        var count = <?php echo $c; ?>;
        $(".add").click(function() {
            count = count + 1;

            $('#here').append('<p><strong>Immagine Thumbnail</strong> &nbsp;:&nbsp;<input type="button" name="ourwork['+count+'][thumb]" value="" size="50"/><br/><br/><strong>Immagine Cliente 1</strong> : <input type="type="button"" name="ourwork['+count+'][client-img1]" value="" size="50"/><br/><br/><strong>Immagine Cliente 2</strong> : <input type="button" name="ourwork['+count+'][client-img2]" value="" size="50"/><br/><br/><strong>Immagine Cliente 3</strong> : <input type="type="button"" name="ourwork['+count+'][client-img3]" value="" size="50"/><br/><br/><strong>Immagine Cliente 4</strong> : <input type="type="button"" name="ourwork['+count+'][client-img4]" value="" size="50"/><br/><br/><strong>Link Cliente &nbsp;&nbsp;&nbsp;&nbsp;1</strong> : <input type="text" name="ourwork['+count+'][client-link1]" value="" size="50"/><br/><br/><strong>Descrizione Cliente</strong> :<br/><textarea id="elm1" name="ourwork['+count+'][client-desc]" cols="75" rows="6"></textarea><br/><span class="remove"><span class="button">Rimuovi Sezione</span></span></p>' );
            return false;       
        });
        $(".remove").live('click', function() {
            $(this).parent().remove();
        });
    });
    </script>
</div><?php

}

/* Quando il post viene salvato, salva i nostri dati personalizzati */
function dynamic_save_postdata( $post_id ) {
    // Verifica se si tratta di un salvataggio automatico
    // Se lo è, il nostro form non è stato inviato, quindi non vogliamo fare nulla
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
        return $post_id;

    // Verifica che provenga dalla nostra schermata e con la giusta autorizzazione,
    // perché save_post può essere attivato in altri momenti
    if ( !isset( $_POST['dynamicMeta_noncename'] ) )
        return;

    if ( !wp_verify_nonce( $_POST['dynamicMeta_noncename'], plugin_basename( __FILE__ ) ) )
        return;

    // OK, siamo autenticati: dobbiamo trovare e salvare i dati

    $ourwork = $_POST['ourwork'];

    update_post_meta($post_id,'ourwork',$ourwork);
}
2
Commenti

Ho scritto un articolo su questo argomento, dai un'occhiata: http://www.derby-web-design-agency.co.uk/blog-post/how-to-create-multiple-wordpress-3-5-media-uploaders-in-theme-options/27/ Penso sia quello che intendi :)

Robert Robert
7 ago 2013 21:46:05
Tutte le risposte alla domanda 2
0

Ecco come faccio per creare un pulsante di upload in una metabox:

FILE: template_dir/functions.php

Aggiungi queste righe:

wp_enqueue_script('custom-js', get_template_directory_uri().'/js/custom-js.js');

// Aggiungi la Meta Box  
function add_custom_meta_box() {  
    add_meta_box(  
        'custom_meta_box', // $id  
        'Custom Meta Box', // $title   
        'show_custom_meta_box', // $callback  
        'post', // $page  
        'normal', // $context  
        'high'); // $priority  
}  
add_action('add_meta_boxes', 'add_custom_meta_box');  

// Array dei Campi  
$prefix = 'custom_';  
$custom_meta_fields = array(
    array(  
        'name'  => 'Immagine',  
        'desc'  => 'Una descrizione per il campo.',  
        'id'    => $prefix.'image',  
        'type'  => 'image'  
    )  
);


// Il Callback  
function show_custom_meta_box() {  
global $custom_meta_fields, $post;  
// Usa nonce per la verifica  
echo '';  

    // Inizia la tabella dei campi e il loop  
    echo '';  
    foreach ($custom_meta_fields as $field) {  
        // ottieni il valore di questo campo se esiste per questo post  
        $meta = get_post_meta($post->ID, $field['id'], true);  
        // inizia una riga della tabella con  
        echo ' 
                '.$field['label'].' 
                ';  
                switch($field['type']) {  
                    // i case andranno qui 
                        // immagine  
                        case 'image':  
                            $image = get_template_directory_uri().'/images/image.png';    
                            echo ''.$image.'';  
                            if ($meta) { $image = wp_get_attachment_image_src($meta, 'medium'); $image = $image[0]; }                 
                            echo    ' 
                                        
Rimuovi Immagine '.$field['desc'].''; break; } //end switch echo ''; } // end foreach echo ''; // end table } // Salva i Dati function save_custom_meta($post_id) { global $custom_meta_fields; // verifica nonce if (!wp_verify_nonce($_POST['custom_meta_box_nonce'], basename(__FILE__))) return $post_id; // controlla autosave if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return $post_id; // controlla i permessi if ('page' == $_POST['post_type']) { if (!current_user_can('edit_page', $post_id)) return $post_id; } elseif (!current_user_can('edit_post', $post_id)) { return $post_id; } // loop attraverso i campi e salva i dati foreach ($custom_meta_fields as $field) { $old = get_post_meta($post_id, $field['id'], true); $new = $_POST[$field['id']]; if ($new && $new != $old) { update_post_meta($post_id, $field['id'], $new); } elseif ('' == $new && $old) { delete_post_meta($post_id, $field['id'], $old); } } // end foreach } add_action('save_post', 'save_custom_meta');

FILE: template_dir/js/custom-js.js

    jQuery(function(jQuery) {  

        jQuery('.custom_upload_image_button').click(function() {  
            formfield = jQuery(this).siblings('.custom_upload_image');  
            preview = jQuery(this).siblings('.custom_preview_image');  
            tb_show('', 'media-upload.php?type=image&TB_iframe=true');  
            window.send_to_editor = function(html) {  
                imgurl = jQuery('img',html).attr('src');  
                classes = jQuery('img', html).attr('class');  
                id = classes.replace(/(.*?)wp-image-/, '');  
                formfield.val(imgurl);  //ottieni l'URL dell'immagine e copialo nel campo
                preview.attr('src', imgurl);  
                tb_remove();  
            }  
            return false;  
        });  

        jQuery('.custom_clear_image_button').click(function() {  
            var defaultImage = jQuery(this).parent().siblings('.custom_default_image').text();  
            jQuery(this).parent().siblings('.custom_upload_image').val('');  
            jQuery(this).parent().siblings('.custom_preview_image').attr('src', defaultImage);  
            return false;  
        });  

    });  



Se vuoi aggiungere più tipi di campi, puoi approfondire qui: Reusable Custom Meta Boxes Part 1: Intro and Basic Fields

4 feb 2014 12:32:51
0

Esiste un eccellente framework per interagire con i Metabox che è ragionevolmente facile da usare (ben documentato) e include il supporto per molteplici opzioni di metabox, compreso il caricamento di immagini/file. È disponibile su Github: Custom Metaboxes and Fields (CMB). Se decidessi di utilizzare CMB, questo sarebbe un approccio per implementare un campo di upload.

Dovresti registrare il metabox per il caricamento dei file e aggiungere una chiamata al file init.php di CMB utilizzando il seguente codice nel tuo file functions.php:

function be_sample_metaboxes( $meta_boxes ) {
    $prefix = '_cmb_'; // Prefisso per tutti i campi
    $meta_boxes['test_metabox'] = array(
        'id' => 'test_metabox',
        'title' => 'Test Metabox',
        'pages' => array('post'), // post type (es. post, page etc.)
        'context' => 'normal',
        'priority' => 'high',
        'show_names' => true, // Mostra i nomi dei campi a sinistra
        'fields' => array(
            array(
                'name' => __( 'Test Image', 'cmb' ),
                'desc' => __( 'Upload an image or enter a URL.', 'cmb' ),
                'id'   => $prefix . 'test_image',
                'type' => 'file',
            ),
        ),
    );

    return $meta_boxes;
}
add_filter( 'cmb_meta_boxes', 'be_sample_metaboxes' );

// Inizializza la classe metabox
add_action( 'init', 'be_initialize_cmb_meta_boxes', 9999 );
function be_initialize_cmb_meta_boxes() {
    if ( !class_exists( 'cmb_Meta_Box' ) ) {
        require_once( './metabox/init.php' );
    }
}

La riga require_once( './metabox/init.php' ); nella seconda funzione presuppone che tu abbia posizionato i file di CMB Metabox in una cartella all'interno della directory del tuo tema chiamata metabox. Per richiamare questa opzione nel tuo template (es. single.php) potresti utilizzare la seguente funzione

$file = get_post_meta( $post->ID, '_cmb_test_image', true );
17 mar 2014 01:33:13