Загрузка файлов в метабокс WordPress для произвольного типа записей

2 июл. 2014 г., 13:07:45
Просмотры: 20K
Голосов: 2

Я относительно новичок в разработке WordPress и столкнулся с проблемой. Я создал произвольный тип записи, который отображается в меню администратора. Мне нужен метабокс с полем загрузки файла. Метабокс отображается нормально, но файл не сохраняется.

Я использую следующий код. Буду благодарен за любую помощь.

////////////////// Лучшие практики ///////////////

add_action( 'init', 'wpb_register_cpt_best_practices' );

function wpb_register_cpt_best_practices() {

    $labels = array(
        'name' => _x( 'Лучшие практики', 'best practices' ),
        'singular_name' => _x( 'Лучшая практика', 'best practice' ),
        'add_new' => _x( 'Добавить новую', 'best practice' ),
        'add_new_item' => _x( 'Добавить новую лучшую практику', 'best practice' ),
        'edit_item' => _x( 'Редактировать лучшую практику', 'best practice' ),
        'new_item' => _x( 'Новая лучшая практика', 'best practice' ),
        'view_item' => _x( 'Просмотреть лучшую практику', 'best practice' ),
        'search_items' => _x( 'Поиск лучших практик', 'best practice' ),
        'not_found' => _x( 'Лучшие практики не найдены', 'best practice' ),
        'not_found_in_trash' => _x( 'В корзине лучшие практики не найдены', 'best practice' ),
        'parent_item_colon' => _x( 'Родительская лучшая практика:', 'best practice' ),
        'menu_name' => _x( 'Лучшие практики', 'best practice' ),
    );

    $args = array(
        'labels' => $labels,
        'hierarchical' => false,

        'supports' => array( 'title', 'editor',  'revisions' ),

        'public' => true,
        'show_ui' => true,
        'show_in_menu' => true,


        'show_in_nav_menus' => true,
        'publicly_queryable' => true,
        'exclude_from_search' => false,
        'has_archive' => true,
        'query_var' => true,
        'can_export' => true,
        'rewrite' => true,
        'capability_type' => 'post'
    );

    register_post_type( 'best practice', $args );
}
$key_bp = "best practice";
$meta_boxes_bp = array(

    "document" => array(
        "name" => "document",
        "title" => "Документ лучших практик",
        "description" => "Прикрепите документ лучших практик.",
        "type" => "file")

);

function wpb_create_meta_box3() {
    global $key_bp;

    if( function_exists( 'add_meta_box' ) ) {
        add_meta_box( 'new-meta-boxes', ucfirst( $key_bp ) . ' Документ', 'display_meta_box3', 'best practice', 'normal', 'high' );
    }
}

function display_meta_box3() {
    global $post, $meta_boxes_bp, $key_bp;
    ?>

    <div class="form-wrap">

        <?php
        wp_nonce_field( plugin_basename( __FILE__ ), $key_bp . '_wpnonce', false, true );

        foreach($meta_boxes_bp as $meta_box) {
            $data = get_post_meta($post->ID, $key_bp, true);
            ?>

            <div class="form-field form-required">
                <label for="<?php echo $meta_box[ 'name' ]; ?>"><?php echo $meta_box[ 'title' ]; ?></label>
                <input type="file" name="<?php echo $meta_box[ 'name' ]; ?>" value="<?php echo (isset($data[ $meta_box[ 'name' ] ]) ? $data[ $meta_box[ 'name' ] ]  : ''); ?>" />
                <p><?php echo $meta_box[ 'description' ]; ?>
                    <?php //print_r($data);
                    ?></p>
            </div>

        <?php } ?>

    </div>
<?php
}

function wpb_save_meta_box3( $post_id ) {
    global $post, $meta_boxes_bp, $key_bp;

    foreach( $meta_boxes_bp as $meta_box ) {
        if (isset($_POST[ $meta_box[ 'name' ] ])) {
            $data[ $meta_box[ 'name' ] ] = $_POST[ $meta_box[ 'name' ] ];
        }
    }

    if (!isset($_POST[ $key_bp . '_wpnonce' ]))
        return $post_id;

    if ( !wp_verify_nonce( $_POST[ $key_bp . '_wpnonce' ], plugin_basename(__FILE__) ) )
        return $post_id;

    if ( !current_user_can( 'edit_post', $post_id ))
        return $post_id;

    update_post_meta( $post_id, $key_bp, $data );
}

add_action( 'admin_menu', 'wpb_create_meta_box3' );
add_action( 'save_post', 'wpb_save_meta_box3' );
2
Комментарии

Пожалуйста, воспользуйтесь поиском, чтобы проверить, не был ли ваш вопрос уже задан ранее.

Nicolai Grossherr Nicolai Grossherr
2 июл. 2014 г. 13:13:21

Я не вижу, чтобы вы вообще работали с файлом, например через $_FILES и т.д. Посмотрите этот ответ по этой теме. Возможно, это будет лучшим кандидатом на дубликат.

Nicolai Grossherr Nicolai Grossherr
2 июл. 2014 г. 13:24:07
Все ответы на вопрос 1
5

Для загрузки файлов в метабоксы WordPress в пользовательских записях, пожалуйста, обратитесь к следующей ссылке:

http://code.tutsplus.com/articles/attaching-files-to-your-posts-using-wordpress-custom-meta-boxes-part-1--wp-22291

Или вы можете использовать следующие плагины:

https://wordpress.org/plugins/simple-fields/
http://www.advancedcustomfields.com/

Оба плагина отлично подходят для работы с пользовательскими полями. Вы также можете создавать повторяемые поля.

2 июл. 2014 г. 13:21:59
Комментарии

Пожалуйста, постарайтесь, чтобы сам ответ мог решить проблему. Ответы, состоящие в основном или полностью из ссылок, почти никогда этого не делают. Лучше всего добавить в ответ соответствующий код и объяснение.

Nicolai Grossherr Nicolai Grossherr
2 июл. 2014 г. 13:29:26

Такие ответы вредны для сайта. Пожалуйста, улучшите свои ответы

Pieter Goosen Pieter Goosen
2 июл. 2014 г. 13:50:19

Голосую за. Не слушайте тех, кто говорит, что вы не должны были отвечать так плохо. Ваш ответ помог нам ;) спасибо

T.Todua T.Todua
4 апр. 2020 г. 14:18:53

достаточно хорошо, пока связанная страница не потеряна!

André Kelling André Kelling
8 апр. 2022 г. 14:56:55

У меня не сработало, пришлось добавить encytype="multipart/form-data" в форму edit.php, используя принятый ответ здесь: https://stackoverflow.com/questions/46409457/files-consistently-empty-in-wordpress-post-meta-upload-box

Chad Reitsma Chad Reitsma
26 июн. 2023 г. 02:40:28