WP Form Uploads (simple)

// 1. Register shortcode
add_shortcode('user_image_upload', 'user_image_upload_form');

function user_image_upload_form() {
    // Only for logged in users
    if (!is_user_logged_in()) return 'Please log in to upload images';
    
    ob_start();
    ?>
    <form method="post" enctype="multipart/form-data">
        <?php wp_nonce_field('user_image_upload_action', 'user_image_upload_nonce'); ?>
        <input type="file" name="user_image" accept="image/*" required>
        <input type="submit" value="Upload Image">
    </form>
    <?php
    return ob_get_clean();
}

// 2. Handle submission
add_action('init', 'handle_user_image_upload');
function handle_user_image_upload() {
    if (!isset($_POST['user_image_upload_nonce']) return;
    
    // Verify nonce
    if (!wp_verify_nonce($_POST['user_image_upload_nonce'], 'user_image_upload_action')) return;
    
    // Check user is logged in
    if (!is_user_logged_in()) return;
    
    $user_id = get_current_user_id();
    
    // 3. Process upload
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    require_once(ABSPATH . 'wp-admin/includes/file.php');
    require_once(ABSPATH . 'wp-admin/includes/media.php');
    
    $attachment_id = media_handle_upload('user_image', 0);
    
    if (is_wp_error($attachment_id)) {
        // Handle error
    } else {
        // 4. Store user meta
        update_user_meta($user_id, 'user_uploaded_image_id', $attachment_id);
        update_user_meta($user_id, 'user_uploaded_image_date', time());
    }
}