O'Connor was spotted by Crewe Alexandra scouts as a young teenager playing youth team football in Northern Ireland.
On 25 February 2006, aged 18, he made his Championship debut at Gresty Road when he came on as a late substitute for Gareth Taylor in a 2–1 win over Brighton & Hove Albion.
[5] He made his second senior appearance for the "Railwaymen" in the club's final game of the 2005–06 season against Millwall on 30 April 2006, replacing Lee Bell at half-time he went on to set up two goals and hit the post with his one shot.
He scored his first senior goal on 22 August, in the League Cup, with a "fierce shot" from 18 yards (16 m) in a 3–0 victory over Grimsby Town.
[4][12][13] O'Connor joined Peter Jackson's League Two side Lincoln City on a one-month emergency loan on 6 March 2009, a day before a Lincolnshire derby against Grimsby, as a short-term replacement for Lee Frecklington.
[14] O'Connor returned from Sincil Bank on 18 April after he was suspended for picking up 10 yellow cards that season, and subsequently trained with Scottish Premier League club Hibernian.
[4][15] In July 2009, Crewe accepted an undisclosed offer (later revealed to be £250,000) for O'Connor from Scunthorpe United, and he signed a three-year contract with the club.
[16][17] He went on to make 36 appearances for Scunthorpe in the 2009–10 campaign, helping Nigel Adkins's "Iron" to finish above the Championship relegation zone.
Scunthorpe struggled in the 2010–11 season following Atkins's departure, and Ian Baraclough and then Alan Knill failed to keep the club outside the relegation places.
[38] He retained his first-team place in the second half of the season, but stated that concerns over his contract running down and the daily commute from his Lincolnshire home were becoming a strain, and that he would consider offers from more local clubs in the summer.
[40] He was again named in the Football League team of the week after converting two penalties and putting in "a fine-all round performance" in a 4–1 home win over Rochdale on 23 April.
[45] The "Magpies" struggled in the first half of the 2016–17 season, but new manager Kevin Nolan said O'Connor had been "pivotal in the turnaround" in the club's form alongside midfield partner Robert Milsom.
[46] However, on 17 April he ruptured his anterior cruciate ligament (ACL) in a 3–1 defeat to Portsmouth at Meadow Lane, and was ruled out of action for the rest of the calendar year.
[48] He managed to make a return to training in February before playing in the last six games of the 2017–18 season to help County to secure a place in the play-offs.
[54] O'Connor went on to sign a new one-year contract and underwent a minor operation to remove a staple in his knee from his previous surgery.
[57][58] His appearances were limited due to the COVID-19 pandemic in England; he scored one goal in eight games for the "Ammies", but was released by manager Graham Alexander at the end of the 2019–20 season.
[72] On 26 March 2008, O'Connor made his senior international debut for Northern Ireland in a 4–1 win against Georgia in a friendly at Windsor Park; he came on as a half-time substitute for Damien Johnson.
[73] He made his competitive debut on 10 September 2008, playing in a 0–0 draw with the Czech Republic in a World Cup qualification match.
[75] He returned to the international scene after a three-year absence on 10 September 2013, when he featured in a 3–2 defeat to Luxembourg in a World Cup qualification game at Stade Josy Barthel.
[79] Port Vale assistant manager Paul Bodin also praised O'Connor's set piece delivery and energy levels.