{"id":15576,"date":"2026-09-05T15:06:40","date_gmt":"2026-09-05T13:06:40","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/toolbox\/open-graph-social-card-checker-og-image-twitter-card\/"},"modified":"2026-09-05T15:06:40","modified_gmt":"2026-09-05T13:06:40","slug":"open-graph-social-card-checker-og-image-twitter-card","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/open-graph-social-card-checker-og-image-twitter-card\/","title":{"rendered":"Open Graph &#038; Social Card Checker: og:image, Twitter Card, Link Preview"},"content":{"rendered":"<div class=\"gtm-analyser-container\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 20px;\">When a link is pasted into a chat or a social network, the receiving app fetches the page once and builds a card from a handful of meta tags: og:title, og:description, og:image, and for X the twitter:card type. Every mistake shows up as a broken preview: a missing image, a tiny logo stretched across the card, a title that is the site name, a description that is the cookie notice. This check fetches the page from this server, reads the tags, downloads the image and measures it, and draws the card as a first share would see it, without any script from the target page running here.<\/p>\n<div style=\"margin-bottom: 14px;\">\n        <label for=\"og-url\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Page address<\/label><br \/>\n        <input id=\"og-url\" type=\"text\" value=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; box-sizing: border-box; font-family: monospace;\">\n    <\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; margin-bottom: 16px;\">From this server: one request for the page (at most 1 MB) and one for the og:image (at most 6 MB). The preview shows a reduced copy of that image, embedded in the answer, so the browser of the visitor does not load anything from the target site. Hosts in private, loopback and link-local networks are refused. The query is protected by reCAPTCHA v3; the calling IP address and the target are stored for one hour to limit the rate.<\/p>\n<p>    <button id=\"og-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: var(--on-accent, #0b1114); border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Check the share preview<\/button><\/p>\n<div id=\"og-ausgabe\" style=\"margin-top: 22px;\"><\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.8rem; margin: 24px 0 0;\">Limits worth knowing: only tags in the served HTML count, tags inserted by JavaScript are invisible to every crawler and to this check alike; the card drawn here follows the common layout, each network crops and truncates in its own way; caches at Facebook, LinkedIn and messengers keep an older version of a page for days, so a fixed tag may show up there only after a re-scrape; and only the first og:image is measured.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"When a link is pasted into a chat or a social network, the receiving app fetches the page once and builds a card from a handful of meta tags: og:title, og:description, og:image, and for X the twitter:card type. Every mistake shows up as a broken preview: a missing image, a tiny logo stretched across the card, a title that is the site name, a description that is the cookie notice. This check fetches the page from this server, reads the tags, downloads the image and measures it, and draws the card as a first share would see it, without any script from the target page running here.\",\"label_url\":\"Page address\",\"datenschutz\":\"From this server: one request for the page (at most 1 MB) and one for the og:image (at most 6 MB). The preview shows a reduced copy of that image, embedded in the answer, so the browser of the visitor does not load anything from the target site. Hosts in private, loopback and link-local networks are refused. The query is protected by reCAPTCHA v3; the calling IP address and the target are stored for one hour to limit the rate.\",\"knopf\":\"Check the share preview\",\"laeuft\":\"Fetching page and image...\",\"grenze\":\"Limits worth knowing: only tags in the served HTML count, tags inserted by JavaScript are invisible to every crawler and to this check alike; the card drawn here follows the common layout, each network crops and truncates in its own way; caches at Facebook, LinkedIn and messengers keep an older version of a page for days, so a fixed tag may show up there only after a re-scrape; and only the first og:image is measured.\",\"h_vorschau\":\"Preview\",\"vorschau_hinweis\":\"Drawn from the tags found, with the image reduced on this server. The real card differs per network in cropping and truncation.\",\"karte_ohne_bild\":\"no image\",\"karte_ohne_titel\":\"(no title)\",\"karte_ohne_beschreibung\":\"(no description)\",\"h_bild\":\"Image\",\"zeile_bild_url\":\"og:image resolved to\",\"zeile_bild_masse\":\"Dimensions\",\"zeile_bild_typ\":\"Type and size\",\"zeile_bild_status\":\"Fetch status\",\"zeile_dauer\":\"Took\",\"zeile_limit\":\"Checks left this hour\",\"wert_keines\":\"none\",\"wert_fehlt\":\"missing\",\"wert_leer\":\"(empty)\",\"h_tags\":\"Tags as served\",\"h_befunde\":\"Findings\",\"stufe_hoch\":\"High\",\"stufe_mittel\":\"Medium\",\"stufe_niedrig\":\"Low\",\"stufe_info\":\"Information\",\"stufe_gut\":\"In order\",\"keine_befunde\":\"Nothing to report.\",\"urteil_gut\":\"The page shares with a complete card.\",\"urteil_warnung\":\"The card renders, but a part of it is missing or will look wrong somewhere.\",\"urteil_kritisch\":\"The image cannot be shown, or the page is not HTML.\",\"fehler_kein_token\":\"The check could not be started because reCAPTCHA did not load.\",\"fehler_captcha\":\"reCAPTCHA classified the request as automated. Reloading the page normally helps.\",\"fehler_zu_viele\":\"The limit of {limit} checks per hour for this address has been reached.\",\"fehler_adresse\":\"That address cannot be used.\",\"fehler_abruf\":\"The page could not be fetched.\",\"fehler_zaehler\":\"The rate counter is unavailable, so nothing was checked.\",\"fehler_pruefdienst\":\"The reCAPTCHA service could not be reached.\",\"fehler_aufbau\":\"The service is not configured correctly. The fault is on this side.\",\"fehler_eingabe\":\"The request could not be read.\",\"fehler_methode\":\"Wrong request method.\",\"fehler_netz\":\"The service could not be reached.\",\"fehler_antwort\":\"The answer could not be read.\",\"fehler_unbekannt\":\"Something went wrong that has no message of its own.\",\"grund_leer\":\"Nothing was entered.\",\"grund_zu_lang\":\"The input is too long.\",\"grund_unlesbar\":\"It does not parse as an address.\",\"grund_schema\":\"Only http and https addresses are checked.\",\"grund_benutzerinfo\":\"Inputs with credentials in them are refused.\",\"grund_kein_punkt\":\"The host name needs at least one dot.\",\"grund_hostform\":\"Enter a host name, not an IP address.\",\"grund_port\":\"Only the ports 80, 443, 8080 and 8443 are checked.\",\"grund_gesperrter_bereich\":\"That host resolves into a private or reserved network. Those are never contacted.\",\"grund_kein_dns\":\"The host name does not resolve.\",\"grund_abruf\":\"The address did not answer.\",\"grund_zu_viele_spruenge\":\"The address redirects too often.\",\"befund_status\":\"The server answered with status {status} || Crawlers building a preview see the same error page; most show no card at all.\",\"befund_weiterleitung\":\"Redirected {n} time(s) to {ziel} || Crawlers follow redirects, but some cache the card under the original address. The tags of the final page are what counts.\",\"befund_kein_html\":\"The address delivers {typ}, not HTML || No tags to read; a PDF or an image shares without a card.\",\"befund_og_title_fehlt\":\"No og:title, falling back to the title element ({title}) || Most networks use the title element when og:title is missing. Site-name suffixes then end up on the card.\",\"befund_og_title_fehlt_ganz\":\"No og:title and no title element || The card has nothing to show as a headline; some networks show the address instead.\",\"befund_og_title_lang\":\"og:title with {n} characters || Cards truncate titles at roughly 60 to 70 characters, often after one line. The meaning should sit at the beginning.\",\"befund_og_title_ok\":\"og:title with {n} characters || A length that fits the card.\",\"befund_og_title_gleich_title\":\"og:title equals the title element and is long || The card title may carry the site-name suffix that belongs in search results but not on a card.\",\"befund_og_description_fehlt\":\"No og:description, falling back to the meta description || Works on most networks. A dedicated og:description can be written for the card rather than for search results.\",\"befund_og_description_fehlt_ganz\":\"No og:description and no meta description || The card shows only a title, or the network picks a random sentence from the page.\",\"befund_og_description_lang\":\"og:description with {n} characters || Cards show two lines at most, roughly 120 to 200 characters. The rest is cut.\",\"befund_og_description_kurz\":\"og:description with only {n} characters || Too short to say what the page offers.\",\"befund_og_description_ok\":\"og:description with {n} characters || Fits the two lines a card shows.\",\"befund_og_image_fehlt\":\"No og:image || The card renders without an image, or the network picks the first large image on the page, which is rarely the right one. One tag with an absolute https address fixes it.\",\"befund_og_image_http\":\"og:image over http: {url} || Several networks refuse mixed content and show no image. Use the https address, or add og:image:secure_url.\",\"befund_og_image_relativ\":\"og:image is a relative path: {wert} || The specification requires an absolute URL. Some crawlers resolve it, others show no image. This check resolved it against the page address.\",\"befund_og_image_unerreichbar\":\"og:image cannot be fetched ({status} {fehler}): {url} || The tag points to an address that does not answer. The card shows no image, and networks cache that failure.\",\"befund_og_image_unlesbar\":\"og:image is not a readable image ({typ}, {kb} KB) || The address answers, but not with image data. Often an HTML page, a redirect to a login, or an SVG, which most networks do not render.\",\"befund_og_image\":\"Image {breite} \u00d7 {hoehe} px, {typ}, {kb} KB, aspect ratio {verhaeltnis}:1 || Measured after downloading the file.\",\"befund_og_image_zu_klein\":\"Image too small: {breite} \u00d7 {hoehe} px || Facebook and LinkedIn require at least 200 \u00d7 200 px and show nothing below that.\",\"befund_og_image_klein\":\"Image narrower than 600 px: {breite} \u00d7 {hoehe} px || Below 600 px width, Facebook shows a small square thumbnail instead of the large card. 1200 \u00d7 630 px is the safe size for every network.\",\"befund_og_image_mittel\":\"Image below the recommended 1200 \u00d7 630 px: {breite} \u00d7 {hoehe} px || The large card renders, but upscaled and soft on high-resolution screens.\",\"befund_og_image_gross_genug\":\"Image {breite} \u00d7 {hoehe} px, large enough for every network || Meets the 1200 \u00d7 630 px recommendation.\",\"befund_og_image_verhaeltnis\":\"Aspect ratio {verhaeltnis}:1 || Cards are cropped to about 1.91:1. A square or portrait image loses its top and bottom; a very wide one loses its sides. Composing for 1.91:1 avoids the crop.\",\"befund_og_image_zu_gross\":\"Image weighs {mb} MB || Facebook rejects images above 8 MB and shows no card image. Recompressing to well under 1 MB loses nothing on a card.\",\"befund_og_image_gross\":\"Image weighs {mb} MB || X limits card images to 5 MB; others accept it but fetch slowly. Recompressing helps everywhere.\",\"befund_og_image_schwer\":\"Image weighs {kb} KB || Fine for every network, but a card needs no more than a few hundred KB.\",\"befund_og_image_format\":\"Image format {typ} || Networks render JPEG, PNG, GIF and mostly WebP. SVG and AVIF are ignored by several of them.\",\"befund_og_image_webp\":\"Image is WebP || Facebook, X and LinkedIn render WebP; some messengers and older integrations do not. A JPEG is the safe choice for the share image.\",\"befund_og_image_weiterleitung\":\"og:image redirects ({n} hop(s)) || Crawlers follow, but a redirect in front of the image slows every preview and some cache the redirect target. Point the tag at the final address.\",\"befund_og_image_masse_fehlen\":\"No og:image:width and og:image:height (measured: {breite} \u00d7 {hoehe}) || Without these, Facebook renders the very first share without an image, because it has not fetched the file yet. The two tags let the card render correctly on the first share.\",\"befund_og_image_masse_falsch\":\"og:image:width\\\/height ({angegeben}) do not match the file ({gemessen}) || Wrong dimensions distort the first render. The tags should carry the actual pixel size.\",\"befund_og_image_alt_fehlt\":\"No og:image:alt || Screen readers on social networks read the alt text of the card image. Optional, but cheap.\",\"befund_og_image_mehrere\":\"{n} og:image tags || Networks pick the first, some let users choose. Only the first was measured.\",\"befund_og_url_fehlt\":\"No og:url || og:url names the canonical address a share should be counted under. Without it, shares of the same page under different addresses split.\",\"befund_og_url_abweichend\":\"og:url ({og}) differs from the canonical address ({canonical}) || Shares, likes and cached cards attach to og:url. A mismatch splits them across two addresses, or points the card at the wrong page.\",\"befund_og_url_ok\":\"og:url matches the canonical address || Shares attach to the right address.\",\"befund_og_type_fehlt\":\"No og:type || Defaults to website. Articles should say article, so networks show publication data.\",\"befund_og_type\":\"og:type {typ} || The object type networks use to pick the card layout.\",\"befund_og_site_name_fehlt\":\"No og:site_name || Cards show the domain instead of the site name. Cosmetic.\",\"befund_og_locale_form\":\"og:locale {wert} is not in the form language_TERRITORY || The value should look like de_DE or en_US.\",\"befund_article_ohne_datum\":\"og:type is article without article:published_time || Networks show the publication date on article cards when the tag exists.\",\"befund_twitter_card_fehlt\":\"No twitter:card || X falls back to a small summary card or none. summary_large_image shows the og:image full width; the other tags are taken from Open Graph.\",\"befund_twitter_card_ungueltig\":\"twitter:card has an unknown value: {wert} || Valid values are summary, summary_large_image, app and player.\",\"befund_twitter_card\":\"twitter:card {karte} || X uses this layout and reads title, description and image from the Open Graph tags when the twitter: variants are absent.\",\"befund_twitter_summary_mit_grossem_bild\":\"twitter:card is summary although the image is 1200 px wide || The large image is shrunk to a thumbnail. summary_large_image shows it full width.\",\"befund_twitter_site_fehlt\":\"No twitter:site or twitter:creator || Optional; X attributes the card to an account when one is named.\"};<\/p>\n<p>    var ENDPUNKT = '\/lw-ogcheck.php';\n    var SITEKEY = '6LcrPkEtAAAAAPo1QCOf-IIM2fCL0UfdJz4y2iSY';\n    var STUFEN = ['hoch', 'mittel', 'niedrig', 'info', 'gut'];\n    var OG_REIHE = ['title', 'description', 'image', 'image:secure_url', 'image:width', 'image:height', 'image:alt', 'image:type', 'url', 'type', 'site_name', 'locale'];\n    var TW_REIHE = ['card', 'title', 'description', 'image', 'image:alt', 'site', 'creator'];<\/p>\n<p>    function liste(w) { return Array.isArray(w) ? w : []; }\n    function zahl(w) { return (typeof w === 'number' && isFinite(w)) ? w : null; }\n    function text(schluessel, daten) {\n        var t = T[schluessel];\n        if (typeof t !== 'string') { return null; }\n        return t.replace(\/\\{([a-z_0-9]+)\\}\/g, function (m, k) {\n            return (daten && daten[k] !== undefined && daten[k] !== null) ? String(daten[k]) : m;\n        });\n    }\n    function strMap(o) { var r = {}; if (o && typeof o === 'object') { Object.keys(o).forEach(function (k) { if (typeof o[k] === 'string') { r[k] = o[k]; } }); } return r; }<\/p>\n<p>    function bewerten(antwort) {\n        var a = antwort || {};\n        if (a.fehler) { return { fehler: String(a.fehler), grund: a.grund || null, limit: zahl(a.limit) }; }\n        var befunde = liste(a.befunde).map(function (f) {\n            return { key: String(f.key || ''), stufe: STUFEN.indexOf(f.stufe) === -1 ? 'info' : f.stufe, daten: (f.daten && typeof f.daten === 'object') ? f.daten : {} };\n        });\n        var gruppen = {};\n        STUFEN.forEach(function (s) { gruppen[s] = befunde.filter(function (f) { return f.stufe === s; }); });\n        var k = (a.karte && typeof a.karte === 'object') ? a.karte : {};\n        var bi = (a.bild && typeof a.bild === 'object') ? a.bild : null;\n        var vorschau = bi && typeof bi.vorschau === 'string' && \/^data:image\\\/(jpeg|png|webp);base64,[A-Za-z0-9+\/=]+$\/.test(bi.vorschau) ? bi.vorschau : null;\n        return {\n            fehler: null, url: a.url ? String(a.url) : '', endurl: a.endurl ? String(a.endurl) : '',\n            urteil: (a.urteil === 'gut' || a.urteil === 'warnung' || a.urteil === 'kritisch') ? a.urteil : 'kritisch',\n            karte: { titel: k.titel ? String(k.titel) : null, beschreibung: k.beschreibung ? String(k.beschreibung) : null, site: k.site ? String(k.site) : null, host: k.host ? String(k.host) : '' },\n            og: strMap(a.og), twitter: strMap(a.twitter), title: a.title ? String(a.title) : null, description: a.description ? String(a.description) : null, canonical: a.canonical ? String(a.canonical) : null,\n            bild: bi ? { url: bi.url ? String(bi.url) : null, status: zahl(bi.status), breite: zahl(bi.breite), hoehe: zahl(bi.hoehe), typ: bi.typ ? String(bi.typ) : null, kb: zahl(bi.kb), vorschau: vorschau, fehler: bi.fehler ? String(bi.fehler) : null } : null,\n            befunde: befunde, gruppen: gruppen, dauer: zahl(a.dauer_ms), limitRest: zahl(a.limit_rest)\n        };\n    }<\/p>\n<p>    function skriptLaden() {\n        return new Promise(function (auf) {\n            if (window.grecaptcha) { auf(true); return; }\n            var s = document.createElement('script');\n            s.src = 'https:\/\/www.google.com\/recaptcha\/api.js?render=' + SITEKEY;\n            s.onload = function () { auf(true); }; s.onerror = function () { auf(false); };\n            document.head.appendChild(s);\n            setTimeout(function () { auf(!!window.grecaptcha); }, 8000);\n        });\n    }\n    function tokenHolen() {\n        return skriptLaden().then(function (da) {\n            if (!da || !window.grecaptcha || !window.grecaptcha.ready) { return null; }\n            return new Promise(function (auf) {\n                var fertig = false;\n                function einmal(w) { if (!fertig) { fertig = true; auf(w); } }\n                setTimeout(function () { einmal(null); }, 12000);\n                try {\n                    window.grecaptcha.ready(function () {\n                        if (fertig) { return; }\n                        if (!window.grecaptcha.execute) { einmal(null); return; }\n                        window.grecaptcha.execute(SITEKEY, { action: 'ogcheck' }).then(function (t) { einmal(t || null); }, function () { einmal(null); });\n                    });\n                } catch (e) { einmal(null); }\n            });\n        }, function () { return null; });\n    }\n    function abfragen(url) {\n        return tokenHolen().then(function (token) {\n            return fetch(ENDPUNKT, { method: 'POST', headers: { 'Content-Type': 'application\/json' }, body: JSON.stringify({ url: url, token: token || '' }) })\n                .then(function (r) { return r.json().then(function (j) { return j; }, function () { return { fehler: 'antwort' }; }); }, function () { return { fehler: 'netz' }; });\n        });\n    }<\/p>\n<p>    window.LW_TEST = window.LW_TEST || {};\n    window.LW_TEST.OG = { bewerten: bewerten, darstellen: null, text: text, ENDPUNKT: ENDPUNKT, STUFEN: STUFEN, T: T };<\/p>\n<p>    var btn = document.getElementById('og-btn');\n    var out = document.getElementById('og-ausgabe');\n    if (!btn || !out) { return; }<\/p>\n<p>    function el(tag, stil, txt) { var e = document.createElement(tag); if (stil) { e.setAttribute('style', stil); } if (txt !== undefined && txt !== null) { e.textContent = txt; } return e; }\n    function wert(id) { var e = document.getElementById(id); return e ? e.value : ''; }\n    var UEBERSCHRIFT = 'font-family: \"Nunito Sans\", sans-serif; font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.95rem; margin: 22px 0 8px;';\n    var ZELLE = 'padding: 5px 12px 5px 0; color: var(--text-secondary, #a0a0b0); font-size: 0.87rem;';\n    var ZELLE_WERT = 'padding: 5px 12px 5px 0; color: var(--text-primary, #e8e8ee); font-size: 0.87rem; font-family: monospace; word-break: break-all;';\n    var KASTEN = 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 8px; padding: 14px 16px; margin: 0 0 10px;';\n    var GUT = ' color: #7ee787;', WARN = ' color: #ffa94d;', ROT = ' color: #ff7b72;', GRAU = ' color: #8a8a99;';\n    var FARBEN = { hoch: '#ff7b72', mittel: '#ffa94d', niedrig: '#e3b341', info: '#8a8a99', gut: '#7ee787' };\n    var URTEIL = { gut: GUT, warnung: WARN, kritisch: ROT };\n    function gitter(sp) { return el('div', 'display: grid; grid-template-columns: ' + sp + '; gap: 0 18px; align-items: baseline;'); }\n    function paar(g, n, w, stil) { g.appendChild(el('div', ZELLE, n)); g.appendChild(el('div', ZELLE_WERT + (stil || ''), w)); }<\/p>\n<p>    function karte(b) {\n        var k = el('div', 'max-width: 520px; border: 1px solid var(--border, #2a2a35); border-radius: 12px; overflow: hidden; background: var(--bg-body, #14141a); margin: 0 0 8px;');\n        if (b.bild && b.bild.vorschau) {\n            var img = document.createElement('img'); img.src = b.bild.vorschau; img.alt = ''; img.setAttribute('style', 'display: block; width: 100%; aspect-ratio: 1.91 \/ 1; object-fit: cover; background: #000;');\n            k.appendChild(img);\n        } else {\n            k.appendChild(el('div', 'width: 100%; aspect-ratio: 1.91 \/ 1; display: flex; align-items: center; justify-content: center; color: #8a8a99; font-size: 0.85rem; background: #0b0b10;', T.karte_ohne_bild));\n        }\n        var unten = el('div', 'padding: 10px 14px;');\n        unten.appendChild(el('div', 'font-size: 0.75rem; text-transform: uppercase; color: #8a8a99; letter-spacing: 0.4px;', b.karte.host || ''));\n        unten.appendChild(el('div', 'font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.95rem; margin: 3px 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;', b.karte.titel || T.karte_ohne_titel));\n        unten.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;', b.karte.beschreibung || T.karte_ohne_beschreibung));\n        k.appendChild(unten);\n        return k;\n    }<\/p>\n<p>    function darstellen(b, ziel) {\n        ziel.innerHTML = '';\n        if (b.fehler) {\n            var txt = T['fehler_' + b.fehler] || T.fehler_unbekannt;\n            if (b.grund && T['grund_' + b.grund]) { txt = txt + ' ' + T['grund_' + b.grund]; }\n            if (b.limit !== null) { txt = txt.replace('{limit}', String(b.limit)); }\n            ziel.appendChild(el('p', ZELLE + WARN + ' margin: 0;', txt));\n            return;\n        }\n        ziel.appendChild(el('div', 'font-size: 1.05rem; font-weight: 700; margin: 0 0 12px;' + URTEIL[b.urteil], T['urteil_' + b.urteil]));<\/p>\n<p>        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_vorschau));\n        ziel.appendChild(karte(b));\n        ziel.appendChild(el('p', ZELLE + ' margin: 0 0 6px; font-size: 0.8rem;', T.vorschau_hinweis));<\/p>\n<p>        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_bild));\n        var gb = gitter('auto auto');\n        if (b.bild) {\n            paar(gb, T.zeile_bild_url, b.bild.url || '-');\n            if (b.bild.breite !== null) { paar(gb, T.zeile_bild_masse, b.bild.breite + ' \u00d7 ' + b.bild.hoehe + ' px' + (b.bild.hoehe ? ' (' + (Math.round(b.bild.breite \/ b.bild.hoehe * 100) \/ 100) + ':1)' : ''), b.bild.breite >= 1200 ? GUT : WARN); }\n            paar(gb, T.zeile_bild_typ, (b.bild.typ || '-') + (b.bild.kb !== null ? ', ' + b.bild.kb + ' KB' : ''), GRAU);\n            paar(gb, T.zeile_bild_status, b.bild.status !== null ? String(b.bild.status) : (b.bild.fehler || '-'), b.bild.status === 200 ? GUT : ROT);\n        } else { paar(gb, T.zeile_bild_url, T.wert_keines, ROT); }\n        if (b.dauer !== null) { paar(gb, T.zeile_dauer, b.dauer + ' ms', GRAU); }\n        if (b.limitRest !== null) { paar(gb, T.zeile_limit, String(b.limitRest), GRAU); }\n        ziel.appendChild(gb);<\/p>\n<p>        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_tags));\n        var gt = gitter('auto auto');\n        paar(gt, 'title', b.title || T.wert_fehlt, b.title ? GRAU : WARN);\n        paar(gt, 'description', b.description || T.wert_fehlt, b.description ? GRAU : WARN);\n        paar(gt, 'canonical', b.canonical || T.wert_fehlt, GRAU);\n        OG_REIHE.forEach(function (k) { if (b.og[k] !== undefined) { paar(gt, 'og:' + k, b.og[k] === '' ? T.wert_leer : b.og[k], k === 'title' || k === 'image' ? '' : GRAU); } });\n        Object.keys(b.og).forEach(function (k) { if (OG_REIHE.indexOf(k) === -1) { paar(gt, 'og:' + k, b.og[k] === '' ? T.wert_leer : b.og[k], GRAU); } });\n        TW_REIHE.forEach(function (k) { if (b.twitter[k] !== undefined) { paar(gt, 'twitter:' + k, b.twitter[k] === '' ? T.wert_leer : b.twitter[k], GRAU); } });\n        ziel.appendChild(gt);<\/p>\n<p>        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_befunde));\n        var irgendwas = false;\n        STUFEN.forEach(function (s) {\n            var gr = b.gruppen[s];\n            if (!gr.length) { return; }\n            irgendwas = true;\n            ziel.appendChild(el('div', 'font-weight: 700; font-size: 0.82rem; text-transform: uppercase; letter-spacing: 0.5px; margin: 14px 0 6px; color: ' + FARBEN[s] + ';', T['stufe_' + s] + ' (' + gr.length + ')'));\n            gr.forEach(function (f) {\n                var k = el('div', KASTEN + ' border-left: 3px solid ' + FARBEN[s] + ';');\n                var t = text('befund_' + f.key, f.daten) || f.key;\n                var teile = t.split(' || ');\n                k.appendChild(el('div', 'color: var(--text-primary, #e8e8ee); font-size: 0.9rem; font-weight: 700;', teile[0]));\n                if (teile[1]) { k.appendChild(el('div', ZELLE + ' padding: 6px 0 0; line-height: 1.55;', teile[1])); }\n                ziel.appendChild(k);\n            });\n        });\n        if (!irgendwas) { ziel.appendChild(el('p', ZELLE + ' margin: 0;', T.keine_befunde)); }\n    }\n    window.LW_TEST.OG.darstellen = darstellen;<\/p>\n<p>    var laeuft = false;\n    btn.addEventListener('click', function () {\n        if (laeuft) { return; }\n        laeuft = true; btn.disabled = true;\n        out.innerHTML = '';\n        out.appendChild(el('p', ZELLE + GRAU + ' margin: 0;', T.laeuft));\n        abfragen(wert('og-url')).then(function (a) { darstellen(bewerten(a), out); laeuft = false; btn.disabled = false; },\n            function () { darstellen(bewerten({ fehler: 'netz' }), out); laeuft = false; btn.disabled = false; });\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fetches a page, reads its Open Graph and Twitter Card tags, downloads the og:image and measures it, then renders the link preview the way messengers and social networks would: title, description, image and host, with findings on size, aspect ratio, weight, absolute URLs and missing tags.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":38,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92735,91094,91315],"class_list":["post-15576","page","type-page","status-publish","hentry","tag-content","tag-seo","tag-web-performance"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Open Graph &amp; Social Card Checker: og:image, Twitter Card, Link Preview - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/open-graph-social-card-checker-og-image-twitter-card\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Open Graph &amp; Social Card Checker: og:image, Twitter Card, Link Preview - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Fetches a page, reads its Open Graph and Twitter Card tags, downloads the og:image and measures it, then renders the link preview the way messengers and social networks would: title, description, image and host, with findings on size, aspect ratio, weight, absolute URLs and missing tags.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/open-graph-social-card-checker-og-image-twitter-card\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/open-graph-social-card-checker-og-image-twitter-card\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/open-graph-social-card-checker-og-image-twitter-card\\\/\",\"name\":\"Open Graph & Social Card Checker: og:image, Twitter Card, Link Preview - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-05T13:06:40+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/open-graph-social-card-checker-og-image-twitter-card\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/open-graph-social-card-checker-og-image-twitter-card\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/open-graph-social-card-checker-og-image-twitter-card\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Open Graph &#038; Social Card Checker: og:image, Twitter Card, Link Preview\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"luky\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Open Graph & Social Card Checker: og:image, Twitter Card, Link Preview - Lukas Wojcik - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/open-graph-social-card-checker-og-image-twitter-card\/","og_locale":"en_US","og_type":"article","og_title":"Open Graph & Social Card Checker: og:image, Twitter Card, Link Preview - Lukas Wojcik - Blog","og_description":"Fetches a page, reads its Open Graph and Twitter Card tags, downloads the og:image and measures it, then renders the link preview the way messengers and social networks would: title, description, image and host, with findings on size, aspect ratio, weight, absolute URLs and missing tags.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/open-graph-social-card-checker-og-image-twitter-card\/","og_site_name":"Lukas Wojcik - Blog","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/open-graph-social-card-checker-og-image-twitter-card\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/open-graph-social-card-checker-og-image-twitter-card\/","name":"Open Graph & Social Card Checker: og:image, Twitter Card, Link Preview - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-05T13:06:40+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/open-graph-social-card-checker-og-image-twitter-card\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/open-graph-social-card-checker-og-image-twitter-card\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/open-graph-social-card-checker-og-image-twitter-card\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/"},{"@type":"ListItem","position":3,"name":"Open Graph &#038; Social Card Checker: og:image, Twitter Card, Link Preview"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"luky","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/15576","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=15576"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/15576\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/38"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=15576"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=15576"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}