The Diamondbacks catcher first hit a home run to break a 3-all tie, then threw out Luis Rivas trying to steal second base to help stop a Pirates rally.
"He obviously played an integral part in the win today," Arizona manager Bob Melvin said.
Leading off the ninth, Snyder hit a 1-1 change-up into the left-field seats against reliever John Grabow (4-2) for his sixth home run of the season. Snyder had been robbed off a possible home run in the fourth inning when Jason Bay made a running catch against the left-field wall.
"I had to put a little bit more into that one than I did the first one," Snyder said. "I was just trying to hit the ball and get on base. I was trying to do anything I could to get on base."
The Diamondbacks, who blew a 3-0 lead, beat Pittsburgh for the second straight night. Snyder's home run made a winner of Juan Cruz (2-0), who pitched an inning of scoreless relief. Brandon Lyon allowed two baserunners in the ninth inning and needed a little help from his catcher to secure his 14th save.
Ryan Doumit led off with a single and was replaced by Rivas. After Jason Michaels flied out and with Doug Mientkiewicz batting, Rivas broke for second. He was called out on a close play.
Mientkiewicz then walked before Adam LaRoche flied out to end the game.
"(Rivas) thought he could make it," Pittsburgh manager John Russell said. "Lyon had been relatively slow to the plate. He sped up his delivery, and the catcher made a nice throw."
Snyder said he was expecting Rivas to run.
"At some point, when they put in a pinch-runner like Rivas, he's going to go," he said. "Lyon gave me a good pitch to throw, I made a good throw and got him."
The Diamondbacks scored three runs in the first off Pirates starter Tom Gorzelanny. Chris Burke, who was hitting leadoff for the first time this season, drew a walk and was sacrificed to second by Stephen Drew. Orlando Hudson followed with a four-pitch walk.
Conor Jackson singled to score Burke, Chris Young's double brought home Hudson, and Mark Reynolds hit a sacrifice fly that scored Jackson.
After the rocky start, Gorzelanny shut down Arizona the rest of the way. The left-hander went seven innings for his longest outing since May 10 and allowed three runs and five hits. He struck out one and walked three.
"He had some misfires," Russell said. "But after the first, he settled in. He came a long way tonight. He threw the ball well."
The Pirates made it 3-1 in the third against Arizona starter Dan Haren. LaRoche started the inning with a walk and, with two outs, scored from second on Nate McLouth's double.
Jason Bay led off the fourth with a home run to make it 3-2. Bay, who finished 1-for-4, has now hit safely in 16 of his past 18 games. His blast came a half-inning after his catch.
"Especially with the way the first inning started, it was great that we battled back and put ourselves in a position to win," Bay said.
McLouth hit a home run into the right-field seats with two outs in the fifth to tie the game at 3. His 14th homer of the season set a career high. McLouth went 2-for-4.
Haren pitched seven innings and allowed three runs and five hits. The right-hander struck out six and walked one.
"I've had good stuff the past couple of starts," Haren said. "Today, I didn't have much. We got an early lead, which was nice. I just tried to battle, and they fought back. It's a tough team to beat at home."
Young had a pair of doubles for Arizona, which scored more than four runs in a game for just the seventh time in 20 games.
"We've been battling, grinding and fighting," Snyder said. "Tonight, it worked out good for us."