Here's the code:
(defun new-org-delete-backward-char (N)
(interactive "p")
(if (not (looking-back "[*]+ "))
(org-delete-backward-char N)
(previous-line)
(end-of-line)))
(add-hook
'org-mode-hook
(lambda ()
(define-key org-mode-map (kbd "DEL")
'new-org-delete-backward-char)))
I was messing up my outlines too, before I've defined
org-speed-commands-user
to do stuff like insert heading up, down etc.
Maybe you'd like to try that instead. Also, this is quite useful:
(define-key org-mode-map (kbd "C-a")
(lambda()(interactive)
(if (looking-at "^[^*]")
(re-search-backward "^*")
(org-beginning-of-line))))
It brings you to the beginning of heading once you're already at the beginning of line, when you press C-a.
UPD
This version has provisioning for deleting region and goes to the end of the line:
(defun new-org-delete-backward-char (N)
(interactive "p")
(cond ((region-active-p)
(delete-region
(region-beginning)
(region-end)))
((looking-back "[*]+ ")
(previous-line)
(end-of-line))
(t
(org-delete-backward-char N))))