I writing plugin in my profile page and i want to create upload via ‘Browse’ button and ‘Dir’ field that will upload and return image url.And i don’t want to use media-upload.
I used to read Set Featured Image Front Frontend Form? and I don’t understand code
Help me solve this problem?
There are several parts.
You need to add an enctype
to the profile form.
function edit_form_type_wpse_98375() {
echo ' enctype="multipart/form-data"';
}
add_action('user_edit_form_tag','edit_form_type_wpse_98375');
Then add a field to the form.
function user_fields_wpse_98375($profileuser) {
$_profile_photo = get_user_meta($profileuser->data->ID,'_profile_photo',true);
echo '<h3>'.__('Additional User Data',THEME_TEXTDOMAIN).'</h3>';
echo '<tr class="show-admin-bar">';
echo '<th scope="row">'.__('Profile Photo', THEME_TEXTDOMAIN).'</th>';
echo '<td'.$tspan.'>';
echo '<fieldset>';
echo '<legend class="screen-reader-text"><span>'.__('Profile Photo', THEME_TEXTDOMAIN).'</span></legend>';
echo '<label for="profile_photo">';
echo '<input name="profile_photo" type="file" id="profile_photo" value="" />';
echo '</label><br />';
echo '</fieldset>';
echo '</td>';
echo '</tr>';
echo '</table>';
}
add_action('show_user_profile', 'user_fields_wpse_98375');
add_action('edit_user_profile', 'user_fields_wpse_98375');
And then save the data.
function save_user_custom($id=false) {
global $_FILES,$_POST;
if (false === $id) return false;
// save image
if (isset($_FILES)) {
if (isset($_FILES['profile_photo'])){
if (0 === $_FILES['profile_photo']['error']) {
// This is where you save the file
// Maybe use wp_handle_upload
// Or use the Filesystem API
// not sure what you want to do
}
}
unset($up);
}
}
add_action('personal_options_update','save_user_custom');
add_action('edit_user_profile_update','save_user_custom');
wp_handle_upload
is probably the simplest. From the Codex:
if ( ! function_exists( 'wp_handle_upload' ) )
require_once( ABSPATH . 'wp-admin/includes/file.php' );
$uploadedfile = $_FILES['file'];
$upload_overrides = array( 'test_form' => false );
$movefile = wp_handle_upload( $uploadedfile, $upload_overrides );
if ( $movefile ) {
echo "File is valid, and was successfully uploaded.\n";
var_dump( $movefile);
} else {
echo "Possible file upload attack!\n";
}
The file
input type works (mostly) like any other form input. If you give it a name like my_uploads['profile_photo']
instead of just profile_photo
you will get an array. This will be reflected in the $_FILES
variable when you process the form submission. You can add as many file
inputs as you want by building that array, or even just by giving them different names. As far as dynamically adding file
inputs, that is pretty simple Javascript.
Reference
http://codex.wordpress.org/Function_Reference/wp_handle_upload
http://codex.wordpress.org/Filesystem_API