Добавление загрузчика изображений на страницу профиля пользователя
Я пытаюсь добавить загрузчик изображений на страницы профилей пользователей. У меня уже работает базовая версия на странице регистрации, но слегка измененный код не работает при добавлении в functions.php. Поле загрузки отображается, и WordPress позволяет легко обновлять профиль, но в самом профиле изображение не показывается. Для получения и сохранения изображения я использую:
/********************************************************************
Код для поля загрузки изображения профиля
*********************************************************************/
require_once( STYLESHEETPATH . '/img_upload_resize_crop.php' );
add_action( 'init', 'custom_img_uploader' );
function custom_img_uploader () {
if (isset($_FILES['profilePicture']['name'])!= "" ) {
if ( $_FILES['profilePicture']['name']!="" ) {
$your_image = new _image;
$upload_dir = wp_upload_dir();
// Загрузка
$your_image->uploadTo = $upload_dir['basedir'].'/';
$upload = $your_image->upload($_FILES['profilePicture']);
// Изменение размера
$your_image->newPath = $upload_dir['basedir'].'/thumbs/';
$your_image->newWidth = 150;
$your_image->newHeight = 200;
$resized = $your_image->resize();
$profilePicture=str_replace($upload_dir['basedir'].'/thumbs/', "", $resized );
unlink($upload);
}else{
$profilePicture='';
}
}
}
Для отображения поля в HTML у меня есть:
<!-- начало поля загрузки изображения -->
<tr>
<th><label for="profilePicture"><?php _e("Изображение профиля"); ?></label></th>
<td>
<input type="file" name="profilePicture" id="profilePicture" style="float:left;" />
</td>
</tr>
А для сохранения я использую это:
update_user_meta( $user_id, 'userphoto_thumb_height', 59);
update_user_meta( $user_id, 'userphoto_thumb_width', 80 );
update_user_meta( $user_id, 'userphoto_thumb_file', $profilePicture );
Кто-нибудь видит, почему в профиле этот код:
<?php if(get_the_author_meta( 'userphoto_thumb_file', $getId )!=""){?>
<img src="<?=$uploads['baseurl'];?>/thumbs/<?=get_the_author_meta( 'userphoto_thumb_file', $getId );?>" />
не загружает сохраненное изображение?
Обновление I и II
Базовая отладка
Обновление III
После добавления isset()
я продвинулся немного дальше:
[28-Mar-2012 07:14:46] PHP Notice: Undefined variable: profilePicture in /home/user/public_html/wp-content/themes/theme-name/functions.php on line 346
На этой строке у меня update_user_meta( $user_id, 'userphoto_thumb_file', $profilePicture );
Похоже, что хотя переменная Это просто уведомление и, похоже, не имеет отношения к проблеме загрузки.profilePicture
определена, она не захватывается
Обновление IV
Я обернул код загрузчика изображений в функцию и добавил его как действие. См. обновленный код выше. У меня все еще есть неопределенная переменная profilePicture
, и изображение не загружается. Полный файл functions.php здесь http://pastebin.com/YGYz3Qnv
Обновление V
Я только что понял, что у меня нет хорошего $_POST для profilePicture. Глядя на плагин, упомянутый @brasofilo по адресу http://plugins.svn.wordpress.org/user-avatar/trunk/user-avatar.php, я вижу этот код, который мог бы использовать, но мне нужно его значительно адаптировать:
<form enctype="multipart/form-data" id="uploadForm" method="POST" action="<?php echo admin_url('admin-ajax.php'); ?>?action=user_avatar_add_photo&step=2&uid=<?php echo $uid; ?>" >
<label for="upload"><?php _e('Выберите изображение с компьютера:','user-avatar'); ?></label><br /><input type="file" id="upload" name="uploadedfile" />
<input type="hidden" name="action" value="save" />
<?php wp_nonce_field('user-avatar') ?>
<p class="submit"><input type="submit" value="<?php esc_attr_e('Загрузить'); ?>" /></p>
</form>
Мне интересно, нужна ли форма, так как она не требовалась для других текстовых полей, и как мне добавить $user_id
и как адаптировать update_user_meta
Обновление VI
Сделал $profilePicture
глобальной, как рекомендовано участником
Обновление VII
Рассматриваю вариант использования решения от Unrelated Media здесь. Но так как интеграция этого в мой текущий functions.php займет еще некоторое время, я оставлю эту тему открытой, пока не справлюсь с этой задачей.
Проверьте этот плагин: User Avatar. Вы можете использовать его или изучить его функции, чтобы адаптировать под свои нужды.

$profilePicture
определена вне области видимости кода сохранения и никогда не объявляется и не используется в глобальной области видимости.
В результате, как только функция загрузки завершает работу, переменная либо удаляется сборщиком мусора, либо вы работаете с совершенно другой переменной, которая имеет такое же имя.
Я бы объявил её как глобальную и добавил больше проверок, например, проверку на пустоту переменной перед её использованием.

Я обновил код — смотрите http://pastebin.com/YGYz3Qnv — и сделал $profilePicture
глобальной. Спасибо за подсказку! Как я могу добавить больше проверок, чтобы убедиться, что переменная пуста? isset()
уже добавлен.. И мне кажется, у меня всё ещё есть проблема с $_POST..

Я предпочитаю использовать if(empty()){, так как это также проверяет пустые массивы, вам также может понадобиться сделать, чтобы форма использовала multipart кодирование, хотя я не помню сайт/ответ, объясняющий это, так что я напишу чуть позже, но обратитесь к плагину User Photo

Глядя на pastebin, вы вообще не сделали переменную глобальной, если посмотреть на соответствующую функцию, она выглядит идентично, там нет global $profilePicture; в функции custom_img_uploader

Глядя на весь ваш код, я не уверен, почему сам процесс загрузки вынесен в отдельную функцию на хуке init. Не лучше ли разместить его сразу перед вызовами update_usermeta?

Думаю, лучше использовать что-то вроде плагина UserPhoto — он рабочий и предлагает больше функций и возможностей

Сейчас проверяю http://wordpress.org/extend/plugins/user-photo/. Может быть хорошей идеей. Нужно только адаптировать мою форму регистрации для сохранения изображения тем же способом, чтобы обновление работало в дальнейшем. Загрузка изображения в профиле, вероятно, не будет слишком сложной, если я смогу как-то получить userid для загрузки правильной аватарки. Учитывая все эти факторы, я надеялся остаться на своем коде, чтобы мне нужно было менять только functions.php, а не форму регистрации и отображение профиля. Не полный новичок в PHP, но еще очень и очень многому нужно учиться.

Спросил разработчика UserPhoto, была ли уже реализована форма регистрации здесь: http://wordpress.org/support/topic/plugin-user-photo-registration-usage?replies=1#post-2721403. Кто знает..

Я бы перешел от использования FILES и post data к использованию WordPress API для работы с файлами. Таким образом, вместо пути к файлу вы получите ID типа записи вложения (attachment post type), и сможете сократить весь код загрузки до нескольких вызовов функций, которые делают все автоматически. Затем, когда вам нужно отобразить ваш 'аватар', просто используйте функции работы с изображениями, которые используются повсеместно.

давайте продолжим обсуждение в чате

Большое спасибо всем за ваши предложения. В итоге я выбрал интеграцию с Woothemes Media Uploader, как вы можете видеть здесь на Github: https://github.com/devinsays/options-framework-plugin/blob/master/options-medialibrary-uploader.php Это интегрировано в фреймворк темы, который я использую в своей собственной теме, так что я могу убить двух зайцев одним выстрелом.
