{"id":39759,"date":"2025-05-19T09:00:00","date_gmt":"2025-05-19T07:00:00","guid":{"rendered":"https:\/\/www.everyday-guide.com\/site\/toms-vs-allbirds-vs-hey-dude-which-casual-shoe-wins\/"},"modified":"2026-02-07T07:35:56","modified_gmt":"2026-02-07T06:35:56","slug":"toms-vs-allbirds-vs-hey-dude-which-casual-shoe-wins","status":"publish","type":"post","link":"https:\/\/www.everyday-guide.com\/site\/toms-vs-allbirds-vs-hey-dude-which-casual-shoe-wins\/","title":{"rendered":"TOMS vs. Allbirds vs. Hey Dude: Which Casual Shoe Wins?"},"content":{"rendered":"\n<ul class=\"wp-block-list\">\n<li><strong>Allbirds wins on comfort and sustainability.<\/strong> Hey Dude wins on price. TOMS wins on style versatility. There's no single best shoe here, but there is a best shoe for each situation.<\/li>\n<li><strong>For everyday all-day wear, Allbirds Wool Runners justify the higher price.<\/strong> For kicking around on weekends, Hey Dude Wally gives you 80% of the comfort at half the cost.<\/li>\n<li><strong>TOMS is the weakest on durability across all three brands.<\/strong> If longevity matters to you, look at Allbirds or Hey Dude first.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1150\" height=\"1150\" src=\"https:\/\/www.everyday-guide.com\/site\/wp-content\/uploads\/2026\/02\/toms-shoes_article-3-comparison_img2_v2.webp\" alt=\"Brand image\" class=\"wp-image-39987\" srcset=\"https:\/\/www.everyday-guide.com\/site\/wp-content\/uploads\/2026\/02\/toms-shoes_article-3-comparison_img2_v2.webp 1150w, https:\/\/www.everyday-guide.com\/site\/wp-content\/uploads\/2026\/02\/toms-shoes_article-3-comparison_img2_v2-300x300.webp 300w, https:\/\/www.everyday-guide.com\/site\/wp-content\/uploads\/2026\/02\/toms-shoes_article-3-comparison_img2_v2-1024x1024.webp 1024w, https:\/\/www.everyday-guide.com\/site\/wp-content\/uploads\/2026\/02\/toms-shoes_article-3-comparison_img2_v2-150x150.webp 150w, https:\/\/www.everyday-guide.com\/site\/wp-content\/uploads\/2026\/02\/toms-shoes_article-3-comparison_img2_v2-768x768.webp 768w\" sizes=\"auto, (max-width: 1150px) 100vw, 1150px\" \/><\/figure>\n\n\n\n\n<h2 class=\"wp-block-heading\">Why These Three Brands?<\/h2>\n\n\n\n<p>TOMS, Allbirds, and Hey Dude occupy the same space in your closet: the casual, easy slip-on (or near-slip-on) shoe you grab when you don't want to think about what's on your feet. They all aim for comfort-first, style-second. And they all cost between $50 and $100, give or take.<\/p><div id=\"relatedsearches1\" class=\"every-content-2\" style=\"height: 450px;\"><script>console.log(\"RSOC loading..\");<\/script>\r\n<!-- Initialize Google CSA object - Required for ad functionality -->\r\n<script type=\"text\/javascript\" charset=\"utf-8\">\r\n\t(function(g,o){g[o]=g[o]||function(){(g[o]['q']=g[o]['q']||[]).push(\r\n\t\targuments)},g[o]['t']=1*new Date})(window,'_googCsa');\r\n<\/script><\/div><style>\r\n  #relatedsearches1,\r\n  #relatedsearches2 {\r\n    \/* Base container styles - final appearance *\/\r\n    margin-bottom: 20px;\r\n    padding: 15px;\r\n    background-color: #111827; \/* Final background color (gray-900) *\/\r\n    border-radius: 8px;\r\n    min-height: 250px; \/* Restore a reasonable min-height *\/\r\n    box-sizing: border-box;\r\n    overflow: hidden;\r\n    position: relative; \/* Needed to contain the absolute overlay *\/\r\n  }\r\n\r\n  \/* REMOVED .skeleton-active styles *\/\r\n\r\n  .skeleton-overlay {\r\n    position: absolute;\r\n    inset: 0; \/* Cover parent *\/\r\n    z-index: 10; \/* Ensure it's on top *\/\r\n    pointer-events: none; \/* Prevent interaction *\/\r\n    border-radius: 8px; \/* Match parent *\/\r\n\r\n    \/* --- Skeleton visuals applied directly to the overlay --- *\/\r\n    --skeleton-bar-height: 35px;\r\n    --skeleton-gap-height: 15px;\r\n    --skeleton-unit-height: calc(var(--skeleton-bar-height) + var(--skeleton-gap-height));\r\n    --skeleton-padding: 15px;\r\n    --skeleton-bar-color: #374151; \/* gray-700 *\/\r\n    --skeleton-bg-color: #1f2937;  \/* gray-800 *\/\r\n    --skeleton-shimmer-color: rgba(52, 211, 153, 0.1); \/* emerald-400 10% *\/\r\n\r\n    background-color: var(--skeleton-bg-color);\r\n    background-image:\r\n      linear-gradient(to right, transparent, var(--skeleton-shimmer-color), transparent),\r\n      linear-gradient(var(--skeleton-bar-color) var(--skeleton-bar-height), transparent 0);\r\n    background-size:\r\n      200% var(--skeleton-bar-height),\r\n      calc(100% - (2 * var(--skeleton-padding))) var(--skeleton-unit-height);\r\n    background-repeat: repeat-y;\r\n    background-position:\r\n      calc(-200% + var(--skeleton-padding)) var(--skeleton-padding),\r\n      var(--skeleton-padding) var(--skeleton-padding);\r\n    animation: shimmer 1.5s infinite linear;\r\n    \/* --- End Skeleton Visuals --- *\/\r\n\r\n    \/* --- Visibility Control --- *\/\r\n    opacity: 0;\r\n    transition: opacity 0.3s ease-out;\r\n  }\r\n\r\n  .skeleton-overlay.skeleton-visible {\r\n    opacity: 1;\r\n  }\r\n\r\n  @keyframes shimmer {\r\n    to {\r\n       background-position:\r\n        calc(200% + var(--skeleton-padding)) var(--skeleton-padding),\r\n        var(--skeleton-padding) var(--skeleton-padding);\r\n    }\r\n  }\r\n\r\n  \/* No longer need rules for .skeleton-loading class or :empty *\/\r\n\r\n<\/style>\n\n\n\n<p>But they approach the job differently. TOMS is the social-impact brand with canvas roots. Allbirds is the sustainability-obsessed Silicon Valley darling. Hey Dude is the laid-back newcomer that blew up on TikTok. Each has real strengths and real weaknesses.<\/p>\n\n\n\n<p>Let's break them down category by category so you can pick the right one for how you actually live.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Comfort: Allbirds Takes This One Easily<\/h2>\n\n\n\n<p>This isn't close. Allbirds Wool Runners feel like wearing slippers that happen to look like shoes. The merino wool upper is soft and breathable. The SweetFoam sole (made from sugarcane) cushions without feeling mushy. And the shoe weighs almost nothing.<\/p>\n\n\n\n<p>Hey Dude Wally comes in second. The Flex & Fold sole is surprisingly cushioned for such a cheap shoe. The upper is soft <a href=\"https:\/\/www.everyday-guide.com\/site\/9k29\" title=\"Uniqlo\" class=\"pretty-link-keyword\"rel=\"nofollow sponsored \" target=\"_blank\">cotton<\/a> canvas or recycled knit, depending on the style. They're lightweight and easy to break in (about one day of wear). The elastic laces mean you can slide them on like slip-ons.<\/p>\n\n\n\n<p>TOMS Alpargata finishes last on comfort. The OrthoLite insole is fine, but the flat construction offers minimal arch support. The canvas upper is comfortable once broken in, but it's stiff for the first few wears. And there's no real cushioning in the sole. Your feet feel the ground.<\/p>\n\n\n\n<p><strong>Comfort ranking: Allbirds > Hey Dude > TOMS<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"650\" height=\"650\" src=\"https:\/\/www.everyday-guide.com\/site\/wp-content\/uploads\/2026\/02\/toms-shoes_article-3-comparison_img3_v2.webp\" alt=\"Brand image\" class=\"wp-image-39988\" srcset=\"https:\/\/www.everyday-guide.com\/site\/wp-content\/uploads\/2026\/02\/toms-shoes_article-3-comparison_img3_v2.webp 650w, https:\/\/www.everyday-guide.com\/site\/wp-content\/uploads\/2026\/02\/toms-shoes_article-3-comparison_img3_v2-300x300.webp 300w, https:\/\/www.everyday-guide.com\/site\/wp-content\/uploads\/2026\/02\/toms-shoes_article-3-comparison_img3_v2-150x150.webp 150w\" sizes=\"auto, (max-width: 650px) 100vw, 650px\" \/><\/figure>\n\n\n\n\n<h2 class=\"wp-block-heading\">Durability: Hey Dude and Allbirds Both Beat TOMS<\/h2>\n\n\n\n<p>TOMS Alpargatas are the least durable shoes in this comparison. The canvas starts fraying after three to four months of regular wear. The sole-to-upper bond weakens when exposed to moisture. Most people get 6-8 months out of a pair before they look worn out.<\/p>\n\n\n\n<p>Hey Dude Wally holds up better than you'd expect for a $50 shoe. The sole stays intact, and the upper resists pilling and fraying through about a year of regular use. The weak point is the insole, which compresses and loses cushioning after 8-10 months. But insoles are replaceable for $10.<\/p>\n\n\n\n<p>Allbirds Wool Runners last the longest. The wool upper is naturally resilient and doesn't fray like <a href=\"https:\/\/www.everyday-guide.com\/site\/9k29\" title=\"Uniqlo\" class=\"pretty-link-keyword\"rel=\"nofollow sponsored \" target=\"_blank\">cotton<\/a> canvas. The sole wears evenly and maintains its shape. With normal rotation (3-4 times per week), you'll get 12-18 months out of a pair. Some owners report two years with proper care.<\/p>\n\n\n\n<p><strong>Durability ranking: Allbirds > Hey Dude > TOMS<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Price and Value: Hey Dude Wins the Math<\/h2>\n\n\n\n<p>Let's compare the flagship casual shoe from each brand:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>TOMS Alpargata:<\/strong> $55-$65 retail. Lasts 6-8 months. Cost per wear (at 4x\/week): ~$0.35-$0.55<\/li>\n<li><strong>Hey Dude Wally:<\/strong> $50-$60 retail. Lasts 10-12 months. Cost per wear (at 4x\/week): ~$0.25-$0.35<\/li>\n<li><strong>Allbirds Wool Runner:<\/strong> $98 retail. Lasts 12-18 months. Cost per wear (at 4x\/week): ~$0.30-$0.45<\/li>\n<\/ul>\n\n\n\n<p>Hey Dude offers the best raw value. You're paying less upfront and the shoe lasts longer than TOMS. The cost-per-wear math favors Hey Dude clearly.<\/p>\n\n\n\n<p>Allbirds costs nearly double the other two at retail, but the durability pulls the cost-per-wear into a competitive range. If you catch Allbirds on sale (which happens 2-3 times a year at 20-30% off), the value proposition gets very strong.<\/p><div id=\"every-2686467948\" class=\"every-content-4\"><div class='content_4' style='min-width: 300px; min-height: 250px;'>\r\n  <\/div><\/div>\n\n\n\n<p>TOMS has the worst value on pure math. You're paying a social-impact premium, which is fine if that matters to you, but your wallet will notice.<\/p>\n\n\n\n<p><strong>Value ranking: Hey Dude > Allbirds > TOMS<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Sustainability: Allbirds Is the Clear Leader<\/h2>\n\n\n\n<p>Allbirds built its entire brand on sustainability, and it shows. Every product has a carbon footprint label (like a <a href=\"https:\/\/www.everyday-guide.com\/site\/yff5\" title=\"GNC\" class=\"pretty-link-keyword\"rel=\"nofollow sponsored \" target=\"_blank\">nutrition<\/a> label for emissions). They use merino wool, eucalyptus tree fiber, sugarcane-based foam, and recycled materials throughout their lineup. They're a certified B Corp and have committed to cutting their carbon footprint in half by 2025 (from a 2020 baseline).<\/p>\n\n\n\n<p>TOMS is making progress. About two-thirds of their products use sustainable materials like organic <a href=\"https:\/\/www.everyday-guide.com\/site\/9k29\" title=\"Uniqlo\" class=\"pretty-link-keyword\"rel=\"nofollow sponsored \" target=\"_blank\">cotton<\/a> and recycled polyester. They donate a third of profits. They've set science-based targets for emissions reduction. It's real effort, but it's playing catch-up to Allbirds.<\/p>\n\n\n\n<p>Hey Dude is the weakest here. Crocs Inc. (Hey Dude's parent company since 2022) has made some sustainability commitments, and Hey Dude does use recycled materials in some styles. But there's less transparency, fewer certifications, and no carbon labeling. If sustainability drives your purchasing, Hey Dude is the hardest to feel good about.<\/p>\n\n\n\n<p><strong>Sustainability ranking: Allbirds > TOMS > Hey Dude<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Sizing and Fit: Three Different Approaches<\/h2>\n\n\n\n<p>Getting the right size is half the battle with casual shoes. Here's how each brand fits:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">TOMS<\/h3>\n\n\n\n<p>The Alpargata runs true to size for most people. Go up a half size if you're between sizes; the canvas stretches. No wide widths available on most styles, which is a problem for anyone with broader feet. Sizing is inconsistent across different TOMS models (the Mallow runs big, <a href=\"https:\/\/www.everyday-guide.com\/site\/yzhf\" title=\"www.tecovas.com\" class=\"pretty-link-keyword\"rel=\"nofollow sponsored \" target=\"_blank\">boots<\/a> run narrow).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Allbirds<\/h3>\n\n\n\n<p>Wool Runners run true to size. The knit upper has some natural give, so they accommodate slightly wider feet better than TOMS. Allbirds doesn't offer half sizes in every style, which forces some people into a too-big or too-small dilemma. If you're a half size, round up.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Hey Dude<\/h3>\n\n\n\n<p>The Wally runs large. Size down at least a half size, sometimes a full size. Wide-footed people actually benefit from Hey Dude's roomy fit, making it the most accommodating option of the three. The elastic laces also provide flexibility that structured shoes can't.<\/p>\n\n\n\n<p><strong>Best for wide feet: Hey Dude. Most consistent sizing: TOMS Alpargata (stick to this specific model). Best return policy for getting the right fit: Allbirds (30 days, even if worn).<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Style Versatility: Where TOMS Finally Wins<\/h2>\n\n\n\n<p>Here's where TOMS earns its keep. The Alpargata is the most versatile shoe in this comparison. It works with shorts, chinos, linen pants, and even casual suits. The clean, minimal silhouette reads as &#8220;put-together&#8221; in a way that Hey Dude and Allbirds don't quite match.<\/p>\n\n\n\n<p>Hey Dude Wally looks too casual for anything beyond jeans and shorts. It's a great beach\/backyard shoe, but wearing it to a nice-casual dinner feels underdressed. The chunky sole and relaxed construction give it a &#8220;just rolled out of bed&#8221; vibe that doesn't work everywhere.<\/p>\n\n\n\n<p>Allbirds falls in the middle. The Wool Runner looks clean enough for a casual office, but it still clearly reads as a sneaker. It's fine for most situations, but it won't substitute for a dressier shoe the way TOMS sometimes can.<\/p>\n\n\n\n<p>TOMS also offers the widest range of patterns and colors. You can find Alpargatas in solid neutrals, bold prints, seasonal patterns, and collaborative designs. Allbirds sticks to muted earth tones. Hey Dude offers some variety but leans heavily toward basic grays and blues.<\/p>\n\n\n\n<p><strong>Style ranking: TOMS > Allbirds > Hey Dude<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Shipping and Returns: The Practical Stuff<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>TOMS:<\/strong> Free shipping over $65. Standard delivery 5-7 business days. Free returns within 30 days (unworn only). No phone support.<\/li>\n<li><strong>Allbirds:<\/strong> Free shipping on all orders, no minimum. Arrives in 5-7 business days. Free returns within 30 days, even if you've worn them. Phone and chat support available. This is the best return policy of the three.<\/li>\n<li><strong>Hey Dude:<\/strong> Free shipping over $60. Standard delivery 5-10 business days (slower than the others). Free returns within 60 days (unworn). Longest return window, but you can't wear them first.<\/li>\n<\/ul>\n\n\n\n<p>Allbirds wins here with no-minimum free shipping and worn-shoe returns. Hey Dude's 60-day window is generous but the unworn requirement limits its usefulness. TOMS is the least flexible of the three.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">The Head-to-Head Summary<\/h2>\n\n\n\n<p>Here's where each brand wins and where it loses:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Best overall comfort:<\/strong> Allbirds Wool Runner<\/li>\n<li><strong>Best durability:<\/strong> Allbirds Wool Runner<\/li>\n<li><strong>Best price:<\/strong> Hey Dude Wally<\/li>\n<li><strong>Best value (cost per wear):<\/strong> Hey Dude Wally<\/li>\n<li><strong>Best sustainability:<\/strong> Allbirds<\/li>\n<li><strong>Best social impact:<\/strong> TOMS<\/li>\n<li><strong>Best style versatility:<\/strong> TOMS Alpargata<\/li>\n<li><strong>Best for wide feet:<\/strong> Hey Dude Wally<\/li>\n<li><strong>Best return policy:<\/strong> Allbirds<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Which One Should You Actually Buy?<\/h2>\n\n\n\n<p>This depends on what you prioritize. Here are the clear-cut recommendations:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Buy Allbirds If&#8230;<\/h3>\n\n\n\n<p>You want the most comfortable casual shoe money can buy and you're willing to pay for it. The Wool Runner at $98 is a lot, but the comfort, durability, and sustainability credentials justify the price. If you wear casual shoes 4+ days a week and want something that lasts, Allbirds is the move. Catch them on sale for $70-$80 and it's a no-brainer.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Buy Hey Dude If&#8230;<\/h3>\n\n\n\n<p>You want comfort and value and don't care about dressing up. Hey Dude Wally at $50 is the best deal in casual <a href=\"https:\/\/www.everyday-guide.com\/site\/yrcf\" title=\"Skechers\" class=\"pretty-link-keyword\"rel=\"nofollow sponsored \" target=\"_blank\">footwear<\/a> right now. It's comfortable, light, easy to clean, and lasts longer than TOMS. It's the perfect errand-running, lawn-mowing, weekend shoe. Just don't try to dress it up.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Buy TOMS If&#8230;<\/h3>\n\n\n\n<p>Style versatility and social impact matter more to you than raw comfort or value. The Alpargata works in more settings than either competitor. And knowing your purchase supports grassroots organizations is a genuine bonus. But buy them on sale. Full-price TOMS are hard to justify against the competition.<\/p><div id=\"relatedsearches2\" class=\"every-content-5\"><script>console.log(\"RSOC bottom loading..\");<\/script>\r\n<\/div><script type=\"text\/javascript\" charset=\"utf-8\">\r\n    console.log('[DEBUG] Ad script block started');\r\n\r\n    \/\/ Debug function to log important events and states\r\n    function debugLog(type, message, data = null) {\r\n        const timestamp = new Date().toISOString();\r\n        console.log(`[${timestamp}] [${type}]`, message);\r\n        if (data) {\r\n            console.log('Debug data:', data);\r\n        }\r\n    }\r\n\r\n    \/\/ Validate required parameters before initialization\r\n    function validateConfig(config) {\r\n        const required = ['pubId', 'styleId', 'relatedSearchTargeting', 'resultsPageBaseUrl'];\r\n        const missing = required.filter(param => !config[param]);\r\n        \r\n        if (missing.length > 0) {\r\n            throw new Error(`Missing required parameters: ${missing.join(', ')}`);\r\n        }\r\n        \r\n        if (config.relatedSearchTargeting !== 'content' && config.relatedSearchTargeting !== 'query') {\r\n            throw new Error('relatedSearchTargeting must be either \"content\" or \"query\"');\r\n        }\r\n        \r\n        return true;\r\n    }\r\n\r\n    \/\/ Enhanced URL parameter parsing function with title fallback for referrerAdCreative\r\n    function getUrlParameter(name, defaultValue = '') {\r\n        try {\r\n            const urlParams = new URLSearchParams(window.location.search);\r\n            const value = urlParams.get(name);\r\n            \r\n            \/\/ Special handling for referrerAdCreative\r\n            if (name === 'referrerAdCreative' && !value) {\r\n                let siteTitle = document.title || defaultValue;\r\n                \r\n                \/\/ Clean up the site title if needed\r\n                if (siteTitle !== defaultValue) {\r\n                    siteTitle = siteTitle.replace(' \u2013 Everyday Guide \u2013 Your Source of Information for Daily Topics!', '').trim();\r\n                    debugLog('WARNING', 'Using modified page title as fallback for referrerAdCreative', {\r\n                        originalTitle: document.title,\r\n                        cleanedTitle: siteTitle,\r\n                        source: 'document.title'\r\n                    });\r\n                    return siteTitle;\r\n                }\r\n            }\r\n            \r\n            return value ? decodeURIComponent(value) : defaultValue;\r\n        } catch (error) {\r\n            debugLog('ERROR', `Failed to parse URL parameter: ${name}`, error);\r\n            return defaultValue;\r\n        }\r\n    }\r\n\r\n    \/\/ Add tracking domain and CID handling with validation\r\n    function getTrackingParams() {\r\n        const trackingDomain = getUrlParameter('td', '');\r\n        const cid = getUrlParameter('cid', '');\r\n        \r\n        \/\/ Only validate if tracking domain is provided\r\n        if (trackingDomain && !trackingDomain.match(\/^[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$\/)) {\r\n            debugLog('WARNING', 'Invalid tracking domain format', {\r\n                provided: trackingDomain\r\n            });\r\n            return {\r\n                trackingDomain: '',\r\n                cid: cid\r\n            };\r\n        }\r\n        \r\n        return {\r\n            trackingDomain: trackingDomain,\r\n            cid: cid\r\n        };\r\n    }\r\n\r\n    const { trackingDomain, cid } = getTrackingParams();\r\n\r\n    \/\/ Get parameters from URL with defaults\r\n    const urlStyleId = getUrlParameter('styleid', '9024836547');\r\n    const urlTerms = getUrlParameter('terms', '');\r\n    const urlChannel = getUrlParameter('channel', '2273637055'); \/\/ edg 1871989443\r\n    const urlAdTitle = getUrlParameter('adtitle', '');\r\n    const urlCpid = getUrlParameter('cpid', '');\r\n    const urlOid = getUrlParameter('oid', '');\r\n\r\n    \/\/ Set tracking IDs immediately at script start, before any async operations\r\n    \/\/ Only call set_tracking_ids if it exists (tracker.js has initialized)\r\n    try {\r\n        \/\/ Debug tracker state\r\n        const trackerState = window._trackerInternalState || {};\r\n        const hasTrackerFunction = typeof window.set_tracking_ids === 'function';\r\n        const sessionData = sessionStorage.getItem('ctrkr_click_data');\r\n        let parsedSessionData = null;\r\n        try { parsedSessionData = sessionData ? JSON.parse(sessionData) : null; } catch(e) {}\r\n        \r\n        debugLog('TRACKING_DEBUG', 'Tracker state before setting IDs', {\r\n            trackerInitialized: trackerState.ready === true,\r\n            hasSetTrackingFunction: hasTrackerFunction,\r\n            hasSessionStorage: !!sessionStorage,\r\n            hasSessionData: !!sessionData,\r\n            clickId: parsedSessionData?.clickId,\r\n            existingParams: parsedSessionData?.adParams\r\n        });\r\n        \r\n        if (hasTrackerFunction) {\r\n            window.set_tracking_ids({\r\n                ad_client_id: \"partner-pub-9681717277196944\", \/\/ Your AdSense publisher ID\r\n                style_id: urlStyleId,\r\n                channel_id: urlChannel\r\n            });\r\n            \r\n            \/\/ Check if the params were actually set\r\n            setTimeout(() => {\r\n                try {\r\n                    const afterSessionData = sessionStorage.getItem('ctrkr_click_data');\r\n                    let afterParsedData = null;\r\n                    try { afterParsedData = afterSessionData ? JSON.parse(afterSessionData) : null; } catch(e) {}\r\n                    \r\n                    debugLog('TRACKING_DEBUG', 'Tracker state after setting IDs', {\r\n                        hasSessionData: !!afterSessionData,\r\n                        clickId: afterParsedData?.clickId,\r\n                        updatedParams: afterParsedData?.adParams\r\n                    });\r\n                } catch (e) {\r\n                    debugLog('TRACKING_DEBUG', 'Error checking session after update', e);\r\n                }\r\n            }, 50);\r\n            \r\n            debugLog('TRACKING', 'Successfully called set_tracking_ids');\r\n        } else {\r\n            debugLog('TRACKING', 'Tracker set_tracking_ids function not available');\r\n        }\r\n    } catch (e) {\r\n        debugLog('TRACKING_ERROR', 'Error in tracking setup', e);\r\n    }\r\n\r\n    \/\/ Define base URL constant\r\n    const BASE_RESULTS_URL = \"https:\/\/www.everyday-guide.com\/site\/search-results\/\";\r\n\r\n    \/\/ Page level configuration for related searches\r\n    var pageOptions = {\r\n        \/\/ Required Parameters\r\n        \"pubId\": \"partner-pub-9681717277196944\",    \/\/ Your AdSense publisher ID\r\n        \"styleId\": urlStyleId,                       \/\/ From URL or default\r\n        \"relatedSearchTargeting\": \"content\",         \/\/ Must use 'content' for content pages\r\n        \"resultsPageBaseUrl\": BASE_RESULTS_URL,      \/\/ Placeholder, will be finalized later\r\n        \"resultsPageQueryParam\": \"q\",\r\n        \/\/\"ivt\": false,\r\n        \/\/ Safety and Filtering\r\n        \"adsafe\": \"low\",\r\n        \/\/\"adtest\": \"off\",\r\n        \"terms\": \"\",\r\n        \"referrerAdCreative\": \"\",\r\n\r\n        \/\/ Tracking and Analytics\r\n        \"channel\": urlChannel,                       \/\/ From URL or default\r\n        \r\n        \/\/ Additional Settings\r\n        'ignoredPageParams': Array.from(new URLSearchParams(location.search).keys()).join(', '),\r\n\r\n        \/\/ Callback function for ad loading\r\n        \"adLoadedCallback\": function(containerName, adsLoaded, isExperimentVariant, callbackOptions) {\r\n            try {\r\n                \/\/ Find the container element\r\n                const container = document.getElementById(containerName);\r\n                if (!container) {\r\n                    debugLog('ERROR', `Container not found: ${containerName}`);\r\n                    return;\r\n                }\r\n\r\n                \/\/ Find the overlay within this container\r\n                const overlay = container.querySelector('.skeleton-overlay');\r\n\r\n                \/\/ Fade out and remove the overlay\r\n                if (overlay && overlay.classList.contains('skeleton-visible')) {\r\n                    overlay.classList.remove('skeleton-visible'); \/\/ Start fade out\r\n                    debugLog('SKELETON', `Fading out overlay in ${containerName}`);\r\n\r\n                    \/\/ Remove from DOM after transition\r\n                    setTimeout(() => {\r\n                        if (overlay) { \/\/ Check if it still exists\r\n                             overlay.remove();\r\n                             debugLog('SKELETON', `Removed overlay from DOM in ${containerName}`);\r\n                        }\r\n                    }, 300); \/\/ Match CSS transition duration\r\n                }\r\n\r\n                if (adsLoaded && callbackOptions && callbackOptions.termPositions) {\r\n                    const terms = Object.keys(callbackOptions.termPositions);\r\n                    console.log('Related Search Terms Shown:', terms);\r\n                    console.log('Term Positions:', callbackOptions.termPositions);\r\n                }\r\n                \r\n                debugLog('CALLBACK', `Container: ${containerName}`, {\r\n                    adsLoaded,\r\n                    isExperimentVariant,\r\n                    callbackOptions\r\n                });\r\n\r\n                if (adsLoaded) {\r\n                    debugLog('SUCCESS', 'Related searches loaded successfully');\r\n                    \/\/ Remove legacy tracking call\r\n                    \/\/ window.trackEvent('adview');\r\n                    \/\/ Debug tracking state before sending event\r\n                    try {\r\n                        const eventSessionData = sessionStorage.getItem('ctrkr_click_data');\r\n                        let eventParsedData = null;\r\n                        try { eventParsedData = eventSessionData ? JSON.parse(eventSessionData) : null; } catch(e) {}\r\n                        \r\n                        debugLog('TRACKING_EVENT', 'State before ad_view event', {\r\n                            hasSessionData: !!eventSessionData,\r\n                            clickId: eventParsedData?.clickId,\r\n                            params: eventParsedData?.adParams\r\n                        });\r\n                    } catch (e) {\r\n                        debugLog('TRACKING_ERROR', 'Error checking session before event', e);\r\n                    }\r\n                    \r\n                    \/\/ Send tracking event using new API with parameters as fallback\r\n                    window.track_event('ad_view', {});\r\n                    \/\/ Track Facebook Pixel ViewContent event\r\n                    fbq('track', 'ViewContent');\r\n                    \r\n                    \/\/ Log terms and their positions if available\r\n                    if (callbackOptions && callbackOptions.termPositions) {\r\n                        console.log('Related Search Terms:', Object.keys(callbackOptions.termPositions));\r\n                        console.log('Term Positions:', callbackOptions.termPositions);\r\n                    }\r\n                    \r\n                    \/\/ Log container dimensions for debugging layout issues\r\n                    const rect = container.getBoundingClientRect();\r\n                    debugLog('LAYOUT', 'Container dimensions', {\r\n                        width: rect.width,\r\n                        height: rect.height,\r\n                        visible: rect.height > 0\r\n                    });\r\n                } else {\r\n                    debugLog('WARNING', 'No related searches available');\r\n                    container.style.display = 'none';\r\n                    \/\/ Remove legacy tracking call\r\n                    \/\/ window.trackEvent('noresult');\r\n                    \/\/ Debug tracking state before sending event\r\n                    try {\r\n                        const eventSessionData = sessionStorage.getItem('ctrkr_click_data');\r\n                        let eventParsedData = null;\r\n                        try { eventParsedData = eventSessionData ? JSON.parse(eventSessionData) : null; } catch(e) {}\r\n                        \r\n                        debugLog('TRACKING_EVENT', 'State before no_result event', {\r\n                            hasSessionData: !!eventSessionData,\r\n                            clickId: eventParsedData?.clickId,\r\n                            params: eventParsedData?.adParams\r\n                        });\r\n                    } catch (e) {\r\n                        debugLog('TRACKING_ERROR', 'Error checking session before event', e);\r\n                    }\r\n                    \r\n                    \/\/ Send tracking event using new API with parameters as fallback\r\n                    window.track_event('rsoc_not_monetized', {});\r\n                    \r\n                    \/\/ Log possible reasons for no results\r\n                    debugLog('DEBUG', 'Checking possible issues', {\r\n                        url: window.location.href,\r\n                        containerExists: !!container,\r\n                        containerVisible: container.offsetParent !== null,\r\n                        pageContent: document.body.textContent.length\r\n                    });\r\n                }\r\n            } catch (error) {\r\n                debugLog('ERROR', 'Error in callback', {\r\n                    message: error.message,\r\n                    stack: error.stack\r\n                });\r\n            }\r\n        }\r\n    };\r\n\r\n    \/\/ Configuration for the related searches containers\r\n    const rsblock1 = {\r\n        \/\/ Required Parameters\r\n        \"container\": \"relatedsearches1\",\r\n        \"width\": 700,\r\n        \r\n        \/\/ Optional Parameters\r\n        \"relatedSearches\": 6,\r\n        \r\n        \/\/ Reference to the callback in pageOptions\r\n        \"adLoadedCallback\": pageOptions.adLoadedCallback\r\n    };\r\n\r\n    const rsblock2 = {\r\n        \/\/ Required Parameters\r\n        \"container\": \"relatedsearches2\",\r\n        \"width\": 700,\r\n        \r\n        \/\/ Optional Parameters\r\n        \"relatedSearches\": 6,\r\n        \r\n        \/\/ Reference to the callback in pageOptions\r\n        \"adLoadedCallback\": pageOptions.adLoadedCallback\r\n    };\r\n\r\n    \/\/ --- Ad Initialization Logic ---\r\n\r\n    let adsInitialized = false;\r\n    const AD_INIT_TIMEOUT = 2500; \/\/ Timeout in milliseconds (e.g., 2.5 seconds)\r\n    let initTimeoutId = null;\r\n\r\n    \/\/ Function to inject skeleton overlay SYNCHRONOUSLY\r\n    function injectSkeletonOverlay(containerId) {\r\n        const container = document.getElementById(containerId);\r\n        if (container) {\r\n            if (!container.querySelector('.skeleton-overlay')) {\r\n                const overlay = document.createElement('div');\r\n                overlay.className = 'skeleton-overlay skeleton-visible';\r\n                container.appendChild(overlay);\r\n                debugLog('SKELETON', `Injected overlay into ${containerId}`);\r\n            } else {\r\n                debugLog('SKELETON', `Overlay already exists in ${containerId}`);\r\n            }\r\n        } else {\r\n            debugLog('WARNING', `Container ${containerId} not found for overlay injection.`);\r\n        }\r\n    }\r\n\r\n    \/\/ Function to hide skeletons if initialization fails\r\n    function hideSkeletonsOnError() {\r\n        ['relatedsearches1', 'relatedsearches2'].forEach(containerId => {\r\n            const container = document.getElementById(containerId);\r\n            const overlay = container?.querySelector('.skeleton-overlay.skeleton-visible');\r\n            if (overlay) {\r\n                overlay.classList.remove('skeleton-visible');\r\n                \/\/ Optionally remove after fade, but maybe just hide on error\r\n                debugLog('SKELETON', `Hiding overlay in ${containerId} due to init error.`);\r\n            }\r\n            \/\/ Also hide the main container if ads fail to load\r\n            if(container) container.style.display = 'none';\r\n        });\r\n    }\r\n\r\n    \/\/ Main function to initialize Google CSA ads\r\n    function initializeGoogleAds() {\r\n        if (adsInitialized) return; \/\/ Prevent double initialization\r\n        adsInitialized = true;\r\n        clearTimeout(initTimeoutId); \/\/ Clear the timeout if event fired\r\n        debugLog('ADS_INIT', 'Proceeding with _googCsa initialization.');\r\n\r\n        injectSkeletonOverlay('relatedsearches1');\r\n        injectSkeletonOverlay('relatedsearches2');\r\n\r\n        \/\/ Re-evaluate tracking params based on the final state from event-tracker.js\r\n        const trackerState = window._trackerInternalState || {};\r\n        const finalCid = trackerState.clickId || getUrlParameter('cid', ''); \/\/ Use state's CID or fallback to original URL param\r\n        \/\/ Note: Tracking domain (td) is primarily used by event-tracker, but include if needed for URL construction\r\n        const finalTd = (trackerState.trackingMethod === 'redirect' ? trackerState.domain : null) || getUrlParameter('td', ''); \/\/ Get TD if redirect, else fallback\r\n        \r\n        \/\/ Tracking IDs already set at the beginning of script\r\n\r\n        \/\/ Re-construct the results URL using the potentially updated CID\/TD\r\n        pageOptions.resultsPageBaseUrl = BASE_RESULTS_URL;\r\n        debugLog('ADS_INIT', 'Final resultsPageBaseUrl:', { url: pageOptions.resultsPageBaseUrl });\r\n\r\n        \/\/ Add referrerAdCreative only if urlAdTitle has a value (moved here to be part of final options)\r\n        if (urlAdTitle) {\r\n            pageOptions.referrerAdCreative = urlAdTitle;\r\n            debugLog('INFO', 'referrerAdCreative parameter included in configuration', { referrerAdCreative: urlAdTitle });\r\n        } else {\r\n            delete pageOptions.referrerAdCreative;\r\n            debugLog('INFO', 'No referrerAdCreative parameter provided, removed from configuration');\r\n        }\r\n\r\n        \/\/ Add terms if provided (moved here)\r\n        if (urlTerms) {\r\n            pageOptions.terms = urlTerms;\r\n        }\r\n\r\n        \/\/ Update ignoredPageParams (moved here)\r\n        pageOptions.ignoredPageParams = Array.from(new URLSearchParams(location.search).keys()).join(', ');\r\n\r\n        \/\/ Debug log all parameters before initialization\r\n        debugLog('PARAMS', 'Page Options Configuration:', {\r\n            \/\/ Required Parameters\r\n            pubId: pageOptions.pubId,\r\n            styleId: pageOptions.styleId,\r\n            relatedSearchTargeting: pageOptions.relatedSearchTargeting,\r\n            resultsPageBaseUrl: pageOptions.resultsPageBaseUrl,\r\n            resultsPageQueryParam: pageOptions.resultsPageQueryParam,\r\n            referrerAdCreative: pageOptions.referrerAdCreative,\r\n            \r\n            \/\/ Optional Parameters\r\n            terms: pageOptions.terms || '(not set)',\r\n            maxTermLength: pageOptions.maxTermLength,\r\n            linkTarget: pageOptions.linkTarget,\r\n            \r\n            \/\/ Safety and Filtering\r\n            adsafe: pageOptions.adsafe,\r\n            adtest: pageOptions.adtest,\r\n            ivt: pageOptions.ivt,\r\n            \r\n            \/\/ Language and Encoding\r\n            hl: pageOptions.hl,\r\n            \r\n            \/\/ Tracking and Analytics\r\n            channel: pageOptions.channel,\r\n            \r\n            \/\/ Container Configurations\r\n            containerSettings: {\r\n                block1: {\r\n                    container: rsblock1.container,\r\n                    width: rsblock1.width,\r\n                    relatedSearches: rsblock1.relatedSearches\r\n                },\r\n                block2: {\r\n                    container: rsblock2.container,\r\n                    width: rsblock2.width,\r\n                    relatedSearches: rsblock2.relatedSearches\r\n                }\r\n            }\r\n        });\r\n\r\n        \/\/ --- Call Google CSA ---\r\n        try {\r\n            verifyScriptLoading(); \/\/ Verify dependent scripts\r\n            validateConfig(pageOptions); \/\/ Validate final config\r\n\r\n            \/\/ Log the final pageOptions before initialization\r\n            console.log('[DEBUG] Final pageOptions just before _googCsa:', JSON.stringify(pageOptions, null, 2));\r\n\r\n            _googCsa('relatedsearch', pageOptions, rsblock1, rsblock2);\r\n            debugLog('ADS_INIT', '_googCsa called successfully.');\r\n\r\n        } catch (error) {\r\n            console.error('[ERROR] Google CSA Initialization Failed!', error);\r\n            debugLog('ERROR', 'Google CSA Initialization failed', {\r\n                message: error.message,\r\n                stack: error.stack\r\n            });\r\n            \/\/ Hide skeletons and containers on error\r\n            hideSkeletonsOnError();\r\n        }\r\n    }\r\n\r\n    \/\/ --- Event Listener and Timeout --- \r\n\r\n    \/\/ Check if tracker is already ready *before* setting up listener\/timeout\r\n    if (window._trackerInternalState?.ready) {\r\n        debugLog('ADS_INIT', 'Tracker was already ready. Initializing ads immediately.');\r\n        initializeGoogleAds();\r\n    } else {\r\n        debugLog('ADS_INIT', 'Tracker not ready yet. Setting up listener and timeout.');\r\n\r\n        \/\/ Listener for the tracker signal\r\n        const trackerListener = (event) => {\r\n            debugLog('ADS_INIT', 'Received trackerInitialized event', event.detail);\r\n            window.removeEventListener('trackerInitialized', trackerListener); \/\/ Clean up listener\r\n            initializeGoogleAds();\r\n        };\r\n        window.addEventListener('trackerInitialized', trackerListener);\r\n\r\n        \/\/ Timeout fallback: Initialize ads if the tracker event doesn't arrive promptly\r\n        initTimeoutId = setTimeout(() => {\r\n            debugLog('ADS_INIT', `Timeout waiting for trackerInitialized event after ${AD_INIT_TIMEOUT}ms. Proceeding.`);\r\n            window.removeEventListener('trackerInitialized', trackerListener); \/\/ Clean up listener if timeout fires first\r\n            initializeGoogleAds();\r\n        }, AD_INIT_TIMEOUT);\r\n    }\r\n\r\n    \/\/ Add script loading verification\r\n    function verifyScriptLoading() {\r\n        debugLog('SCRIPT', 'Entering verifyScriptLoading');\r\n        debugLog('SCRIPT', 'Checking script loading status', {\r\n            adsScriptLoaded: !!document.querySelector('script[src*=\"ads.js\"]'),\r\n            googCsaAvailable: typeof _googCsa === 'function'\r\n        });\r\n        debugLog('SCRIPT', 'Exiting verifyScriptLoading');\r\n    }\r\n\r\n    \/\/ --- Modify constructUrlWithTracking to accept parameters --- \r\n    \/\/ (Keep the original getTrackingParams for initial values if needed elsewhere, or remove if redundant)\r\n    function constructUrlWithTracking(baseUrl, cid, td, styleid, channel) {\r\n        try {\r\n            const url = new URL(baseUrl);\r\n            \/\/ Add parameters if they exist\r\n            if (td) url.searchParams.set('td', td);\r\n            if (cid) url.searchParams.set('cid', cid);\r\n            if (styleid) url.searchParams.set('styleid', styleid);\r\n            if (channel) url.searchParams.set('channel', channel);\r\n            return url.toString();\r\n        } catch (error) {\r\n            debugLog('ERROR', 'Failed to construct results page URL with tracking parameters', {\r\n                baseUrl,\r\n                error: error.message\r\n            });\r\n            return baseUrl;\r\n        }\r\n    }\r\n\r\n<\/script>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">The Bottom Line<\/h2>\n\n\n\n<p>If I had to buy one pair of casual shoes right now, I'd buy Allbirds Wool Runners. The comfort is unmatched, the durability is strong, and the sustainability story holds up under scrutiny. They cost more upfront but save you money over time.<\/p>\n\n\n\n<p>Hey Dude is the best budget pick by a wide margin. It gives you 80% of Allbirds' comfort at half the price. And TOMS, despite being the most iconic brand in this comparison, finishes third in almost every measurable category except style.<\/p>\n\n\n\n<p><strong>TOMS makes shoes you feel good about buying. Allbirds makes shoes that feel good to wear. And Hey Dude makes shoes that feel good on your wallet. Pick the priority that matters most to you, and the choice makes itself.<\/strong><\/p>\n      <div class=\"prli-link-to-disclosures\">\n        <a href=\"https:\/\/www.everyday-guide.com\/site\/disclaimer\/\">(*)This post contains affiliate links. If you use these links to buy something we may earn a commission. Thanks.<\/a>\n      <\/div>\n      ","protected":false},"excerpt":{"rendered":"<p>Allbirds wins on comfort and sustainability. Hey Dude wins on price. TOMS wins on style versatility. There&#8217;s no single best shoe here, but there [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":39986,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[105,28],"tags":[],"class_list":["post-39759","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-buying-guide","category-fashion"],"_links":{"self":[{"href":"https:\/\/www.everyday-guide.com\/site\/wp-json\/wp\/v2\/posts\/39759","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.everyday-guide.com\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.everyday-guide.com\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.everyday-guide.com\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.everyday-guide.com\/site\/wp-json\/wp\/v2\/comments?post=39759"}],"version-history":[{"count":0,"href":"https:\/\/www.everyday-guide.com\/site\/wp-json\/wp\/v2\/posts\/39759\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.everyday-guide.com\/site\/wp-json\/wp\/v2\/media\/39986"}],"wp:attachment":[{"href":"https:\/\/www.everyday-guide.com\/site\/wp-json\/wp\/v2\/media?parent=39759"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.everyday-guide.com\/site\/wp-json\/wp\/v2\/categories?post=39759"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.everyday-guide.com\/site\/wp-json\/wp\/v2\/tags?post=39759"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}