St. Louis announced the new deal and noted it will be the starter's 15th year with the Cards.
Financial details of the contract weren't immediately released.
Wainwright was limited to eight appearances in 2018 because of hamstring and elbow injuries. He posted a 4.46 ERA and 1.46 WHIP with 40 strikeouts in 40.1 innings.
In August, the 37-year-old Georgia native said he received constant questions about whether he'd retire after four straight subpar or injury-plagued seasons, per Joe Trezza of MLB.com.
The right-hander noted his wife made it clear he needed to make sure he was 100 percent certain before walking away:
"I was on the way home from the field [the other day] and there is a point on the way to my house where you can either go straight or you can go right. Whatever the car in front of me does, I do the opposite and see if I can beat them around to the other side—following all traffic laws in the process, of course. But the point that my wife made was, 'Do you understand that you're such a competitor, you're going to keep competing no matter what. So you better know that you know you want to retire before you do that.'"
Instead, he'll return for at least one more season with the Cardinals.
Wainwright is a three-time All-Star selection and two-time National League wins leader, but he hasn't pitched up to those standards since 2014. He finished that year with a 2.38 ERA and 1.03 WHIP.
It's doubtful the first-round pick of the Atlanta Braves in the 2000 draft will return to that level. If healthy, he could still provide the Cards with valuable rotation depth behind Miles Mikolas and Jack Flaherty.
Wainwright could also land in the bullpen if St. Louis opts for a rotation featuring Carlos Martinez, Alex Reyes and Michael Wacha behind Mikolas and Flaherty.
That would bring his career full circle after making his first impact as a reliever in 2005 and 2006, even recording the last out of the 2006 World Series.