Craig gets $1.75 million this year, $2.75 million in 2014, $5.5 million in 2015, $9 million in 2016 and $11 million in 2017. The Cardinals have a $13 million option for 2018 with a $1 million buyout.
The 28-year-old Craig would have been eligible for salary arbitration next winter and for free agency after the 2016 World Series.
He has 150 RBIs in 238 big league games and was sixth in the NL last season with a .307 average. He had 22 home runs and 92 RBIs despite not playing his first game until May 1 following offseason surgery on his right knee.
Craig is a career .300 hitter and became the Cardinals' primary first baseman last year after Lance Berkman got hurt. Craig also made 30 starts in the outfield.
"I think he's proven he's the type of player that, when he's in the lineup, can make an impact," Cardinals general manager John Mozeliak said.
Craig led the major leagues with a .400 average with runners in scoring position last season and has hit .374 the last two seasons, second in the majors behind the Reds' Joey Votto.
Craig also had a big postseason for the Cardinals' championship team in 2011 while playing with the knee injury, hitting three homers in the World Series and making a leaping catch at the left-field wall to rob the Rangers' Nelson Cruz of a homer in Game 7. He had three go-ahead RBIs in the Series against Texas to tie a major league redord held by Kiki Cuyler (1925) and Hank Greenberg (1945), including an eighth-inning drive that fueled the first of two comebacks in a 10-9, 11-inning Game 6 victory.
The agreement was negotiated by agents Sam and Seth Levinson.