Shoppach hit a tying double in the eighth and then connected off B.J. Rosenberg (0-2). Mike Baxter also hit a two-run shot for the Mets, who are 6-1 in Philadelphia this season.
It was the first time in 10 games New York scored more than three runs.
Ryan Howard hit a grand slam and Chase Utley had a solo shot for the Phillies, who had won four straight.
The Phillies probably aren't going to win their sixth straight NL East title, but they're clinging to extremely slim postseason hopes. They remained 10 games behind St. Louis in the race for the second wild-card spot. The Cardinals were 9½ out at this point last year, but they rallied to earn a wild-card berth and went on to beat the Phillies and win the World Series.
Bobby Parnell (4-3) tossed two scoreless innings for the win.
Neither starting pitcher fared well. Vance Worley allowed four runs and nine hits in 4 1-3 innings to remain winless in his last five starts for the Phillies.
New York's Chris Young gave up five runs and four hits in 5 1-3 innings.
Utley ripped his ninth homer out to right to give the Phillies a 5-4 lead in the fifth, ending Young's night.
The Mets rallied in the eighth, an inning that's plagued Philadelphia all season. David Wright worked a leadoff walk against Josh Lindblom. Antonio Bastardo entered and retired the next two batters before allowing Shoppach's RBI double.
Helped by Young's control problems, the Phillies loaded the bases without a hit in the first. Jimmy Rollins walked, Kevin Frandsen was hit by a pitch and Utley walked after hitting a few deep fouls. That brought up Howard, who drove one out to deep right-center to extend his franchise record to 11 career slams.
But the Mets chipped away. Baxter connected in the fourth to get New York within a run on his second career homer.
They chased Worley and tied it in the fifth. Ruben Tejada led off with a ground-rule double. He advanced on Daniel Murphy's single and scored on Wright's sacrifice fly that made it 4-all.
The Mets hit three straight singles on the first five pitches to start the game. Wright drove in Tejada on his grounder to left. Tejada was initially called out by plate umpire Mike Estabrook on a strong throw home by Domonic Brown, but Estabrook changed the call after realizing catcher Erik Kratz dropped the ball and picked it up barehanded.
The Mets won their first two series in Philadelphia this season, including a three-game sweep in May. A packed house usually greets the Mets and many blue-shirted fans make the trip down the New Jersey turnpike. But with these two teams likely going nowhere, that atmosphere was missing. The crowd of 41,227 was the smallest at Citizens Bank Park this season.
NOTES: Rollins hosted the Uganda Little League team. Rollins visited Uganda in January and helped train the local team for their participation in the Little League World Series. ... Hector Luna had Philadelphia's only other slam this year. ... Worley is 0-3 with a 6.75 ERA in his last five starts. ... Murphy was 4 for 44 with no extra-base hits in that span coming in. He went 3 for 5. ... Tejada ended an 0-for-10 slump with his leadoff hit. ... Cole Hamels (14-6, 2.99 ERA) tries to win his fourth straight decision Wednesday night. Matt Harvey (2-3, 2.75) starts for the Mets.