Philadelphia put runners at first and third with nobody out against Edward Mujica, but the fill-in closer retired three straight batters to hand the Phillies their fourth consecutive defeat.
Yadier Molina went 3 for 4 with two RBIs for the Cardinals, who had seven hits one night after getting held to Beltran's seventh-inning double in a 5-0 loss to A.J. Burnett and the Pittsburgh Pirates.
Wainwright (3-1) wasn't as sharp as his previous start, when he pitched a four-hitter and matched a career high with 12 strikeouts Saturday in an 8-0 win over Milwaukee, but he was still effective.
The right-hander gave up three runs and nine hits while striking out four and walking none. He hasn't walked a batter in 29 innings to start the season.
Beltran broke a 3-all tie with one out in the eighth when he hit an opposite-field homer to left off Mike Adams (0-1).
Mujica wriggled out of trouble in the ninth to convert his first save opportunity. Cardinals manager Mike Matheny chose Mujica over Mitchell Boggs, who has blown two of his four save chances this season. It appeared Mujica would flop, too, but he recovered quickly.
Ben Revere led off the ninth with a single and went to third on Erik Kratz's single to right. Kratz moved up on pinch-hitter Kevin Frandsen's groundout to shortstop, but Revere held at third. Jimmy Rollins struck out and Freddy Galvis grounded out to end it.
Phillies ace Cole Hamels, who had a 10.97 ERA through two starts, had a second consecutive strong outing but remained winless through four starts. He allowed three runs and five hits while striking out eight and walking two in seven innings.
The Phillies failed to draw a walk for the fourth consecutive game. Philadelphia, which entered 26th in the majors with 34 walks, is averaging 2.1 per game this season.
The Cardinals opened the scoring with a pair of runs in the fourth. Hamels walked Matt Holliday leading off and Allen Craig followed with a line drive to right field that fell in front of John Mayberry Jr., who slipped while pursuing the ball.
Molina drove home both runners with a double down the right-field line. Phillies manager Charlie Manuel came out to argue that the ball was foul.
Philadelphia tied it in the sixth on three straight hard-hit balls off Wainwright. With one out, Rollins lined a double just inside first base and scored on Galvis' double off the center-field wall that was just out of Jon Jay's reach. Utley added an RBI single.
Cardinals pitching coach Derek Lilliquist visited Wainwright after Utley's hit, and the St. Louis righty induced a pair of groundouts to end the inning.
St. Louis regained the lead in the seventh on Pete Kozma's sacrifice fly after David Freese opened the inning with a double and went to third on Jay's sacrifice.
In the bottom half, Kratz ended an 0-for-16 slump with an RBI single. Beltran kept the score tied with an excellent catch on Rollins' drive to right.
Galvis started in left field in place of Domonic Brown, who left Wednesday's game against the Reds with a back injury. Brown pinch-hit in the seventh and reached on a fielder's choice.
Manuel, hoping to get his struggling offense going, moved Revere out of the leadoff spot for the first time this season in favor of Rollins, who led off during most of his previous 13 seasons with Philadelphia. Revere, batting seventh, was 1 for 3 while Rollins was 1 for 5.
Matheny also juggled his lineup, dropping Jay out of the leadoff spot for the first time in favor of Matt Carpenter.
NOTES: Molina has 10 hits in his last 24 at-bats. ... Carpenter took a shot off his left collarbone on Howard's liner to second base in the fourth. Matheny and the trainer came out, but Carpenter stayed in the game. . Phillies RHP Roy Halladay (1-2, 7.63 ERA) faces LHP Jaime Garcia (1-0, 1.86) in the second game of the four-game series Friday night. . The Phillies placed LHP John Lannan on the 15-day DL with a strained quadriceps tendon in his left knee.
Link to box score: St. Louis 4 at Philadelphia 3
Link to game discussion at The Cardinal Nation message board