Two-time MLS Goalkeeper of the Year Andre Blake (four saves) earned his fifth shutout of the season.
The Timbers, who have been besieged with injuries, had their two-game winning streak snapped.
Goalkeeper Logan Ketterer (two saves) had posted shutouts in each of his previous two games. Ketterer is the fourth different goalkeeper used by the Timbers this season.
The Union nearly scored in the 12th minute when Wagner sent a low lining shot just wide from outside the top of the box.
Przybylko scored in the 26th minute to give the Union a 1-0 advantage as he headed a cross into the box past Ketterer.
Philadelphia went ahead 2-0 in the 31st minute when Santos redirected a corner kick into the net. The ball initially deflected off Przybylko.
Portland generated very little offensive pressure in the first half and managed only one shot on goal.
In the 55th minute, the Timbers' Felipe Mora appeared to have a solid scoring chance just inside the box. But Mora couldn't quite control the cross and the ball was cleared.
One minute later, Mora had another opportunity but shot the ball over the net.
The Union took a commanding 3-0 advantage in the 63rd minute when Elliott scored his first goal of the season. The ball was loose off a rebound and Elliott capitalized.
Elliott nearly scored again in the 73rd minute when he redirected a cross off the post.
The Timbers began to elevate their offensive play and Diego Valeri looked to have a goal in the 78th minute. But with a wide open net, Valeri sent the shot just high.