{"id":15279749,"date":"2026-03-13T13:51:41","date_gmt":"2026-03-13T17:51:41","guid":{"rendered":"https:\/\/anniebergeron.com\/?p=15279749"},"modified":"2026-03-13T14:06:25","modified_gmt":"2026-03-13T18:06:25","slug":"jetmenu-wpml-mega-menu-language-fix","status":"publish","type":"post","link":"https:\/\/anniebergeron.com\/en\/jetmenu-wpml-mega-menu-language-fix\/","title":{"rendered":"How I Fixed a 4-Year-Old JetMenu + WPML Bug That Breaks Multilingual Mega Menus"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"15279749\" class=\"elementor elementor-15279749\" data-elementor-post-type=\"post\">\n\t\t\t\t<div class=\"elementor-element elementor-element-889832b e-flex e-con-boxed e-con e-parent\" data-id=\"889832b\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;jet_parallax_layout_list&quot;:[]}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c4ac2cb elementor-widget elementor-widget-text-editor\" data-id=\"c4ac2cb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>If you&#8217;re using JetMenu (Crocoblock) with WPML on a multilingual WordPress site, you may have encountered this maddening problem: non-logged-in visitors see menu content in the wrong language. Not consistently \u2014 just often enough that clients send you worried screenshots.<\/p><p>This bug has been reported since 2020. Crocoblock knows about it (<a href=\"https:\/\/github.com\/Crocoblock\/suggestions\/issues\/1842\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">GitHub issue #1842<\/a>, <a href=\"https:\/\/github.com\/Crocoblock\/suggestions\/issues\/1357\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">#1357<\/a>). WPML knows about it (<a href=\"https:\/\/wpml.org\/forums\/topic\/i-have-a-problem-with-megamenu-from-croco\/\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">their forums<\/a>). Yet four years later, there&#8217;s still no official fix.<\/p><p>Here&#8217;s what I found after hours of debugging, and the production-ready mu-plugin that solves it.<\/p><h2 id=\"the-symptom\">The Symptom<\/h2><p>On a bilingual WordPress site (French as default language, English at <code>\/en\/<\/code>) using WPML in directory mode, the JetMenu mega menus were showing <strong>French content on English pages<\/strong> for anonymous visitors. The top-level navigation items (&#8220;IT Services&#8221;, &#8220;IT Solutions&#8221;) were correctly translated \u2014 but the mega menu dropdown panels, built with Elementor templates, always displayed French text like &#8220;Services g\u00e9r\u00e9s TI&#8221; instead of &#8220;Managed IT services&#8221;.<\/p><p>The tricky part: everything worked perfectly when logged into WordPress. The bug only affected non-logged-in visitors, making it hard to reproduce during development.<\/p><h2 id=\"why-standard-approaches-don-t-work\">Why Standard Approaches Don&#8217;t Work<\/h2><p>Before finding the real fix, I went through every approach I could think of:<\/p><p><strong>Clearing Elementor cache<\/strong> \u2014 no effect, because JetMenu doesn&#8217;t use Elementor&#8217;s standard rendering pipeline for mega menus.<\/p><p><strong>Using Elementor hooks<\/strong> like <code>elementor\/frontend\/builder_content_data<\/code> \u2014 these fire for headers, footers, and page content, but <strong>never for mega menu templates<\/strong>. I confirmed this with diagnostic logging. JetMenu has its own rendering system.<\/p><p><strong>WPML cookie-based detection<\/strong> \u2014 unreliable because CDN warmup bots (NitroPack, WP Rocket, etc.) carry cookies between requests and contaminate language detection.<\/p><h2 id=\"the-root-cause-three-layers-of-cache-gone-wrong\">The Root Cause: Three Layers of Cache Gone Wrong<\/h2><p>This isn&#8217;t a single bug. It&#8217;s three caching systems interacting badly.<\/p><h3 id=\"layer-1-jetmenu-s-transient-cache\">Layer 1: JetMenu&#8217;s Transient Cache<\/h3><p>After digging into JetMenu&#8217;s source code (<code>jet-menu\/includes\/render\/walkers\/mega-menu-walker.php<\/code>), I found the culprit. JetMenu caches the fully rendered HTML of each mega menu template in WordPress transients. The cache key is:<\/p>\n<pre><code><span class=\"hljs-function\"><span class=\"hljs-title\">md5<\/span><span class=\"hljs-params\">(<span class=\"hljs-string\">'jet_menu_elementor_template_data_'<\/span> + template_id)<\/span><\/span>\n<\/code><\/pre>\n<p>The critical flaw: <strong>this cache key doesn&#8217;t include the current language.<\/strong> Whichever language renders the mega menu first gets cached and served to all subsequent visitors, regardless of their language. If a French-speaking visitor (or a warmup bot) hits the page first, everyone gets French.<\/p><h3 id=\"layer-2-jetmenu-s-proprietary-rendering-pipeline\">Layer 2: JetMenu&#8217;s Proprietary Rendering Pipeline<\/h3><p>JetMenu does NOT use Elementor&#8217;s standard <code>get_builder_content()<\/code> method. It has its own walker that:<\/p><ol><li>Checks its transient cache for the template<\/li><li>If cached, serves the HTML directly \u2014 <strong>Elementor is never called<\/strong><\/li><li>If not cached, calls Elementor&#8217;s rendering which reads <code>_elementor_data<\/code> from <code>wp_postmeta<\/code><\/li><li>Stores the rendered HTML in the transient for next time<\/li><\/ol><p>Since step 2 skips Elementor entirely, hooks on Elementor&#8217;s rendering pipeline never fire for cached menus. This is why the standard approach of filtering Elementor&#8217;s output doesn&#8217;t work.<\/p><h3 id=\"layer-3-cdn-page-caching\">Layer 3: CDN Page Caching<\/h3><p>If you use NitroPack, WP Rocket, or any CDN with full-page caching, there&#8217;s an additional layer. The CDN caches the complete HTML response \u2014 including the wrong-language mega menu \u2014 and serves it to all visitors before PHP even executes. The warmup bot can also propagate incorrect language cookies between requests, further contaminating the cache.<\/p><h2 id=\"the-solution-a-wordpress-mu-plugin\">The Solution: A WordPress MU-Plugin<\/h2><p>After several iterations (v1 through v5), I built a mu-plugin that attacks the problem at three levels. Place this file at <code>\/wp-content\/mu-plugins\/jetmenu-wpml-language-fix.php<\/code>.<\/p><h3 id=\"step-1-clear-jetmenu-s-transient-cache\">Step 1 \u2014 Clear JetMenu&#8217;s Transient Cache<\/h3><p>On first run after deployment, the plugin deletes all JetMenu-related transients:<\/p>\n<pre><code class=\"lang-php\"><span class=\"hljs-comment\">\/\/ One-time cleanup after deployment<\/span>\n$cleared = get_option( <span class=\"hljs-string\">'_jmfix_cache_cleared_v5'<\/span>, <span class=\"hljs-keyword\">false<\/span> );\n<span class=\"hljs-keyword\">if<\/span> ( ! $cleared ) {\n    $template_ids = <span class=\"hljs-keyword\">array<\/span>( <span class=\"hljs-number\">295<\/span>, <span class=\"hljs-number\">542<\/span>, <span class=\"hljs-number\">546<\/span>, <span class=\"hljs-number\">3661<\/span>, <span class=\"hljs-number\">5201<\/span>, <span class=\"hljs-number\">5208<\/span>, <span class=\"hljs-number\">5215<\/span>, <span class=\"hljs-number\">5219<\/span> );\n    <span class=\"hljs-keyword\">foreach<\/span> ( $template_ids <span class=\"hljs-keyword\">as<\/span> $tid ) {\n        $key = md5( sprintf( <span class=\"hljs-string\">'jet_menu_elementor_template_data_%s'<\/span>, $tid ) );\n        delete_transient( $key );\n    }\n    <span class=\"hljs-comment\">\/\/ Also clean up any remaining jet-menu transients via SQL<\/span>\n    <span class=\"hljs-keyword\">global<\/span> $wpdb;\n    $wpdb-&gt;query(\n        <span class=\"hljs-string\">\"DELETE FROM {$wpdb-&gt;options} WHERE option_name LIKE '_transient%jet_menu%'\"<\/span>\n    );\n    update_option( <span class=\"hljs-string\">'_jmfix_cache_cleared_v5'<\/span>, time() );\n}\n<\/code><\/pre>\n<p>Replace the template IDs with your own. You can find them in <strong>Elementor \u2192 My Templates<\/strong> \u2014 the post ID is in the URL when editing a template (<code>post=295<\/code> means ID 295). Include both the original language and WPML translation IDs.<\/p><h3 id=\"step-2-disable-jetmenu-s-template-cache\">Step 2 \u2014 Disable JetMenu&#8217;s Template Cache<\/h3><p>Since the cache doesn&#8217;t vary by language, it needs to stay off:<\/p>\n<pre><code class=\"lang-php\">add_filter( <span class=\"hljs-string\">'option_jet_menu_options'<\/span>, function( <span class=\"hljs-symbol\">$<\/span><span class=\"hljs-keyword\">options<\/span> ) {\n    <span class=\"hljs-keyword\">if<\/span> ( is_array( <span class=\"hljs-symbol\">$<\/span><span class=\"hljs-keyword\">options<\/span> ) ) {\n        <span class=\"hljs-symbol\">$<\/span><span class=\"hljs-keyword\">options<\/span>[<span class=\"hljs-string\">'use-template-cache'<\/span>] = <span class=\"hljs-string\">'false'<\/span>;\n    }\n    return <span class=\"hljs-symbol\">$<\/span><span class=\"hljs-keyword\">options<\/span>;\n} );\n<\/code><\/pre>\n<p><strong>Performance note:<\/strong> This sounds risky, but the impact is negligible if you use a page-level caching plugin. NitroPack\/WP Rocket still caches the complete page at the CDN level. The PHP rendering only happens when the CDN cache is being built \u2014 not on every visitor request.<\/p><h3 id=\"step-3-redirect-elementor-meta-reads-the-core-fix-\">Step 3 \u2014 Redirect Elementor Meta Reads (The Core Fix)<\/h3><p>This is the heart of the solution. When JetMenu renders a French template on an English page, we intercept the <code>get_post_metadata<\/code> calls and redirect them to the English template:<\/p>\n<pre><code class=\"lang-php\">add_filter( <span class=\"hljs-string\">'get_post_metadata'<\/span>, <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span><span class=\"hljs-params\">( $value, $object_id, $meta_key, $single )<\/span> <\/span>{\n    <span class=\"hljs-comment\">\/\/ Prevent infinite recursion<\/span>\n    <span class=\"hljs-keyword\">static<\/span> $is_redirecting = <span class=\"hljs-keyword\">false<\/span>;\n    <span class=\"hljs-keyword\">if<\/span> ( $is_redirecting ) <span class=\"hljs-keyword\">return<\/span> $value;\n\n    <span class=\"hljs-comment\">\/\/ FR template ID =&gt; EN template ID<\/span>\n    <span class=\"hljs-keyword\">static<\/span> $map = <span class=\"hljs-keyword\">array<\/span>( <span class=\"hljs-number\">295<\/span> =&gt; <span class=\"hljs-number\">5201<\/span>, <span class=\"hljs-number\">542<\/span> =&gt; <span class=\"hljs-number\">5208<\/span>, <span class=\"hljs-number\">546<\/span> =&gt; <span class=\"hljs-number\">5215<\/span>, <span class=\"hljs-number\">3661<\/span> =&gt; <span class=\"hljs-number\">5219<\/span> );\n    <span class=\"hljs-keyword\">if<\/span> ( ! <span class=\"hljs-keyword\">isset<\/span>( $map[ $object_id ] ) ) <span class=\"hljs-keyword\">return<\/span> $value;\n\n    <span class=\"hljs-comment\">\/\/ Only on English pages \u2014 detect by URI, NOT cookies<\/span>\n    $uri = $_SERVER[<span class=\"hljs-string\">'REQUEST_URI'<\/span>] ?? <span class=\"hljs-string\">''<\/span>;\n    $is_en = ( strpos( $uri, <span class=\"hljs-string\">'\/en\/'<\/span> ) === <span class=\"hljs-number\">0<\/span>\n            || strpos( $uri, <span class=\"hljs-string\">'\/en?'<\/span> ) === <span class=\"hljs-number\">0<\/span>\n            || $uri === <span class=\"hljs-string\">'\/en'<\/span> );\n    <span class=\"hljs-keyword\">if<\/span> ( ! $is_en ) <span class=\"hljs-keyword\">return<\/span> $value;\n\n    <span class=\"hljs-comment\">\/\/ Only intercept Elementor meta keys<\/span>\n    <span class=\"hljs-keyword\">static<\/span> $el_keys = <span class=\"hljs-keyword\">array<\/span>(\n        <span class=\"hljs-string\">'_elementor_data'<\/span> =&gt; <span class=\"hljs-number\">1<\/span>,\n        <span class=\"hljs-string\">'_elementor_page_settings'<\/span> =&gt; <span class=\"hljs-number\">1<\/span>,\n        <span class=\"hljs-string\">'_elementor_edit_mode'<\/span> =&gt; <span class=\"hljs-number\">1<\/span>,\n        <span class=\"hljs-string\">'_elementor_css'<\/span> =&gt; <span class=\"hljs-number\">1<\/span>,\n        <span class=\"hljs-string\">'_elementor_page_assets'<\/span> =&gt; <span class=\"hljs-number\">1<\/span>,\n    );\n    <span class=\"hljs-keyword\">if<\/span> ( ! <span class=\"hljs-keyword\">isset<\/span>( $el_keys[ $meta_key ] ) ) <span class=\"hljs-keyword\">return<\/span> $value;\n\n    <span class=\"hljs-comment\">\/\/ Redirect to English template data<\/span>\n    $en_id = $map[ $object_id ];\n    $is_redirecting = <span class=\"hljs-keyword\">true<\/span>;\n    $en_val = get_post_meta( $en_id, $meta_key, $single );\n    $is_redirecting = <span class=\"hljs-keyword\">false<\/span>;\n\n    <span class=\"hljs-keyword\">return<\/span> $single ? <span class=\"hljs-keyword\">array<\/span>( $en_val ) : $en_val;\n}, <span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">4<\/span> );\n<\/code><\/pre>\n<p>A few important details in this code:<\/p><p><strong>URI-based language detection<\/strong> instead of cookies or WPML functions. This is intentional \u2014 CDN warmup bots carry stale cookies between requests, which would cause incorrect language detection.<\/p><p><strong>The <code>$is_redirecting<\/code> flag<\/strong> prevents infinite recursion, since <code>get_post_meta()<\/code> triggers the same <code>get_post_metadata<\/code> filter.<\/p><p><strong>The <code>$single<\/code> parameter handling<\/strong> \u2014 when WordPress calls <code>get_post_meta()<\/code> with <code>$single = true<\/code>, the <code>get_post_metadata<\/code> filter must return <code>array( $value )<\/code> (wrapped in an array), not just <code>$value<\/code>. This is a subtle WordPress API requirement that will silently break things if you get it wrong.<\/p><h2 id=\"adapting-this-to-your-site\">Adapting This to Your Site<\/h2><p>To use this fix on your own site, you&#8217;ll need to change three things:<\/p><ol><li><strong>The template ID mapping<\/strong> (<code>$map<\/code>) \u2014 replace with your French \u2192 English mega menu template IDs<\/li><li><strong>The language URI detection<\/strong> \u2014 adjust if your secondary language isn&#8217;t at <code>\/en\/<\/code><\/li><li><strong>The template IDs in Step 1<\/strong> \u2014 include all your mega menu templates (both languages)<\/li><\/ol><h2 id=\"why-a-mu-plugin-\">Why a MU-Plugin?<\/h2><p>The fix lives in <code>\/wp-content\/mu-plugins\/<\/code>, which is completely independent from the plugins directory. When you update JetMenu, Elementor, or WPML, WordPress only replaces files in <code>\/wp-content\/plugins\/<\/code> \u2014 it never touches <code>mu-plugins<\/code>. Your fix survives every update.<\/p><p>The only thing to watch for: if a future JetMenu update changes its internal cache key (<code>jet_menu_elementor_template_data_<\/code>) or its rendering pipeline, the fix could become ineffective. I recommend checking the mega menus on your secondary language after each JetMenu update, just to be safe.<\/p><h2 id=\"after-deploying\">After Deploying<\/h2><p>Don&#8217;t forget to <strong>purge your CDN cache<\/strong> (NitroPack, WP Rocket, etc.) after deploying the mu-plugin. Otherwise, visitors will keep getting old cached pages with the wrong-language menus until the cache expires naturally.<\/p><h2 id=\"wrapping-up\">Wrapping Up<\/h2><p>This bug cost me hours of diagnostic work. Four years of user reports on GitHub, scattered forum threads, and no official resolution from Crocoblock. The key insight was understanding that JetMenu&#8217;s template cache, its proprietary rendering pipeline, and CDN page caching were all working against multilingual setups simultaneously.<\/p><p>The fix is running in production without issues. If you&#8217;re dealing with the same problem and need help implementing it, feel free to <a href=\"\/en\/contact\/\">get in touch<\/a>. I&#8217;ve already done the research \u2014 you don&#8217;t have to redo it.<\/p><hr \/><p><em>Annie Bergeron \u2014 <a href=\"https:\/\/anniebergeron.com\/en\/\">WordPress Expert, Quebec<\/a> \u2014 15+ years building, optimizing, and maintaining WordPress sites for businesses across Quebec.<\/em><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>If you&#8217;re using JetMenu (Crocoblock) with WPML on a multilingual WordPress site, you may have encountered this maddening problem: non-logged-in visitors see menu content in the wrong language. Not consistently \u2014 just often enough that clients send you worried screenshots. This bug has been reported since 2020. Crocoblock knows about it (GitHub issue #1842, #1357). [&hellip;]<\/p>","protected":false},"author":1,"featured_media":15279755,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[72],"tags":[],"class_list":["post-15279749","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-troubleshooting"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How I Fixed a 4-Year-Old JetMenu + WPML Bug That Breaks Multilingual Mega Menus - Expert WordPress au Qu\u00e9bec | Annie Bergeron<\/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:\/\/anniebergeron.com\/en\/jetmenu-wpml-mega-menu-language-fix\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How I Fixed a 4-Year-Old JetMenu + WPML Bug That Breaks Multilingual Mega Menus - Expert WordPress au Qu\u00e9bec | Annie Bergeron\" \/>\n<meta property=\"og:description\" content=\"If you&#8217;re using JetMenu (Crocoblock) with WPML on a multilingual WordPress site, you may have encountered this maddening problem: non-logged-in visitors see menu content in the wrong language. Not consistently \u2014 just often enough that clients send you worried screenshots. This bug has been reported since 2020. Crocoblock knows about it (GitHub issue #1842, #1357). [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/anniebergeron.com\/en\/jetmenu-wpml-mega-menu-language-fix\/\" \/>\n<meta property=\"og:site_name\" content=\"Expert WordPress au Qu\u00e9bec | Annie Bergeron\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-13T17:51:41+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-13T18:06:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/anniebergeron.com\/wp-content\/uploads\/2026\/03\/jetmenu-wpml-mega-menu-language-fix-min.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"533\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Annie Bergeron\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Annie Bergeron\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/anniebergeron.com\\\/en\\\/jetmenu-wpml-mega-menu-language-fix\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/anniebergeron.com\\\/en\\\/jetmenu-wpml-mega-menu-language-fix\\\/\"},\"author\":{\"name\":\"Annie Bergeron\",\"@id\":\"https:\\\/\\\/anniebergeron.com\\\/en\\\/#\\\/schema\\\/person\\\/a9fb56e76e49b917b0a8349cdae68fb6\"},\"headline\":\"How I Fixed a 4-Year-Old JetMenu + WPML Bug That Breaks Multilingual Mega Menus\",\"datePublished\":\"2026-03-13T17:51:41+00:00\",\"dateModified\":\"2026-03-13T18:06:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/anniebergeron.com\\\/en\\\/jetmenu-wpml-mega-menu-language-fix\\\/\"},\"wordCount\":1059,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/anniebergeron.com\\\/en\\\/jetmenu-wpml-mega-menu-language-fix\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/anniebergeron.com\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/jetmenu-wpml-mega-menu-language-fix-min.jpg\",\"articleSection\":[\"Troubleshooting\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/anniebergeron.com\\\/en\\\/jetmenu-wpml-mega-menu-language-fix\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/anniebergeron.com\\\/en\\\/jetmenu-wpml-mega-menu-language-fix\\\/\",\"url\":\"https:\\\/\\\/anniebergeron.com\\\/en\\\/jetmenu-wpml-mega-menu-language-fix\\\/\",\"name\":\"How I Fixed a 4-Year-Old JetMenu + WPML Bug That Breaks Multilingual Mega Menus - Expert WordPress au Qu\u00e9bec | Annie Bergeron\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/anniebergeron.com\\\/en\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/anniebergeron.com\\\/en\\\/jetmenu-wpml-mega-menu-language-fix\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/anniebergeron.com\\\/en\\\/jetmenu-wpml-mega-menu-language-fix\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/anniebergeron.com\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/jetmenu-wpml-mega-menu-language-fix-min.jpg\",\"datePublished\":\"2026-03-13T17:51:41+00:00\",\"dateModified\":\"2026-03-13T18:06:25+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/anniebergeron.com\\\/en\\\/#\\\/schema\\\/person\\\/a9fb56e76e49b917b0a8349cdae68fb6\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/anniebergeron.com\\\/en\\\/jetmenu-wpml-mega-menu-language-fix\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/anniebergeron.com\\\/en\\\/jetmenu-wpml-mega-menu-language-fix\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/anniebergeron.com\\\/en\\\/jetmenu-wpml-mega-menu-language-fix\\\/#primaryimage\",\"url\":\"https:\\\/\\\/anniebergeron.com\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/jetmenu-wpml-mega-menu-language-fix-min.jpg\",\"contentUrl\":\"https:\\\/\\\/anniebergeron.com\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/jetmenu-wpml-mega-menu-language-fix-min.jpg\",\"width\":800,\"height\":533,\"caption\":\"How I Fixed a 4-Year-Old JetMenu + WPML Bug That Breaks Multilingual Mega Menus\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/anniebergeron.com\\\/en\\\/jetmenu-wpml-mega-menu-language-fix\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/anniebergeron.com\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How I Fixed a 4-Year-Old JetMenu + WPML Bug That Breaks Multilingual Mega Menus\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/anniebergeron.com\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/anniebergeron.com\\\/en\\\/\",\"name\":\"Expert WordPress au Qu\u00e9bec | Annie Bergeron\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/anniebergeron.com\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/anniebergeron.com\\\/en\\\/#\\\/schema\\\/person\\\/a9fb56e76e49b917b0a8349cdae68fb6\",\"name\":\"Annie Bergeron\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/059f4760b7c15c9d0562d66a68808620cf6b033534f85c6f7b0929a419b12873?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/059f4760b7c15c9d0562d66a68808620cf6b033534f85c6f7b0929a419b12873?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/059f4760b7c15c9d0562d66a68808620cf6b033534f85c6f7b0929a419b12873?s=96&d=mm&r=g\",\"caption\":\"Annie Bergeron\"},\"sameAs\":[\"https:\\\/\\\/anniebergeron.com\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How I Fixed a 4-Year-Old JetMenu + WPML Bug That Breaks Multilingual Mega Menus - Expert WordPress au Qu\u00e9bec | Annie Bergeron","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:\/\/anniebergeron.com\/en\/jetmenu-wpml-mega-menu-language-fix\/","og_locale":"en_US","og_type":"article","og_title":"How I Fixed a 4-Year-Old JetMenu + WPML Bug That Breaks Multilingual Mega Menus - Expert WordPress au Qu\u00e9bec | Annie Bergeron","og_description":"If you&#8217;re using JetMenu (Crocoblock) with WPML on a multilingual WordPress site, you may have encountered this maddening problem: non-logged-in visitors see menu content in the wrong language. Not consistently \u2014 just often enough that clients send you worried screenshots. This bug has been reported since 2020. Crocoblock knows about it (GitHub issue #1842, #1357). [&hellip;]","og_url":"https:\/\/anniebergeron.com\/en\/jetmenu-wpml-mega-menu-language-fix\/","og_site_name":"Expert WordPress au Qu\u00e9bec | Annie Bergeron","article_published_time":"2026-03-13T17:51:41+00:00","article_modified_time":"2026-03-13T18:06:25+00:00","og_image":[{"width":800,"height":533,"url":"https:\/\/anniebergeron.com\/wp-content\/uploads\/2026\/03\/jetmenu-wpml-mega-menu-language-fix-min.jpg","type":"image\/jpeg"}],"author":"Annie Bergeron","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Annie Bergeron","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/anniebergeron.com\/en\/jetmenu-wpml-mega-menu-language-fix\/#article","isPartOf":{"@id":"https:\/\/anniebergeron.com\/en\/jetmenu-wpml-mega-menu-language-fix\/"},"author":{"name":"Annie Bergeron","@id":"https:\/\/anniebergeron.com\/en\/#\/schema\/person\/a9fb56e76e49b917b0a8349cdae68fb6"},"headline":"How I Fixed a 4-Year-Old JetMenu + WPML Bug That Breaks Multilingual Mega Menus","datePublished":"2026-03-13T17:51:41+00:00","dateModified":"2026-03-13T18:06:25+00:00","mainEntityOfPage":{"@id":"https:\/\/anniebergeron.com\/en\/jetmenu-wpml-mega-menu-language-fix\/"},"wordCount":1059,"commentCount":0,"image":{"@id":"https:\/\/anniebergeron.com\/en\/jetmenu-wpml-mega-menu-language-fix\/#primaryimage"},"thumbnailUrl":"https:\/\/anniebergeron.com\/wp-content\/uploads\/2026\/03\/jetmenu-wpml-mega-menu-language-fix-min.jpg","articleSection":["Troubleshooting"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/anniebergeron.com\/en\/jetmenu-wpml-mega-menu-language-fix\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/anniebergeron.com\/en\/jetmenu-wpml-mega-menu-language-fix\/","url":"https:\/\/anniebergeron.com\/en\/jetmenu-wpml-mega-menu-language-fix\/","name":"How I Fixed a 4-Year-Old JetMenu + WPML Bug That Breaks Multilingual Mega Menus - Expert WordPress au Qu\u00e9bec | Annie Bergeron","isPartOf":{"@id":"https:\/\/anniebergeron.com\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/anniebergeron.com\/en\/jetmenu-wpml-mega-menu-language-fix\/#primaryimage"},"image":{"@id":"https:\/\/anniebergeron.com\/en\/jetmenu-wpml-mega-menu-language-fix\/#primaryimage"},"thumbnailUrl":"https:\/\/anniebergeron.com\/wp-content\/uploads\/2026\/03\/jetmenu-wpml-mega-menu-language-fix-min.jpg","datePublished":"2026-03-13T17:51:41+00:00","dateModified":"2026-03-13T18:06:25+00:00","author":{"@id":"https:\/\/anniebergeron.com\/en\/#\/schema\/person\/a9fb56e76e49b917b0a8349cdae68fb6"},"breadcrumb":{"@id":"https:\/\/anniebergeron.com\/en\/jetmenu-wpml-mega-menu-language-fix\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/anniebergeron.com\/en\/jetmenu-wpml-mega-menu-language-fix\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/anniebergeron.com\/en\/jetmenu-wpml-mega-menu-language-fix\/#primaryimage","url":"https:\/\/anniebergeron.com\/wp-content\/uploads\/2026\/03\/jetmenu-wpml-mega-menu-language-fix-min.jpg","contentUrl":"https:\/\/anniebergeron.com\/wp-content\/uploads\/2026\/03\/jetmenu-wpml-mega-menu-language-fix-min.jpg","width":800,"height":533,"caption":"How I Fixed a 4-Year-Old JetMenu + WPML Bug That Breaks Multilingual Mega Menus"},{"@type":"BreadcrumbList","@id":"https:\/\/anniebergeron.com\/en\/jetmenu-wpml-mega-menu-language-fix\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/anniebergeron.com\/en\/"},{"@type":"ListItem","position":2,"name":"How I Fixed a 4-Year-Old JetMenu + WPML Bug That Breaks Multilingual Mega Menus"}]},{"@type":"WebSite","@id":"https:\/\/anniebergeron.com\/en\/#website","url":"https:\/\/anniebergeron.com\/en\/","name":"Expert WordPress au Qu\u00e9bec | Annie Bergeron","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/anniebergeron.com\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/anniebergeron.com\/en\/#\/schema\/person\/a9fb56e76e49b917b0a8349cdae68fb6","name":"Annie Bergeron","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/059f4760b7c15c9d0562d66a68808620cf6b033534f85c6f7b0929a419b12873?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/059f4760b7c15c9d0562d66a68808620cf6b033534f85c6f7b0929a419b12873?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/059f4760b7c15c9d0562d66a68808620cf6b033534f85c6f7b0929a419b12873?s=96&d=mm&r=g","caption":"Annie Bergeron"},"sameAs":["https:\/\/anniebergeron.com"]}]}},"_links":{"self":[{"href":"https:\/\/anniebergeron.com\/en\/wp-json\/wp\/v2\/posts\/15279749","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/anniebergeron.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/anniebergeron.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/anniebergeron.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/anniebergeron.com\/en\/wp-json\/wp\/v2\/comments?post=15279749"}],"version-history":[{"count":8,"href":"https:\/\/anniebergeron.com\/en\/wp-json\/wp\/v2\/posts\/15279749\/revisions"}],"predecessor-version":[{"id":15279760,"href":"https:\/\/anniebergeron.com\/en\/wp-json\/wp\/v2\/posts\/15279749\/revisions\/15279760"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/anniebergeron.com\/en\/wp-json\/wp\/v2\/media\/15279755"}],"wp:attachment":[{"href":"https:\/\/anniebergeron.com\/en\/wp-json\/wp\/v2\/media?parent=15279749"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/anniebergeron.com\/en\/wp-json\/wp\/v2\/categories?post=15279749"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/anniebergeron.com\/en\/wp-json\/wp\/v2\/tags?post=15279749"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}