Загрузка изображения через ACF на front-end с помощью пользовательской формы
Я создал дополнительные поля для подписчиков, одно из которых - поле для изображения, чтобы они могли загружать изображение в свой профиль.
Поля были созданы с помощью 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'] ) );

Хорошо, мне удалось заставить это работать с помощью '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 );
}
}

Возможно, это поможет:
// Обработка изображений, загружаемых через фронтенд, с сохранением функционала 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/

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

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

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