Добавление загрузчика изображений на страницу профиля пользователя

27 мар. 2012 г., 16:47:23
Просмотры: 14.2K
Голосов: 7

Я пытаюсь добавить загрузчик изображений на страницы профилей пользователей. У меня уже работает базовая версия на странице регистрации, но слегка измененный код не работает при добавлении в 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 займет еще некоторое время, я оставлю эту тему открытой, пока не справлюсь с этой задачей.

4
Комментарии

Посмотрите это, используйте встроенный плагин Plupload http://kovshenin.com/2012/dear-wordpress-i-want-to-drop-files-here-in-the-visual-editor/

soulseekah soulseekah
28 мар. 2012 г. 15:31:12

Изображения профилей нужно добавлять в определенную папку, а путь должен быть добавлен в определенное поле user_meta, чтобы страница профиля могла загружать изображение, связанное с ID пользователя, с помощью <?php if(get_the_author_meta( 'userphoto_thumb_file', $getId )!=""){?> <img src="<?=$uploads['baseurl'];?>/thumbs/<?=get_the_author_meta( 'userphoto_thumb_file', $getId );?>" /> Я не вижу, как код Ковшенина может это реализовать. Но я проверю. Вижу, что ты тоже помог с этим, Soulseekah!

rhand rhand
28 мар. 2012 г. 17:30:20

@Soulseekah Должен сказать, что функция перетаскивания в этом плагине действительно крутая! Но для моей ситуации мне нужен только загрузчик изображений профиля. Надеюсь, что плагин твоего брата будет принят в ядро WordPress, потому что он потрясающий!

rhand rhand
28 мар. 2012 г. 17:50:21

Возможно, реализация, подобная той, что представлена в примере plupload, может быть отличным решением. Кажется, достаточно просто правильно подключить скрипты и выбрать <div> в качестве загрузчика. Нужно только, чтобы данные сохранялись для пользователя, чтобы конкретное изображение загружалось для каждого профиля.

rhand rhand
28 мар. 2012 г. 18:07:07
Все ответы на вопрос 3
1

Проверьте этот плагин: User Avatar. Вы можете использовать его или изучить его функции, чтобы адаптировать под свои нужды.

29 мар. 2012 г. 05:32:27
Комментарии

Проверил и задумался о возможности использования части его кода — смотрите обновление в вопросе.

rhand rhand
29 мар. 2012 г. 15:23:36
10

$profilePicture определена вне области видимости кода сохранения и никогда не объявляется и не используется в глобальной области видимости.

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

Я бы объявил её как глобальную и добавил больше проверок, например, проверку на пустоту переменной перед её использованием.

29 мар. 2012 г. 14:28:24
Комментарии

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

rhand rhand
29 мар. 2012 г. 15:22:44

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

Tom J Nowell Tom J Nowell
29 мар. 2012 г. 15:59:01

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

Tom J Nowell Tom J Nowell
29 мар. 2012 г. 17:15:25

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

Tom J Nowell Tom J Nowell
29 мар. 2012 г. 17:16:03

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

Tom J Nowell Tom J Nowell
29 мар. 2012 г. 17:16:51

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

rhand rhand
30 мар. 2012 г. 03:17:08

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

rhand rhand
30 мар. 2012 г. 03:25:28

Ага, я не знал, что вам нужен также публичный загрузчик.

Tom J Nowell Tom J Nowell
30 мар. 2012 г. 12:20:07

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

Tom J Nowell Tom J Nowell
30 мар. 2012 г. 12:21:31

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

rhand rhand
30 мар. 2012 г. 14:03:15
Показать остальные 5 комментариев
0

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

25 мая 2012 г. 08:12:08