{"id":80,"date":"2026-06-25T18:35:53","date_gmt":"2026-06-25T18:35:53","guid":{"rendered":"https:\/\/jrpweb.com\/?page_id=80"},"modified":"2026-06-28T09:25:38","modified_gmt":"2026-06-28T09:25:38","slug":"world-cup-2026-knockout-stage","status":"publish","type":"page","link":"https:\/\/jrpweb.com\/?page_id=80","title":{"rendered":"World Cup 2026 \u2014 Knockout Stage"},"content":{"rendered":"\n<!-- ============================================================\n     World Cup 2026 \u2014 Knockout Stage TV Guide\n     ============================================================ -->\n\n<style>\n  #wc-knockout {\n    font-family: Arial, sans-serif;\n    max-width: 800px;\n    margin: 0 auto;\n    color: #222;\n  }\n  #wc-knockout .ko-loading,\n  #wc-knockout .ko-error,\n  #wc-knockout .ko-empty {\n    padding: 2rem;\n    text-align: center;\n    color: #666;\n    font-style: italic;\n  }\n  #wc-knockout .ko-error { color: #c00; }\n  #wc-knockout .ko-section-title {\n    font-size: 1rem;\n    font-weight: bold;\n    color: #222;\n    margin: 1.5rem 0 0.75rem;\n    padding-bottom: 6px;\n    border-bottom: 3px solid #1a3a8f;\n  }\n  #wc-knockout .ko-standings-grid {\n    display: grid;\n    grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));\n    gap: 10px;\n    margin-bottom: 1.5rem;\n  }\n  #wc-knockout .ko-group-card {\n    border: 1px solid #e0e0e0;\n    border-radius: 8px;\n    overflow: hidden;\n    background: #fff;\n  }\n  #wc-knockout .ko-group-title {\n    background: #1a3a8f;\n    color: #fff;\n    font-size: 0.75rem;\n    font-weight: bold;\n    padding: 5px 10px;\n    text-transform: uppercase;\n    letter-spacing: 0.05em;\n  }\n  #wc-knockout .ko-group-team {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    padding: 5px 10px;\n    font-size: 0.82rem;\n    border-bottom: 1px solid #f0f0f0;\n  }\n  #wc-knockout .ko-group-team:last-child { border-bottom: none; }\n  #wc-knockout .ko-group-team.qualified { background: #f0fff4; }\n  #wc-knockout .ko-group-team.in-contention { background: #fffbea; }\n  #wc-knockout .ko-team-name { display: flex; align-items: center; gap: 5px; }\n  #wc-knockout .ko-team-pts { font-size: 0.78rem; font-weight: bold; color: #555; white-space: nowrap; }\n  #wc-knockout .ko-qual-badge {\n    font-size: 0.65rem;\n    padding: 1px 5px;\n    border-radius: 3px;\n    margin-left: 4px;\n    font-weight: bold;\n  }\n  #wc-knockout .ko-qual-badge.q  { background: #d4edda; color: #155724; }\n  #wc-knockout .ko-qual-badge.p3 { background: #fff3cd; color: #856404; }\n  #wc-knockout .ko-day-header {\n    font-size: 1rem;\n    font-weight: bold;\n    color: #fff;\n    background: #1a3a8f;\n    padding: 8px 14px;\n    border-radius: 8px 8px 0 0;\n    margin-top: 1rem;\n  }\n  #wc-knockout .ko-day-fixtures {\n    border: 1px solid #1a3a8f;\n    border-top: none;\n    border-radius: 0 0 8px 8px;\n    overflow: hidden;\n    margin-bottom: 1rem;\n  }\n  #wc-knockout .ko-stage-divider {\n    font-size: 0.72rem;\n    font-weight: bold;\n    text-transform: uppercase;\n    letter-spacing: 0.05em;\n    color: #1a3a8f;\n    background: #eef2ff;\n    padding: 4px 14px;\n    border-bottom: 1px solid #d0d8f0;\n  }\n#wc-knockout .ko-england-bar {\n  display: block;\n  width: 4px;\n  background: #003366;\n  align-self: stretch;\n  border-radius: 2px;\n  flex-shrink: 0;\n}\n#wc-knockout .ko-england-badge {\n  font-size: 0.68rem;\n  padding: 2px 7px;\n  border-radius: 4px;\n  background: #e8f0ff;\n  color: #003366;\n  border: 1px solid #b0c4f0;\n  font-weight: bold;\n  white-space: nowrap;\n}\n  #wc-knockout .ko-fixture {\n    display: flex;\n    align-items: center;\n    padding: 10px 14px;\n    gap: 10px;\n    background: #fff;\n    border-bottom: 1px solid #f0f0f0;\n  }\n  #wc-knockout .ko-fixture:last-child { border-bottom: none; }\n  #wc-knockout .ko-fixture:nth-child(even) { background: #fafafa; }\n  #wc-knockout .ko-time-col { width: 80px; min-width: 80px; max-width: 80px; text-align: left; flex-shrink: 0; }\n  #wc-knockout .ko-time { font-size: 1rem; font-weight: bold; color: #222; display: block; }\n  #wc-knockout .ko-venue-small { font-size: 0.68rem; color: #999; display: block; margin-top: 2px; line-height: 1.2; }\n  #wc-knockout .ko-teams-col {\n    flex: 1;\n    display: flex;\n    align-items: center;\n    gap: 6px;\n    font-size: 0.95rem;\n    flex-wrap: wrap;\n  }\n  #wc-knockout .ko-team { display: flex; align-items: center; gap: 4px; font-weight: bold; }\n  #wc-knockout .ko-team.unconfirmed { font-weight: normal; color: #999; font-style: italic; }\n  #wc-knockout .ko-vs { color: #bbb; font-size: 0.8rem; }\n  #wc-knockout .ko-badges { display: flex; flex-direction: column; align-items: flex-end; gap: 4px; }\n  #wc-knockout .ko-channel {\n    font-size: 0.72rem;\n    font-weight: bold;\n    padding: 3px 8px;\n    border-radius: 4px;\n    white-space: nowrap;\n  }\n  #wc-knockout .ko-channel.bbc1    { background: #dce8ff; color: #1a3a8f; }\n  #wc-knockout .ko-channel.bbc2    { background: #dce8ff; color: #1a3a8f; }\n  #wc-knockout .ko-channel.itv1    { background: #ffe8d8; color: #8f3a1a; }\n  #wc-knockout .ko-channel.itvx    { background: #ffe8d8; color: #8f3a1a; }\n  #wc-knockout .ko-channel.unknown { background: #f0f0f0; color: #666; }\n  #wc-knockout .ko-stage-badge {\n    font-size: 0.68rem;\n    padding: 2px 6px;\n    border-radius: 4px;\n    background: #eee;\n    color: #555;\n    white-space: nowrap;\n  }\n<\/style>\n\n<div id=\"wc-knockout\">\n  <div class=\"ko-loading\">Loading fixtures and standings&#8230;<\/div>\n<\/div>\n\n<script>\n(function() {\n\n  var APPS_SCRIPT_URL = 'https:\/\/script.google.com\/macros\/s\/AKfycbzqk3HL6lHldSFpS1X2QiU19TQGvPlhDcBRymJQiidaumeS8VkoNIm0feGQ_CjWJF6QmA\/exec';\n\n  var FLAGS = {\n    'Algeria':'&#x1f1e9;&#x1f1ff;','Argentina':'&#x1f1e6;&#x1f1f7;','Australia':'&#x1f1e6;&#x1f1fa;','Austria':'&#x1f1e6;&#x1f1f9;',\n    'Belgium':'&#x1f1e7;&#x1f1ea;','Bosnia-Herzegovina':'&#x1f1e7;&#x1f1e6;','Brazil':'&#x1f1e7;&#x1f1f7;',\n    'Canada':'&#x1f1e8;&#x1f1e6;','Cape Verde':'&#x1f1e8;&#x1f1fb;','Cape Verde Islands':'&#x1f1e8;&#x1f1fb;',\n    'Colombia':'&#x1f1e8;&#x1f1f4;','Congo DR':'&#x1f1e8;&#x1f1e9;','Croatia':'&#x1f1ed;&#x1f1f7;',\n    'Curacao':'&#x1f1e8;&#x1f1fc;','Cura\u00e7ao':'&#x1f1e8;&#x1f1fc;','Czechia':'&#x1f1e8;&#x1f1ff;','DR Congo':'&#x1f1e8;&#x1f1e9;',\n    'Ecuador':'&#x1f1ea;&#x1f1e8;','Egypt':'&#x1f1ea;&#x1f1ec;','England':'&#x1f3f4;&#xe0067;&#xe0062;&#xe0065;&#xe006e;&#xe0067;&#xe007f;',\n    'France':'&#x1f1eb;&#x1f1f7;','Germany':'&#x1f1e9;&#x1f1ea;','Ghana':'&#x1f1ec;&#x1f1ed;',\n    'Haiti':'&#x1f1ed;&#x1f1f9;','IR Iran':'&#x1f1ee;&#x1f1f7;','Iraq':'&#x1f1ee;&#x1f1f6;','Ivory Coast':'&#x1f1e8;&#x1f1ee;',\n    'Japan':'&#x1f1ef;&#x1f1f5;','Jordan':'&#x1f1ef;&#x1f1f4;','Korea Republic':'&#x1f1f0;&#x1f1f7;',\n    'Mexico':'&#x1f1f2;&#x1f1fd;','Morocco':'&#x1f1f2;&#x1f1e6;','Netherlands':'&#x1f1f3;&#x1f1f1;',\n    'New Zealand':'&#x1f1f3;&#x1f1ff;','Norway':'&#x1f1f3;&#x1f1f4;','Panama':'&#x1f1f5;&#x1f1e6;',\n    'Paraguay':'&#x1f1f5;&#x1f1fe;','Portugal':'&#x1f1f5;&#x1f1f9;','Qatar':'&#x1f1f6;&#x1f1e6;',\n    'Saudi Arabia':'&#x1f1f8;&#x1f1e6;','Scotland':'&#x1f3f4;&#xe0067;&#xe0062;&#xe0073;&#xe0063;&#xe0074;&#xe007f;','Senegal':'&#x1f1f8;&#x1f1f3;',\n    'South Africa':'&#x1f1ff;&#x1f1e6;','South Korea':'&#x1f1f0;&#x1f1f7;','Spain':'&#x1f1ea;&#x1f1f8;',\n    'Sweden':'&#x1f1f8;&#x1f1ea;','Switzerland':'&#x1f1e8;&#x1f1ed;','Turkey':'&#x1f1f9;&#x1f1f7;','T\u00fcrkiye':'&#x1f1f9;&#x1f1f7;',\n    'Ukraine':'&#x1f1fa;&#x1f1e6;','United States':'&#x1f1fa;&#x1f1f8;','Uruguay':'&#x1f1fa;&#x1f1fe;',\n    'USA':'&#x1f1fa;&#x1f1f8;','Uzbekistan':'&#x1f1fa;&#x1f1ff;','Wales':'&#x1f3f4;&#xe0067;&#xe0062;&#xe0077;&#xe006c;&#xe0073;&#xe007f;'\n  };\n\n  var STAGE_LABELS = {\n    'Round of 32':          'Round of 32',\n    'Round of 16':          'Round of 16',\n    'Quarter-finals':       'Quarter-final',\n    'Semi-finals':          'Semi-final',\n    'Third place play-off': 'Third Place Play-off',\n    'Final':                'Final'\n  };\n\n\/\/ England's potential fixtures if they progress as Group L winners\nvar ENGLAND_FIXTURES = [\n  { stage:\"Round of 32\",    venue:\"Atlanta\",               time:\"17:00\" },\n { stage:\"Round of 16\", venue:\"Mexico City\", time:\"01:00\" },\n  { stage:\"Quarter-finals\", venue:\"Miami\",                 time:\"22:00\" },\n  { stage:\"Semi-finals\",    venue:\"Atlanta\",               time:\"20:00\" },\n  { stage:\"Final\",          venue:\"New York \/ New Jersey\", time:\"20:00\" },\n];\n\nfunction isEnglandFixture(f) {\n  return ENGLAND_FIXTURES.some(function(e) {\n    return e.stage === f.Stage && e.venue === f.Venue && e.time === f._time;\n  });\n}\n\n  var DAYS   = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'];\n  var MONTHS = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];\n\n  function flag(name) { return FLAGS[name] || '&#x1f3f3;'; }\n\n  function channelClass(ch) {\n    if (!ch) return 'unknown';\n    var c = ch.toLowerCase();\n    if (c.includes('bbc one') || c.includes('bbc 1')) return 'bbc1';\n    if (c.includes('bbc two') || c.includes('bbc 2')) return 'bbc2';\n    if (c.includes('itv1') || c.includes('itv 1')) return 'itv1';\n    if (c.includes('itvx') || c.includes('itv')) return 'itvx';\n    if (c.includes('bbc')) return 'bbc1';\n    return 'unknown';\n  }\n\n  function parseDate(raw) {\n    var d   = new Date(raw);\n    var bst = new Date(d.getTime() + 60 * 60 * 1000);\n    return DAYS[bst.getUTCDay()] + ' ' + bst.getUTCDate() + ' ' + MONTHS[bst.getUTCMonth()];\n  }\n\n  function parseTime(raw) {\n    var match = raw.toString().match(\/T(\\d{2}):(\\d{2})\/);\n    if (match) return match[1] + ':' + match[2];\n    return raw.toString();\n  }\n\n  \/\/ \u2500\u2500 Knockout fixtures \u2500\u2500\n  function renderFixtures(fixtures) {\n    if (!fixtures || fixtures.length === 0) {\n      return '<div class=\"ko-empty\">Knockout fixtures will appear here once the group stage is complete.'\n           + '<br><small>Check back from 28 June 2026.<\/small><\/div>';\n    }\n\n    var days     = {};\n    var dayOrder = [];\n\n    fixtures.forEach(function(f) {\n      f._date = parseDate(f.Date);\n      f._time = parseTime(f.Time);\n      if (!days[f._date]) { days[f._date] = []; dayOrder.push(f._date); }\n      days[f._date].push(f);\n    });\n\n    var html = '<div class=\"ko-section-title\">Knockout Fixtures<\/div>';\n\n    dayOrder.forEach(function(date) {\n      html += '<div class=\"ko-day-header\">' + date + '<\/div>';\n      html += '<div class=\"ko-day-fixtures\">';\n\n      var lastStage = '';\n      days[date].forEach(function(f) {\n        var stageLabel = STAGE_LABELS[f.Stage] || f.Stage;\n        if (f.Stage !== lastStage) {\n          html += '<div class=\"ko-stage-divider\">' + stageLabel + '<\/div>';\n          lastStage = f.Stage;\n        }\n\n        var ch      = f.Channel || '';\n        var chLabel = ch || 'TBC';\n        var chClass = channelClass(ch);\n        var venue   = f.Venue || '';\n\n        var homeHtml = f.HomeConfirmed && f.HomeTeam\n          ? '<span class=\"ko-team\">' + flag(f.HomeTeam) + ' ' + f.HomeTeam + '<\/span>'\n          : '<span class=\"ko-team unconfirmed\">TBC<\/span>';\n\n        var awayHtml = f.AwayConfirmed && f.AwayTeam\n          ? '<span class=\"ko-team\">' + flag(f.AwayTeam) + ' ' + f.AwayTeam + '<\/span>'\n          : '<span class=\"ko-team unconfirmed\">TBC<\/span>';\n\nvar englandMatch = isEnglandFixture(f);\nhtml += '<div class=\"ko-fixture\"' + (englandMatch ? ' style=\"background:#f0f4ff;\"' : '') + '>'\n      + (englandMatch ? '<span class=\"ko-england-bar\"><\/span>' : '')\n      + '<div class=\"ko-time-col\">'\n              + '<span class=\"ko-time\">' + f._time + '<\/span>'\n              + (venue ? '<span class=\"ko-venue-small\">' + venue + '<\/span>' : '')\n              + '<\/div>'\n              + '<div class=\"ko-teams-col\">' + homeHtml + '<span class=\"ko-vs\">vs<\/span>' + awayHtml + '<\/div>'\n              + '<div class=\"ko-badges\">'\n              + '<span class=\"ko-channel ' + chClass + '\">' + chLabel + '<\/span>'\n             + (englandMatch ? '<span class=\"ko-england-badge\">&#x1f3f4;&#xe0067;&#xe0062;&#xe0065;&#xe006e;&#xe0067;&#xe007f; Eng<\/span>' : '')\n+ '<\/div>'\n+ '<\/div>';\n      });\n\n      html += '<\/div>';\n    });\n\n    return html;\n  }\n\n  \/\/ \u2500\u2500 Group standings \u2500\u2500\n  function renderStandings(standings) {\n    if (!standings || standings.length === 0) return '';\n\n    var groups = {};\n    standings.forEach(function(s) {\n      if (!groups[s.Group]) groups[s.Group] = [];\n      groups[s.Group].push(s);\n    });\n\n    var html = '<div class=\"ko-section-title\">Group Stage Standings<\/div>';\n    html += '<div class=\"ko-standings-grid\">';\n\n    Object.keys(groups).sort().forEach(function(groupName) {\n      var teams = groups[groupName].sort(function(a,b) { return a.Position - b.Position; });\n      html += '<div class=\"ko-group-card\"><div class=\"ko-group-title\">' + groupName + '<\/div>';\n\n      teams.forEach(function(t) {\n        var done     = (t.Played >= 3);\n        var rowClass = '';\n        var badge    = '';\n        if (t.Position <= 2) {\n          rowClass = 'qualified';\n          if (done) badge = '<span class=\"ko-qual-badge q\">Q<\/span>';\n        } else if (t.Position === 3) {\n          rowClass = 'in-contention';\n          if (done) badge = '<span class=\"ko-qual-badge p3\">P3<\/span>';\n        }\n        html += '<div class=\"ko-group-team ' + rowClass + '\">'\n              + '<span class=\"ko-team-name\">' + flag(t.Team) + ' ' + t.Team + badge + '<\/span>'\n              + '<span class=\"ko-team-pts\">' + t.Points + ' pts<\/span>'\n              + '<\/div>';\n      });\n\n      html += '<\/div>';\n    });\n\n    html += '<\/div>';\n    html += '<p style=\"font-size:0.75rem;color:#888;margin:0 0 1rem\">'\n          + '<strong style=\"color:#155724\">Q<\/strong> = qualified &nbsp;'\n          + '<strong style=\"color:#856404\">P3<\/strong> = possible best 3rd place<\/p>';\n    return html;\n  }\n\n  \/\/ \u2500\u2500 Fetch and render \u2500\u2500\n  fetch(APPS_SCRIPT_URL)\n    .then(function(r) { return r.json(); })\n    .then(function(data) {\n      document.getElementById('wc-knockout').innerHTML =\n        renderFixtures(data.fixtures) + renderStandings(data.standings);\n    })\n    .catch(function(err) {\n      document.getElementById('wc-knockout').innerHTML =\n        '<div class=\"ko-error\">Could not load fixtures. Please try again later.<\/div>';\n      console.error('WC knockout error:', err);\n    });\n\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Loading fixtures and standings&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-80","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/jrpweb.com\/index.php?rest_route=\/wp\/v2\/pages\/80","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jrpweb.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/jrpweb.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/jrpweb.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jrpweb.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=80"}],"version-history":[{"count":9,"href":"https:\/\/jrpweb.com\/index.php?rest_route=\/wp\/v2\/pages\/80\/revisions"}],"predecessor-version":[{"id":96,"href":"https:\/\/jrpweb.com\/index.php?rest_route=\/wp\/v2\/pages\/80\/revisions\/96"}],"wp:attachment":[{"href":"https:\/\/jrpweb.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=80"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}