The forward rose highest to nod home from a corner, beating keeper Sam Johnstone and double his tally for the campaign on his 21st appearance.
The Baggies were level moments after half time when Callum Robinson was on target, before Albion had Alex Mowatt sent off with 15 to go.
Tempers then boiled over late on as referee Thomas Brammall didn't award the hosts a clear penalty in the last minute, as both Johnstone and Aden Flint saw red after the final whistle.
The result saw Cardiff move four points away from the relegation zone, with West Brom remaining in fourth.
Blackburn Rovers are up to second in the table after they held Huddersfield to a 0-0 draw at Ewood Park, the Terriers staying sixth.
Bristol City climbed above Luton following their 3-2 victory at home over Millwall, courtesy of Andreas Weimann's hat-trick.
The forward had put his side ahead early on, firing in from distance following a poor clearance by keeper Bartosz Bialkowski.
Tom Bradshaw and Benik Afobe's penalty put the Lions in front by the break, but Weimann scored twice in the last 20 minutes to seal the win, as City went into 14th, a point above Luton, but having played three games more.
QPR are now fifth as they triumphed 2-1 at Birmingham City, who dropped to 18th.
Mark Warburton's side are now unbeaten on the road since October 23, as Albert Adomah and Chris Willock both found the net, with Chuks Aneke's goal proving a consolation.
On Saturday, Blackpool moved to 12th in the table as they beat Hull City 1-0, Gary Madine's 31st minute penalty proving the difference.
Meanwhile, Luton, who haven't played since December 11, are now 15th in the table, 11 points adrift of the play-offs, but with four games in hand.