There will be some modifications required to the workflow. You will need some collection objects to be created to store the Title, Description and the Due Dates to compare for the email notification.
Is there another way I can make it so that it will not send any emails for those items without due dates?
empty date in calculations is considered to be 1.1.1900. so if you subtract it from current date (or vice versa) you'll get big (positive or negative) number. so you can assume, if ABS(difference) is greater then (eg) 365 (1 year) you'll not sent notification.
But if I move it to a site workflow, will my workflow be the exact same as the one I posted (the first one)?
But then, how can I put the description and title for each of the items in the email notification?
you'll have read it in within Query list action, along with other data from list.
Right now it’s just sending all the emails for each item, if the values in the collection variable meet the requirements, it’s fustrating
I'd say you'd need to take a little rest, clear the head and (re-)think of overall concept how you'd like to implement it.
currently you mix two different approaches (site vs. list workflow) and you're not very clear what part of the logic should be placed where.
I do not say mix of site and list workflow is a bad approach, you just have to sort things a bit what should be performed when and where.
the basic difference between the two is that site workflow runs on (as name denotes) a site level, so it doesn't have direct access to any list and items. so if you need to work on a specific list and its items you have to query for the data first, store them into (typically collection) variables and then process them somehow (typically within for each loop)
on the other hand, list workflow instance runs on one specific single list item. so within workflow you have access to current list item values (ItemProperties in workflow naming). so you do not neither need to perform any extra query to get data, nor looping to process them. as well, it's not very typical you'd process all items from the list with a list workflow instance running on one of the items, and definitely not in your case.
let the list workflow instance run and process data of just that current item it runs on.
I'd recommend to read through Cassy Freeman's blog where she describes typical pattern how to implement notification workflow. with that approach you even need not to bother with regular DaysLeft recalculations....