Загрузка изображения через ACF на front-end с помощью пользовательской формы

11 окт. 2017 г., 14:50:02
Просмотры: 19.3K
Голосов: 0

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

Поля были созданы с помощью ACF (Advanced Custom Fields).

У меня есть кастомная форма регистрации и форма редактирования с обычными полями WordPress и дополнительными. Всё работает идеально... Кроме поля для изображения.

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

Примечание (1): Изображение будет использоваться как аватар, я не буду использовать стандартный аватар WordPress.

Примечание (2): Я не буду использовать acf_form(), потому что мне нужно сильно изменить работу формы.

Вот часть кода:

<label for="avatar_user"></label>
<input class="text-input" name="avatar_user" type="file" id="avatar_user" value="<?php the_author_meta( 'avatar_user', $current_user->ID ); ?>" />

if ( !empty( $_POST['avatar_user'] ) :
   update_user_meta( $current_user->ID, 'avatar_user', esc_attr( $_POST['avatar_user'] ) );
10
Комментарии

ACF позволяет хранить URL изображения, вы можете обработать загрузку своего пользовательского аватара через функцию media_handle_upload() в WordPress и вставить URL в поле ACF

Piyush Rawat Piyush Rawat
11 окт. 2017 г. 15:20:55

так в чем именно вопрос? пожалуйста, отредактируйте вопрос и уточните, что именно вы спрашиваете

Mark Kaplun Mark Kaplun
11 окт. 2017 г. 15:46:26

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

Marcelo Henriques Cortez Marcelo Henriques Cortez
11 окт. 2017 г. 15:50:13

Думаю, 'media_handle_upload()' может помочь. Попробую, как только смогу, и посмотрю, сработает ли. Спасибо @Piyush

Marcelo Henriques Cortez Marcelo Henriques Cortez
11 окт. 2017 г. 15:52:32

@MarceloHenriquesCortez да...я делал это раньше...но не знаю ваш конкретный случай..так что можете проверить, подойдет ли это

Piyush Rawat Piyush Rawat
11 окт. 2017 г. 15:55:35

Получилось сделать с помощью 'media_handle_upload()'. Спасибо, что направили в нужном направлении

Marcelo Henriques Cortez Marcelo Henriques Cortez
16 окт. 2017 г. 14:56:27

Вводящий в заблуждение заголовок и запутанный вопрос.

Sunil Kumar Sunil Kumar
10 июл. 2020 г. 09:27:33

@SunilKumar Только у тебя такая проблема =)

Marcelo Henriques Cortez Marcelo Henriques Cortez
13 июл. 2020 г. 16:40:00

Марк Каплун со мной согласится.

Sunil Kumar Sunil Kumar
14 июл. 2020 г. 13:35:05

@SunilKumar без разницы

Marcelo Henriques Cortez Marcelo Henriques Cortez
12 дек. 2021 г. 00:05:21
Показать остальные 5 комментариев
Все ответы на вопрос 2
0

Хорошо, мне удалось заставить это работать с помощью 'media_handle_upload' (как указал @Piyush) и небольшой доработки моего кода формы.

Вот что я сделал:

Во-первых - Убедитесь, что ваша форма имеет атрибут 'enctype='multipart/form-data'.

Во-вторых - Убедитесь, что у вашего 'input=file' нет атрибута value.

В-третьих - Используйте 'media_handle_upload' и передайте имя вашего 'input=file'.

В-четвертых - Проверьте наличие ошибок с помощью 'is_wp_error', например.

В-пятых - Обновите метаданные пользователя, используя имя поля, которое вы хотите обновить (в моем случае, оно совпадает с 'name' у 'input=file').

Вот часть финального кода:

<form method="post" id="adduser" enctype='multipart/form-data'>
    <input class="text-input" name="avatar_user" type="file" id="avatar_user" multiple="false"/>
    <input name="updateuser" type="submit" id="updateuser" class="submit button" value="<?php _e('СОХРАНИТЬ', 'profile'); ?>" />
    <input name="action" type="hidden" id="action" value="update-user" />
</form>

/* Если профиль был сохранен, обновляем его. */
if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) && $_POST['action'] == 'update-user' ) {

    // Эти файлы должны быть подключены как зависимости при работе на фронтенде.
    require_once( ABSPATH . 'wp-admin/includes/image.php' );
    require_once( ABSPATH . 'wp-admin/includes/file.php' );
    require_once( ABSPATH . 'wp-admin/includes/media.php' );

    // Позволяем WordPress обработать загрузку.
    $img_id = media_handle_upload( 'avatar_user', 0 );

    if ( is_wp_error( $img_id ) ) {
      echo "Ошибка";
    } else {
      update_user_meta( $current_user->ID, 'avatar_user', $img_id );
    }
}
16 окт. 2017 г. 14:55:59
4

Возможно, это поможет:

// Обработка изображений, загружаемых через фронтенд, с сохранением функционала ACF
function my_acf_pre_save_post($post_id) {

if ( !function_exists('wp_handle_upload') ) {
require_once(ABSPATH . 'wp-admin/includes/file.php');
}

// Перемещение файла в медиатеку
$movefile = wp_handle_upload( $_FILES['my_image_upload'], array('test_form' => false) );

// Если файл успешно перемещен, создаем вложение WordPress
if ( $movefile && !isset($movefile['error']) ) {
$wp_upload_dir = wp_upload_dir();
$attachment = array(
'guid' => $wp_upload_dir['url'] . '/' . basename($movefile['file']),
'post_mime_type' => $movefile['type'],
'post_title' => preg_replace( '/\.[^.]+$/', ”, basename($movefile['file']) ),
'post_content' => ”,
'post_status' => 'inherit'
);
$attach_id = wp_insert_attachment($attachment, $movefile['file']);

// Назначаем файл в качестве миниатюры записи
set_post_thumbnail($post_id, $attach_id);
update_field('my_image_upload', $attach_id, $post_id);

}

return $post_id;

}

add_filter('acf/pre_save_post' , 'my_acf_pre_save_post');

Скопируйте код из этого поста - на странице по ссылке ниже форматирование сломано, поэтому я исправил его в примере выше.

Источник: https://support.advancedcustomfields.com/forums/topic/uploading-imagefile-on-the-front-end/

11 окт. 2017 г. 15:35:30
Комментарии

Звучит многообещающе. Обязательно попробую, как только смогу. Спасибо.

Marcelo Henriques Cortez Marcelo Henriques Cortez
11 окт. 2017 г. 15:54:04

Проблема этого примера в том, что он, кажется, предназначен для поста, поэтому здесь используется 'set_post_thumbnail'. В моем случае мне нужно использовать изображение для поля ACF в профиле пользователя.

Marcelo Henriques Cortez Marcelo Henriques Cortez
16 окт. 2017 г. 13:58:33

Получилось сделать с помощью 'media_handle_upload()'

Marcelo Henriques Cortez Marcelo Henriques Cortez
16 окт. 2017 г. 14:56:42

Я отметил это как полезное, потому что это может помочь другим пользователям в определенных случаях. Так как я нашел решение, которое работает с моим кодом, не уверен, сработает ли оно у всех.

Marcelo Henriques Cortez Marcelo Henriques Cortez
16 окт. 2017 г. 17:21:33