Добавление кнопки загрузки изображений в метабокс WordPress

7 авг. 2013 г., 13:24:47
Просмотры: 17.7K
Голосов: 4

Я хочу добавить кнопку загрузки изображений и получать их URL. Может кто-то помочь? Пытаюсь сделать это уже несколько дней. Использую код из этой темы Create more Meta Boxes as needed.

add_action( 'add_meta_boxes', 'dynamic_add_custom_box' );

/* Обработка введенных данных */
add_action( 'save_post', 'dynamic_save_postdata' );

/* Добавляем бокс в основную колонку на страницах редактирования постов и страниц */
function dynamic_add_custom_box() {
    add_meta_box(
        'dynamic_sectionid',
        __( 'Информация о клиенте', 'myplugin_textdomain' ),
        'dynamic_inner_custom_box',
        'page');
}

/* Выводим содержимое бокса */
function dynamic_inner_custom_box() {
    global $post;
    // Используем nonce для верификации
    wp_nonce_field( plugin_basename( __FILE__ ), 'dynamicMeta_noncename' );
    ?>
    <div id="meta_inner">
    <?php

    // Получаем сохраненные метаданные в виде массива
    $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>Миниатюра</strong> &nbsp;:&nbsp;<input type="button" name="ourwork[%1$s][thumb]" value="%2$s" size="50" /><br/><br/><strong>Изображение клиента 1</strong> : <input type="button" name="ourwork[%1$s][client-img1]" value="%3$s" size="50" /><br/><br/>
                <strong>Изображение клиента 2</strong> : <input type="button" name="ourwork[%1$s][client-img2]" value="%4$s" size="50"/><br/><br/>
                <strong>Изображение клиента 3</strong> : <input type="button" name="ourwork[%1$s][client-img3]" value="%5$s" size="50" /><br/><br/>
                <strong>Изображение клиента 4</strong> : <input type="button" name="ourwork[%1$s][client-img4]" value="%6$s" size="50" />
                <br/><br/>
                <strong>Ссылка клиента &nbsp;&nbsp;&nbsp;&nbsp;1</strong> : <input type="text" name="ourwork[%1$s][client-link1]" value="%7$s" size="50" />
                <br/><br/>
                <strong>Описание клиента</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">Удалить секцию</span>' ) );
                $c = $c +1;
            }
        }
    }
    ?>
<span id="here"></span>
<span class="add"><?php _e('<span class="button">Добавить секцию</span>'); ?></span>
<script>
    var $ =jQuery.noConflict();
    $(document).ready(function() {
        var count = <?php echo $c; ?>;
        $(".add").click(function() {
            count = count + 1;

            $('#here').append('<p><strong>Миниатюра</strong> &nbsp;:&nbsp;<input type="button" name="ourwork['+count+'][thumb]" value="" size="50"/><br/><br/><strong>Изображение клиента 1</strong> : <input type="type="button"" name="ourwork['+count+'][client-img1]" value="" size="50"/><br/><br/><strong>Изображение клиента 2</strong> : <input type="button" name="ourwork['+count+'][client-img2]" value="" size="50"/><br/><br/><strong>Изображение клиента 3</strong> : <input type="type="button"" name="ourwork['+count+'][client-img3]" value="" size="50"/><br/><br/><strong>Изображение клиента 4</strong> : <input type="type="button"" name="ourwork['+count+'][client-img4]" value="" size="50"/><br/><br/><strong>Ссылка клиента &nbsp;&nbsp;&nbsp;&nbsp;1</strong> : <input type="text" name="ourwork['+count+'][client-link1]" value="" size="50"/><br/><br/><strong>Описание клиента</strong> :<br/><textarea id="elm1" name="ourwork['+count+'][client-desc]" cols="75" rows="6"></textarea><br/><span class="remove"><span class="button">Удалить секцию</span></span></p>' );
            return false;       
        });
        $(".remove").live('click', function() {
            $(this).parent().remove();
        });
    });
    </script>
</div><?php

}

/* Сохраняем кастомные данные при сохранении поста */
function dynamic_save_postdata( $post_id ) {
    // Проверяем автосохранение
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
        return $post_id;

    // Проверяем nonce и авторизацию
    if ( !isset( $_POST['dynamicMeta_noncename'] ) )
        return;

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

    // Если все проверки пройдены - сохраняем данные

    $ourwork = $_POST['ourwork'];

    update_post_meta($post_id,'ourwork',$ourwork);
}
2
Комментарии

Я написал об этом в блоге, пожалуйста, ознакомьтесь: http://www.derby-web-design-agency.co.uk/blog-post/how-to-create-multiple-wordpress-3-5-media-uploaders-in-theme-options/27/ Думаю, это то, что вам нужно :)

Robert Robert
7 авг. 2013 г. 21:46:05
Все ответы на вопрос 2
0

Вот как я создаю кнопку загрузки в метабоксе:

ФАЙЛ: template_dir/functions.php

Добавьте эти строки:


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

// Добавляем метабокс  
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');  

// Массив полей  
$prefix = 'custom_';  
$custom_meta_fields = array(
    array(  
        'name'  => 'Изображение',  
        'desc'  => 'Описание поля.',  
        'id'    => $prefix.'image',  
        'type'  => 'image'  
    )  
);

// Функция отображения метабокса  
function show_custom_meta_box() {  
global $custom_meta_fields, $post;  
// Используем nonce для проверки  
echo '';  

    // Начинаем таблицу полей и цикл  
    echo '';  
    foreach ($custom_meta_fields as $field) {  
        // Получаем значение поля, если оно существует для этого поста  
        $meta = get_post_meta($post->ID, $field['id'], true);  
        // Начинаем строку таблицы  
        echo ' 
                '.$field['label'].' 
                ';  
                switch($field['type']) {  
                    // Варианты полей 
                        // изображение  
                        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    ' 
                                        <br/> 
                                             
                                             Удалить изображение 
                                            '.$field['desc'].'';  
                        break;  
                } //end switch  
        echo '';  
    } // end foreach  
    echo ''; // end table  
}

// Сохраняем данные  
function save_custom_meta($post_id) {  
    global $custom_meta_fields;  

    // проверяем nonce  
    if (!wp_verify_nonce($_POST['custom_meta_box_nonce'], basename(__FILE__)))   
        return $post_id;  
    // проверяем автосохранение  
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)  
        return $post_id;  
    // проверяем права  
    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;  
    }  

    // проходим по полям и сохраняем данные  
    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');

ФАЙЛ: 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);  // получаем URL изображения и копируем в поле
                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;  
        });  

    });  



Если вы хотите добавить больше типов полей, вы можете узнать больше здесь: Reusable Custom Meta Boxes Part 1: Intro and Basic Fields

4 февр. 2014 г. 12:32:51
0

Существует отличный фреймворк для работы с Metaboxes, который достаточно прост в использовании (хорошо документирован) и включает поддержку множества опций, включая загрузку изображений/файлов. Он доступен на Github: Custom Metaboxes and Fields (CMB). Если вы решите использовать CMB, вот один из способов реализации поля для загрузки файлов.

Вам нужно зарегистрировать метабокс для загрузки файлов и добавить вызов файла init.php CMB в ваш файл functions.php, используя следующий код:

function be_sample_metaboxes( $meta_boxes ) {
    $prefix = '_cmb_'; // Префикс для всех полей
    $meta_boxes['test_metabox'] = array(
        'id' => 'test_metabox',
        'title' => 'Test Metabox',
        'pages' => array('post'), // Тип записи (например, post, page и т.д.)
        'context' => 'normal',
        'priority' => 'high',
        'show_names' => true, // Показывать названия полей слева
        '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' );

// Инициализация класса метабоксов
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' );
    }
}

Строка require_once( './metabox/init.php' ); во второй функции предполагает, что вы поместили файлы CMB Metabox в папку metabox внутри директории вашей темы. Чтобы вызвать это поле в вашем шаблоне (например, в single.php), вы можете использовать следующую функцию:

$file = get_post_meta( $post->ID, '_cmb_test_image', true );
17 мар. 2014 г. 01:33:13