{"id":1012,"date":"2026-03-19T23:56:52","date_gmt":"2026-03-19T22:56:52","guid":{"rendered":"https:\/\/baddazz.com\/deportes-hibridos\/generador-de-entrenamientos-funcionales\/"},"modified":"2026-03-19T23:56:52","modified_gmt":"2026-03-19T22:56:52","slug":"generador-de-entrenamientos-funcionales","status":"publish","type":"post","link":"https:\/\/baddazz.com\/es\/workouts\/generador-de-entrenamientos-funcionales\/","title":{"rendered":"Generador de entrenamientos funcionales"},"content":{"rendered":"    <div id=\"baddazz-workout-generator\"><\/div>\n\n    <style>\n        .bz-wrap{\n            --bz-navy:#3E5062;\n            --bz-black:#000000;\n            --bz-white:#FFFFFF;\n            --bz-bg:#F7F9FB;\n            --bz-border:rgba(0,0,0,0.14);\n            --bz-text-muted:#5E6770;\n            --bz-inactive:#E6E8EB;\n            --bz-inactive-border:#D1D5DB;\n            max-width: 1080px;\n            margin: 32px auto;\n            padding: 20px;\n            color: var(--bz-black);\n            font-family: inherit;\n        }\n\n        .bz-shell{\n            background: var(--bz-white);\n            border: 1px solid var(--bz-border);\n            border-radius: 24px;\n            overflow: hidden;\n        }\n\n        .bz-head{\n            padding: 28px 22px 18px;\n            background: var(--bz-white);\n            border-bottom: 1px solid rgba(0,0,0,0.08);\n        }\n\n        .bz-head h2{\n            margin: 0 0 8px;\n            color: var(--bz-black);\n            font-size: clamp(28px, 4vw, 42px);\n            line-height: 1.04;\n            letter-spacing: -0.02em;\n            font-weight: 800;\n        }\n\n        .bz-head p{\n            margin: 0;\n            color: var(--bz-black);\n            font-size: 16px;\n            line-height: 1.4;\n        }\n\n        .bz-builder{\n            padding: 20px;\n            background: var(--bz-white);\n            border-bottom: 1px solid rgba(0,0,0,0.08);\n        }\n\n        .bz-option-grid{\n            display: grid;\n            grid-template-columns: repeat(3, minmax(0, 1fr));\n            gap: 16px;\n            margin-bottom: 18px;\n        }\n\n        .bz-section-title{\n            margin: 0 0 10px;\n            font-size: 13px;\n            line-height: 1.2;\n            text-transform: uppercase;\n            letter-spacing: 0.06em;\n            font-weight: 800;\n            color: var(--bz-black);\n        }\n\n        .bz-options{\n            display: grid;\n            grid-template-columns: repeat(2, minmax(0, 1fr));\n            gap: 12px;\n        }\n\n        .bz-card-option{\n            appearance: none;\n            border: 1px solid var(--bz-inactive-border);\n            background: var(--bz-inactive);\n            color: var(--bz-black);\n            border-radius: 16px;\n            padding: 16px;\n            min-height: 72px;\n            text-align: left;\n            vertical-align: top;\n            display: flex;\n            align-items: flex-start;\n            justify-content: flex-start;\n            cursor: pointer;\n            transition: background .16s ease, color .16s ease, border-color .16s ease;\n        }\n\n        .bz-card-option:hover{\n            border-color: rgba(0,0,0,0.28);\n        }\n\n        .bz-card-option.is-selected{\n            background: var(--bz-navy);\n            color: var(--bz-white);\n            border-color: var(--bz-navy);\n        }\n\n        .bz-card-option span{\n            display: block;\n            font-size: 18px;\n            line-height: 1.15;\n            font-weight: 800;\n            margin: 0;\n            padding: 0;\n        }\n\n        .bz-actions{\n            display: flex;\n            flex-wrap: wrap;\n            gap: 12px;\n        }\n\n        .bz-btn{\n            appearance: none;\n            border: 0;\n            border-radius: 999px;\n            padding: 14px 22px;\n            font-size: 15px;\n            font-weight: 800;\n            letter-spacing: 0.01em;\n            cursor: pointer;\n            transition: transform .14s ease, opacity .14s ease;\n        }\n\n        .bz-btn:hover{\n            transform: translateY(-1px);\n        }\n\n        .bz-btn:active{\n            transform: translateY(0);\n        }\n\n        .bz-btn-primary{\n            background: var(--bz-navy);\n            color: var(--bz-white);\n        }\n\n        .bz-btn-secondary{\n            background: var(--bz-black);\n            color: var(--bz-white);\n        }\n\n        .bz-result{\n            background: var(--bz-bg);\n            padding: 20px;\n        }\n\n        .bz-empty{\n            background: var(--bz-white);\n            border: 1px dashed rgba(0,0,0,0.16);\n            border-radius: 18px;\n            padding: 24px;\n            color: var(--bz-text-muted);\n            text-align: center;\n        }\n\n        .bz-top-action,\n        .bz-bottom-action{\n            display: flex;\n            justify-content: flex-start;\n            margin-bottom: 18px;\n        }\n\n        .bz-bottom-action{\n            margin-top: 24px;\n            margin-bottom: 0;\n        }\n\n        .bz-badges{\n            display: flex;\n            flex-wrap: wrap;\n            gap: 10px;\n            margin-bottom: 18px;\n        }\n\n        .bz-badge{\n            display: inline-flex;\n            align-items: center;\n            padding: 8px 12px;\n            border-radius: 999px;\n            font-size: 13px;\n            font-weight: 800;\n            background: var(--bz-white);\n            color: var(--bz-black);\n            border: 1px solid rgba(0,0,0,0.10);\n        }\n\n        .bz-grid{\n            display: grid;\n            grid-template-columns: repeat(2, minmax(0, 1fr));\n            gap: 16px;\n        }\n\n        .bz-card{\n            background: var(--bz-white);\n            border: 1px solid rgba(0,0,0,0.10);\n            border-radius: 18px;\n            padding: 18px;\n        }\n\n        .bz-card--full{\n            grid-column: 1 \/ -1;\n        }\n\n        .bz-card--premium{\n            border-color: rgba(62,80,98,0.35);\n        }\n\n        .bz-card h3{\n            margin: 0 0 10px;\n            font-size: 20px;\n            line-height: 1.12;\n            color: var(--bz-black);\n            font-weight: 800;\n        }\n\n        .bz-meta{\n            margin: 0 0 12px;\n            color: var(--bz-text-muted);\n            font-size: 14px;\n            line-height: 1.45;\n        }\n\n        .bz-meta div + div{\n            margin-top: 2px;\n        }\n\n        .bz-card ul{\n            margin: 0;\n            padding-left: 18px;\n        }\n\n        .bz-card li{\n            margin: 8px 0;\n            line-height: 1.45;\n        }\n\n        .bz-premium-tag{\n            display: inline-block;\n            margin-bottom: 10px;\n            padding: 6px 10px;\n            border-radius: 999px;\n            background: var(--bz-navy);\n            color: var(--bz-white);\n            font-size: 12px;\n            font-weight: 900;\n            text-transform: uppercase;\n            letter-spacing: 0.05em;\n        }\n\n        @media (max-width: 860px){\n            .bz-option-grid,\n            .bz-options,\n            .bz-grid{\n                grid-template-columns: 1fr;\n            }\n\n            .bz-wrap{\n                padding: 12px;\n            }\n\n            .bz-head,\n            .bz-builder,\n            .bz-result{\n                padding: 16px;\n            }\n        }\n    <\/style>\n\n    <script>\n    (function(){\n        const root = document.getElementById('baddazz-workout-generator');\n        if (!root) return;\n\n        root.innerHTML = `\n            <div class=\"bz-wrap\">\n                <div class=\"bz-shell\">\n                    <div class=\"bz-head\" id=\"bz-top-anchor\">\n                        <h2>Build your BADDAZZ workout<\/h2>\n                        <p>Outdoor. Functional. Hybrid. Real variation. No fluff.<\/p>\n                    <\/div>\n\n                    <div class=\"bz-builder\">\n                        <div class=\"bz-option-grid\">\n                            <div>\n                                <div class=\"bz-section-title\">Workout Type<\/div>\n                                <div class=\"bz-options\">\n                                    <button type=\"button\" class=\"bz-card-option\" data-group=\"mode\" data-value=\"solo\"><span>Single Workout<\/span><\/button>\n                                    <button type=\"button\" class=\"bz-card-option\" data-group=\"mode\" data-value=\"group\"><span>Group Workout<\/span><\/button>\n                                <\/div>\n                            <\/div>\n\n                            <div>\n                                <div class=\"bz-section-title\">Duration<\/div>\n                                <div class=\"bz-options\">\n                                    <button type=\"button\" class=\"bz-card-option\" data-group=\"duration\" data-value=\"30\"><span>30 Minutes<\/span><\/button>\n                                    <button type=\"button\" class=\"bz-card-option\" data-group=\"duration\" data-value=\"60\"><span>60 Minutes<\/span><\/button>\n                                <\/div>\n                            <\/div>\n\n                            <div>\n                                <div class=\"bz-section-title\">Weights \/ Bands<\/div>\n                                <div class=\"bz-options\">\n                                    <button type=\"button\" class=\"bz-card-option\" data-group=\"equipment\" data-value=\"no\"><span>No<\/span><\/button>\n                                    <button type=\"button\" class=\"bz-card-option\" data-group=\"equipment\" data-value=\"yes\"><span>Yes<\/span><\/button>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"bz-actions\">\n                            <button id=\"bz-generate\" class=\"bz-btn bz-btn-primary\" type=\"button\">Generate Workout<\/button>\n                        <\/div>\n                    <\/div>\n\n                    <div class=\"bz-result\" id=\"bz-output\">\n                        <div class=\"bz-empty\">Pick your settings and generate your workout.<\/div>\n                    <\/div>\n                <\/div>\n            <\/div>\n        `;\n\n        const output = root.querySelector('#bz-output');\n        const generateBtn = root.querySelector('#bz-generate');\n        const topAnchor = root.querySelector('#bz-top-anchor');\n\n        const STORAGE_KEY_TOTAL = 'baddazz_workout_total_count_v5';\n        const STORAGE_KEY_GROUP = 'baddazz_workout_group_count_v5';\n\n        const state = {\n            mode: 'solo',\n            duration: 60,\n            equipment: false\n        };\n\n        const EXERCISES = {\n            running: [\n                'Running 100 m','Running 200 m','Running 300 m','Running 400 m','Sprint 100 m',\n                'Jumping Jacks','CrissCross','Side Steps','In & Out','Skater Jumps','Bounces','Fast Feet'\n            ],\n            legs: [\n                'Squats','Squat Jumps','Cossack Squats','Alternate Lunges','Reverse Lunges',\n                'Reverse Overhead Lunge','Walking Lunges','Bulgarian Split Squat','Step Up',\n                'Sumo Squat','Static Squat Hold','Static Lunges','Sumo Jumps'\n            ],\n            core: [\n                'Sit-ups','Twist','Russian Twist','Touch The Sky','Ankle Crunches','Knee to Elbow',\n                'Elbow to Knee','Alternate V','Simultan V','Hollow','Superman','Scissors','Getup'\n            ],\n            upper: [\n                'Push-ups','Feet-Elevated Push-up','Hands-Elevated Push-up','Pike Push-up',\n                'Shoulder Taps','Commando','Crawl to Push-up','Dips'\n            ],\n            hinge: [\n                'Thruster','Glute Bridge','Good Mornings','Donkey Kicks'\n            ],\n            explosive: [\n                'Burpees','Burpees\u2019n Knees','Burpee Broad Jump','Frog Jumps','Rotation Kick Through'\n            ],\n            plank: [\n                'Plank','Side Plank','Reverse Plank','Plank to Push-up','Low Plank Side to Side Toe Tips',\n                'Plank Arm Up Leg Up'\n            ],\n            equipment: [\n                'Bench Press','Biceps Curls','Shoulder Press','Overhead Press','Front Raise','Deadlift','High Pull'\n            ]\n        };\n\n        const TABATA_LIBRARY = [\n            'Sit-ups \/ Touch The Sky \/ Ankle Crunches \/ Twist',\n            'Plank \/ Hollow \/ Side Plank \/ Superman',\n            'Push-ups \/ Shoulder Taps \/ Commando \/ Crawl to Push-up',\n            'Squats \/ Alternate Lunges \/ Bounces \/ Side Steps',\n            'Thrusters \/ Squat Jumps \/ Reverse Lunges \/ Jumping Jacks',\n            'Glute Bridge \/ Donkey Kicks left \/ Donkey Kicks right \/ Good Mornings',\n            'Burpees \/ Burpees\u2019n Knees \/ Mountain Climbers \/ Frog Jumps',\n            'Step Up left \/ Step Up right \/ Dips \/ Bulgarian Split Squat left \/ Bulgarian Split Squat right'\n        ];\n\n        const SOLO_CHALLENGES = [\n            'Challenge: 100 Squats',\n            'Challenge: 80 Sit-ups',\n            'Challenge: 50 Push-ups',\n            'Challenge: 40 Burpees',\n            'Challenge: 200 Jumping Jacks',\n            'Challenge: 3 min Plank',\n            'Challenge: 5 x Running 100 m'\n        ];\n\n        const GROUP_CHALLENGES = SOLO_CHALLENGES.concat([\n            'Challenge: Squat Challenge',\n            'Challenge: Team hold \u2013 3 min plank relay'\n        ]);\n\n        const PREMIUM_GROUP_TEMPLATES = [\n            {\n                title: 'Premium Group Workout: Pyramid Run Burner',\n                subtitle: 'Real group session from the premium template pool.',\n                warmup: {\n                    intro: ['3 rounds'],\n                    lines: [\n                        '20 Alternate Lunges',\n                        '10 Squats',\n                        '5 Burpees',\n                        'Running 100 m'\n                    ]\n                },\n                blocks: [\n                    {\n                        title: 'WOD \u2013 Pyramid',\n                        intro: ['Pyramid'],\n                        lines: [\n                            'Sprint 100 m',\n                            '2 Burpees',\n                            '4 Push-ups',\n                            '6 Alternate Lunges',\n                            '8 Thrusters',\n                            '10 Squats',\n                            '12 Shoulder Taps',\n                            '15 Sit-ups',\n                            '20 Ankle Crunches',\n                            'Running 400 m'\n                        ]\n                    }\n                ],\n                finisher: {\n                    title: 'Finisher',\n                    intro: ['Bring Sally Up'],\n                    lines: ['Squat Hold or Push-up Hold over the full song']\n                }\n            },\n            {\n                title: 'Premium Group Workout: Poker',\n                subtitle: 'Real group session from the premium template pool.',\n                warmup: {\n                    intro: ['2 rounds'],\n                    lines: [\n                        'Running 100 m',\n                        '30 Jumping Jacks',\n                        '20 Good Mornings',\n                        '10 Burpees'\n                    ]\n                },\n                blocks: [\n                    {\n                        title: 'WOD \u2013 Poker',\n                        intro: ['Poker'],\n                        lines: [\n                            '\u2666 = Squats',\n                            '\u2665 = Push-ups',\n                            '\u2660 = Sit-ups',\n                            '\u2663 = Burpees',\n                            'Joker = 5 Frog Jumps',\n                            '3 cards of the same suit = Running 100 m',\n                            'Jack = 11 reps \/ Queen = 12 reps \/ King = 13 reps \/ Ace = 15 reps'\n                        ]\n                    }\n                ],\n                finisher: {\n                    title: 'Finisher',\n                    intro: ['Roxanne'],\n                    lines: ['Burpee on \u201cRoxanne\u201d']\n                }\n            },\n            {\n                title: 'Premium Group Workout: Team Split',\n                subtitle: 'Real group session from the premium template pool.',\n                warmup: {\n                    intro: ['2 rounds'],\n                    lines: [\n                        '5 Burpees',\n                        '10 Push-ups',\n                        '15 Cossack Squats',\n                        '20 Getup',\n                        '25 Alternate V',\n                        'Running 100 m'\n                    ]\n                },\n                blocks: [\n                    {\n                        title: 'WOD \u2013 2 Groups',\n                        intro: ['Partner split'],\n                        lines: [\n                            'Team A: Running 100 m \/ 30 Jumping Jacks \/ 20 Push-ups \/ 30 Squats \/ 10 Squat Jumps \/ 40 Sit-ups \/ 20 Side Steps \/ 10 Burpees',\n                            'Team B: Plank \/ Static Squat Hold \/ Mountain Climbers \/ Glute Bridge \/ Biceps Curls \/ Shoulder Taps \/ Hollow \/ Superman',\n                            'Switch roles after each round'\n                        ]\n                    }\n                ],\n                finisher: {\n                    title: 'Finisher',\n                    intro: ['Song: Who Let The Dogs Out'],\n                    lines: [\n                        'Refrain: Static Squat Hold \/ Wuff Wuff Wuff = Squat Jumps',\n                        'Rest: Jumping Jacks'\n                    ]\n                }\n            }\n        ];\n\n        function getCount(key){\n            return parseInt(localStorage.getItem(key) || '0', 10);\n        }\n\n        function setCount(key, val){\n            localStorage.setItem(key, String(val));\n        }\n\n        function makeRng(seed){\n            let s = seed % 2147483647;\n            if (s <= 0) s += 2147483646;\n            return function(){\n                s = s * 16807 % 2147483647;\n                return (s - 1) \/ 2147483646;\n            };\n        }\n\n        function pick(rng, arr){\n            return arr[Math.floor(rng() * arr.length)];\n        }\n\n        function shuffle(rng, arr){\n            const a = arr.slice();\n            for (let i = a.length - 1; i > 0; i--){\n                const j = Math.floor(rng() * (i + 1));\n                [a[i], a[j]] = [a[j], a[i]];\n            }\n            return a;\n        }\n\n        function uniqueSample(rng, arr, count){\n            return shuffle(rng, arr).slice(0, count);\n        }\n\n        function cardPick(group, value){\n            const cards = root.querySelectorAll('.bz-card-option[data-group=\"' + group + '\"]');\n            cards.forEach(card => card.classList.remove('is-selected'));\n            const active = root.querySelector('.bz-card-option[data-group=\"' + group + '\"][data-value=\"' + value + '\"]');\n            if (active) active.classList.add('is-selected');\n        }\n\n        function bindOptionCards(){\n            root.querySelectorAll('.bz-card-option').forEach(card => {\n                card.addEventListener('click', function(){\n                    const group = this.getAttribute('data-group');\n                    const value = this.getAttribute('data-value');\n\n                    if (group === 'mode') state.mode = value;\n                    if (group === 'duration') state.duration = parseInt(value, 10);\n                    if (group === 'equipment') state.equipment = value === 'yes';\n\n                    cardPick(group, value);\n                });\n            });\n        }\n\n        function selectArchitecture(rng, duration){\n            if (duration === 30) return pick(rng, ['30-A','30-B','30-C']);\n            return pick(rng, ['60-A','60-B','60-C']);\n        }\n\n        function getExercisePool(equipment){\n            let pool = [\n                ...EXERCISES.running,\n                ...EXERCISES.legs,\n                ...EXERCISES.core,\n                ...EXERCISES.upper,\n                ...EXERCISES.hinge,\n                ...EXERCISES.explosive,\n                ...EXERCISES.plank\n            ];\n            if (equipment) pool = pool.concat(EXERCISES.equipment);\n            return pool;\n        }\n\n        function isTimeBasedCardio(ex){\n            return ['Jumping Jacks','CrissCross','Side Steps','In & Out','Skater Jumps','Bounces','Fast Feet'].includes(ex);\n        }\n\n        function isHold(ex){\n            return ['Plank','Side Plank','Reverse Plank','Hollow','Superman','Static Squat Hold'].includes(ex);\n        }\n\n        function pairedLine(ex, count){\n            if (ex === 'Step Up') return count + ' Step Up left \/ ' + count + ' Step Up right';\n            if (ex === 'Static Lunges') return count + ' Static Lunges left \/ ' + count + ' Static Lunges right';\n            if (ex === 'Donkey Kicks') return count + ' Donkey Kicks left \/ ' + count + ' Donkey Kicks right';\n            if (ex === 'Bulgarian Split Squat') return count + ' Bulgarian Split Squat left \/ ' + count + ' Bulgarian Split Squat right';\n            return null;\n        }\n\n        function formatWarmupLine(rng, ex){\n            if (ex.includes('Running') || ex.includes('Sprint')) return ex;\n            if (isHold(ex)) return '20 sec ' + ex;\n            if (isTimeBasedCardio(ex)) return pick(rng, ['30 sec ' + ex, '40 sec ' + ex]);\n\n            const paired = pairedLine(ex, pick(rng, [8,10,12]));\n            if (paired) return paired;\n\n            if ([\n                'Sit-ups','Twist','Russian Twist','Touch The Sky','Ankle Crunches',\n                'Knee to Elbow','Elbow to Knee','Alternate V','Simultan V','Scissors','Getup'\n            ].includes(ex)) return '20 ' + ex;\n\n            if ([\n                'Push-ups','Feet-Elevated Push-up','Hands-Elevated Push-up','Pike Push-up',\n                'Shoulder Taps','Commando','Crawl to Push-up','Dips'\n            ].includes(ex)) return '10 ' + ex;\n\n            if ([\n                'Thruster','Glute Bridge','Good Mornings'\n            ].includes(ex)) return '15 ' + ex;\n\n            if ([\n                'Burpees','Burpees\u2019n Knees','Burpee Broad Jump','Frog Jumps','Rotation Kick Through'\n            ].includes(ex)) return '5 ' + ex;\n\n            return '15 ' + ex;\n        }\n\n        function buildWarmup(rng, duration){\n            const intro = [];\n            const lines = [];\n            const count = duration === 60 ? 5 : 4;\n\n            if (duration === 60) intro.push('2 min Mobility Warmup');\n            intro.push(duration === 60 ? '2 rounds' : '1\u20132 rounds');\n\n            const bucket = [\n                ...uniqueSample(rng, EXERCISES.running, 1),\n                ...uniqueSample(rng, EXERCISES.legs, 1),\n                ...uniqueSample(rng, EXERCISES.core, 1),\n                ...uniqueSample(rng, EXERCISES.upper, 1),\n                ...uniqueSample(rng, EXERCISES.hinge, 1)\n            ];\n\n            uniqueSample(rng, bucket, count).forEach(ex => lines.push(formatWarmupLine(rng, ex)));\n\n            return { intro, lines };\n        }\n\n        function repLine(rng, ex, format){\n            if (ex.includes('Running') || ex.includes('Sprint')) return ex;\n\n            if (format === 'Long Chipper' || format === 'Chipper' || format === 'Mixed Structure') {\n                if (isHold(ex)) return pick(rng, ['30 sec ' + ex, '40 sec ' + ex]);\n                if (isTimeBasedCardio(ex)) return pick(rng, ['40 ' + ex, '50 ' + ex]);\n            } else {\n                if (isHold(ex)) return pick(rng, ['30 sec ' + ex, '40 sec ' + ex, '45 sec ' + ex]);\n                if (isTimeBasedCardio(ex)) return pick(rng, ['30 sec ' + ex, '40 sec ' + ex, '50 ' + ex]);\n            }\n\n            const paired = pairedLine(ex, pick(rng, [8,10,12,15]));\n            if (paired) return paired;\n\n            return pick(rng, [\n                '10 ' + ex,\n                '12 ' + ex,\n                '15 ' + ex,\n                '20 ' + ex\n            ]);\n        }\n\n        function selectFormat(rng, mode, minutes){\n            const solo = {\n                5: ['Mini EMOM','Mini Tabata','Sprint Ladder'],\n                10: ['EMOM','Short AMRAP','Sprint Intervals','Mini Ladder','Mini Tabata'],\n                15: ['AMRAP','Intervals','Strength + Conditioning','Ladder'],\n                20: ['AMRAP','EMOM','Ladder','Pyramid','Tabata','Stations','Chipper'],\n                30: ['Long Chipper','Multi-Tabata','Strength + Conditioning','Running + Stations'],\n                40: ['Long Chipper','Mixed Structure','Multi-Tabata','Running + Stations','Strength + Conditioning Extended']\n            };\n\n            const group = {\n                5: ['Mini Team Burner','Music Finisher','Mini Tabata'],\n                10: ['Team EMOM','Short AMRAP','Mini Ladder','Mini Tabata'],\n                15: ['AMRAP','Intervals','Strength + Conditioning','Ladder','Partner Switch'],\n                20: ['AMRAP','EMOM','Ladder','Pyramid','Dice Workout','Poker','Tabata','Stations','Chipper'],\n                30: ['Long Chipper','Multi-Tabata','Team Split','Partner Workout','Strength + Conditioning'],\n                40: ['Long Chipper','Mixed Structure','Multi-Tabata','Running + Stations','Team Conditioning','Strength + Conditioning Extended']\n            };\n\n            return pick(rng, (mode === 'group' ? group : solo)[minutes] || ['AMRAP']);\n        }\n\n        function buildMultiTabata(rng, minutes){\n            const minUnique = minutes >= 40 ? 5 : 3;\n            const totalTabatas = minutes >= 40 ? 10 : 5;\n            const uniqueNeeded = Math.min(Math.max(minUnique, 5), TABATA_LIBRARY.length);\n            const uniqueBase = uniqueSample(rng, TABATA_LIBRARY, uniqueNeeded);\n            const all = [];\n\n            for (let i = 0; i < totalTabatas; i++) {\n                all.push(uniqueBase[i % uniqueBase.length]);\n            }\n\n            const ordered = [];\n            const shuffled = shuffle(rng, all);\n\n            shuffled.forEach(item => {\n                if (!ordered.length || ordered[ordered.length - 1] !== item) {\n                    ordered.push(item);\n                }\n            });\n\n            while (ordered.length < totalTabatas) {\n                const candidate = pick(rng, uniqueBase);\n                if (candidate !== ordered[ordered.length - 1]) ordered.push(candidate);\n            }\n\n            return {\n                intro: [totalTabatas + ' x Tabata', '8 x 20\/10 each'],\n                lines: ordered\n            };\n        }\n\n        function buildLadderBlock(rng, pool){\n            const chosen = uniqueSample(rng, pool, Math.min(5, pool.length));\n            return {\n                format: 'Ladder',\n                intro: ['Ladder', '6-9-12-15-12-9-6'],\n                lines: chosen\n            };\n        }\n\n        function buildBlock(rng, mode, minutes, equipment, usedSet){\n            const format = selectFormat(rng, mode, minutes);\n            let pool = getExercisePool(equipment).filter(ex => !usedSet.has(ex));\n            if (!pool.length) pool = getExercisePool(equipment);\n\n            let count = 6;\n            if (minutes <= 5) count = 3;\n            else if (minutes <= 10) count = 4;\n            else if (minutes <= 15) count = 5;\n            else if (minutes <= 20) count = 6;\n            else count = 8;\n\n            const selected = uniqueSample(rng, pool, Math.min(count, pool.length));\n            selected.forEach(ex => usedSet.add(ex));\n\n            let intro = [];\n            let lines = [];\n\n            if (format === 'AMRAP') {\n                intro = ['AMRAP \u00b7 ' + minutes + ' min'];\n                lines = selected.map(ex => repLine(rng, ex, format));\n            }\n            else if (format === 'EMOM' || format === 'Team EMOM' || format === 'Mini EMOM') {\n                intro = [format + ' \u00b7 ' + minutes + ' min'];\n                lines = selected.slice(0, 4).map(ex => repLine(rng, ex, format));\n            }\n            else if (format === 'Ladder' || format === 'Mini Ladder') {\n                const ladder = buildLadderBlock(rng, pool);\n                intro = ladder.intro;\n                lines = ladder.lines;\n            }\n            else if (format === 'Pyramid') {\n                intro = ['Pyramid'];\n                lines = selected.slice(0, 7).map(ex => repLine(rng, ex, format));\n            }\n            else if (format === 'Tabata' || format === 'Mini Tabata') {\n                intro = ['Tabata', '8 x 20\/10'];\n                lines = uniqueSample(rng, TABATA_LIBRARY, 1);\n            }\n            else if (format === 'Multi-Tabata') {\n                const tabataBlock = buildMultiTabata(rng, minutes);\n                intro = tabataBlock.intro;\n                lines = tabataBlock.lines;\n            }\n            else if (format === 'Stations' || format === 'Running + Stations' || format === 'Team Conditioning' || format === 'Intervals') {\n                intro = ['1 min work', 'Rest the time left'];\n                lines = selected.map(ex => repLine(rng, ex, format));\n            }\n            else if (format === 'Chipper' || format === 'Long Chipper' || format === 'Mixed Structure' || format === 'Strength + Conditioning Extended') {\n                intro = [format];\n                lines = selected.map(ex => repLine(rng, ex, format));\n            }\n            else if (format === 'Strength + Conditioning') {\n                intro = ['Strength + Conditioning'];\n                lines = selected.map(ex => repLine(rng, ex, format));\n            }\n            else if (format === 'Sprint Intervals' || format === 'Sprint Ladder') {\n                intro = [format, '5 rounds'];\n                lines = ['Sprint 100 m'].concat(selected.slice(0, 3).map(ex => repLine(rng, ex, format)));\n            }\n            else if (format === 'Dice Workout' && mode === 'group') {\n                const diceMoves = uniqueSample(rng, getExercisePool(equipment), 6);\n                intro = ['The Dice of Doom'];\n                lines = diceMoves.map((ex, i) => (i + 1) + ' = ' + repLine(rng, ex, format));\n            }\n            else if (format === 'Poker' && mode === 'group') {\n                const pokerMoves = uniqueSample(rng, getExercisePool(equipment), 4);\n                intro = ['Poker'];\n                lines = [\n                    '\u2666 = ' + pokerMoves[0],\n                    '\u2665 = ' + pokerMoves[1],\n                    '\u2660 = ' + pokerMoves[2],\n                    '\u2663 = ' + pokerMoves[3],\n                    'Joker = 5 Frog Jumps',\n                    '3 cards of the same suit = Running 100 m',\n                    'Jack = 11 reps \/ Queen = 12 reps \/ King = 13 reps \/ Ace = 15 reps'\n                ];\n            }\n            else if ((format === 'Partner Workout' || format === 'Partner Switch' || format === 'Team Split') && mode === 'group') {\n                const aMoves = uniqueSample(rng, EXERCISES.running.concat(EXERCISES.explosive), 3);\n                const bMoves = uniqueSample(rng, EXERCISES.legs.concat(EXERCISES.core).concat(EXERCISES.plank).concat(equipment ? EXERCISES.equipment : []), 5);\n                intro = [format];\n                lines = ['Partner A:']\n                    .concat(aMoves.map(ex => repLine(rng, ex, format)))\n                    .concat(['Partner B while A works:'])\n                    .concat(bMoves.map(ex => repLine(rng, ex, format)))\n                    .concat(['Switch roles']);\n            }\n            else if (format === 'Mini Team Burner' && mode === 'group') {\n                intro = ['5 min burner'];\n                lines = [\n                    'Partner A runs 100 m',\n                    'Partner B holds Static Squat Hold or Plank',\n                    'Switch every round'\n                ];\n            }\n            else if (format === 'Music Finisher' && mode === 'group') {\n                intro = ['Music finisher'];\n                lines = [pick(rng, [\n                    'Roxanne \u2013 Burpee on \u201cRoxanne\u201d',\n                    'Happy \u2013 Jumping Jacks, Burpee on \u201cHappy\u201d',\n                    'Bring Sally Up \u2013 Squat Hold or Push-up Hold',\n                    'Turn Around \u2013 Hollow \/ Superman switch',\n                    'U Can\u2019t Touch This \u2013 Chorus = Plank \/ Verse = Sit-ups'\n                ])];\n            }\n            else {\n                intro = [format];\n                lines = selected.map(ex => repLine(rng, ex, format));\n            }\n\n            return { format, intro, lines };\n        }\n\n        function injectChallenge(rng, mode, lines){\n            const challenge = pick(rng, mode === 'group' ? GROUP_CHALLENGES : SOLO_CHALLENGES);\n            lines.unshift(challenge);\n            return challenge;\n        }\n\n        function buildFinisher(rng, mode, usedFormats){\n            const hasTabata = usedFormats.some(f => String(f).toLowerCase().includes('tabata'));\n\n            const soloOptions = hasTabata\n                ? [\n                    { intro: ['Sprint Finish'], lines: ['5 rounds: Running 100 m + 10 Burpees'] },\n                    { intro: ['Plank Burn'], lines: ['40 sec Plank \/ 20 sec rest x 5'] },\n                    { intro: ['Leg Burner'], lines: ['3 rounds: 20 Squats \/ 20 Alternate Lunges \/ 20 sec Hollow'] }\n                ]\n                : [\n                    { intro: ['Tabata Finisher', '8 x 20\/10'], lines: ['Burpees \/ Squats'] },\n                    { intro: ['Sprint Finish'], lines: ['5 rounds: Running 100 m + 10 Burpees'] },\n                    { intro: ['Plank Burn'], lines: ['40 sec Plank \/ 20 sec rest x 5'] }\n                ];\n\n            const groupOptions = hasTabata\n                ? [\n                    { intro: ['Roxanne'], lines: ['Burpee on \u201cRoxanne\u201d'] },\n                    { intro: ['Happy'], lines: ['Jumping Jacks, Burpee on \u201cHappy\u201d'] },\n                    { intro: ['Song: Who Let The Dogs Out'], lines: ['Refrain: Static Squat Hold \/ Wuff Wuff Wuff = Squat Jumps', 'Rest: Jumping Jacks'] },\n                    { intro: ['Turn Around'], lines: ['Hold Hollow, switch to Superman on \u201cTurn around\u201d'] }\n                ]\n                : [\n                    { intro: ['Tabata Finisher', '8 x 20\/10'], lines: ['Squats \/ Push-ups'] },\n                    { intro: ['Roxanne'], lines: ['Burpee on \u201cRoxanne\u201d'] },\n                    { intro: ['Happy'], lines: ['Jumping Jacks, Burpee on \u201cHappy\u201d'] },\n                    { intro: ['Bring Sally Up'], lines: ['Squat Hold or Push-up Hold'] },\n                    { intro: ['Turn Around'], lines: ['Hold Hollow, switch to Superman on \u201cTurn around\u201d'] },\n                    { intro: ['U Can\u2019t Touch This'], lines: ['Chorus = Plank \/ Verse = Sit-ups'] }\n                ];\n\n            const picked = pick(rng, mode === 'group' ? groupOptions : soloOptions);\n\n            return {\n                title: 'Finisher',\n                intro: picked.intro,\n                lines: picked.lines\n            };\n        }\n\n        function renderMeta(intro){\n            if (!intro || !intro.length) return '';\n            return '<div class=\"bz-meta\">' + intro.map(line => '<div>' + line + '<\/div>').join('') + '<\/div>';\n        }\n\n        function renderList(lines){\n            return '<ul>' + lines.map(line => '<li>' + line + '<\/li>').join('') + '<\/ul>';\n        }\n\n        function renderWorkout(workout){\n            const badges = [\n                '<span class=\"bz-badge\">' + (workout.mode === 'group' ? 'Group Workout' : 'Single Workout') + '<\/span>',\n                '<span class=\"bz-badge\">' + workout.duration + ' Minutes<\/span>',\n                '<span class=\"bz-badge\">Weights \/ Bands: ' + (workout.equipment ? 'Yes' : 'No') + '<\/span>'\n            ];\n\n            if (workout.challengeLabel) {\n                badges.push('<span class=\"bz-badge\">' + workout.challengeLabel + '<\/span>');\n            }\n\n            let html = '';\n            html += '<div class=\"bz-top-action\"><button type=\"button\" class=\"bz-btn bz-btn-secondary bz-try-again-top\">Try again<\/button><\/div>';\n            html += '<div class=\"bz-badges\">' + badges.join('') + '<\/div>';\n            html += '<div class=\"bz-grid\">';\n\n            html += '<div class=\"bz-card bz-card--full' + (workout.isPremium ? ' bz-card--premium' : '') + '\">';\n            if (workout.isPremium) html += '<div class=\"bz-premium-tag\">Premium Group Template<\/div>';\n            html += '<h3>' + workout.title + '<\/h3>';\n            if (workout.subtitle) html += '<div class=\"bz-meta\"><div>' + workout.subtitle + '<\/div><\/div>';\n            html += '<\/div>';\n\n            html += '<div class=\"bz-card\">';\n            html += '<h3>Warm-up<\/h3>';\n            html += renderMeta(workout.warmup.intro);\n            html += renderList(workout.warmup.lines);\n            html += '<\/div>';\n\n            workout.blocks.forEach(block => {\n                html += '<div class=\"bz-card\">';\n                html += '<h3>' + block.title + '<\/h3>';\n                html += renderMeta(block.intro);\n                html += renderList(block.lines);\n                html += '<\/div>';\n            });\n\n            html += '<div class=\"bz-card bz-card--full\">';\n            html += '<h3>' + workout.finisher.title + '<\/h3>';\n            html += renderMeta(workout.finisher.intro);\n            html += renderList(workout.finisher.lines);\n            html += '<\/div>';\n\n            html += '<div class=\"bz-card bz-card--full\">';\n            html += '<h3>Stretching<\/h3>';\n            html += '<div class=\"bz-meta\"><div>Finish with 5 min stretching.<\/div><\/div>';\n            html += '<\/div>';\n\n            html += '<\/div>';\n            html += '<div class=\"bz-bottom-action\"><button type=\"button\" class=\"bz-btn bz-btn-secondary bz-try-again-bottom\">Try again<\/button><\/div>';\n\n            output.innerHTML = html;\n\n            const topBtn = output.querySelector('.bz-try-again-top');\n            const bottomBtn = output.querySelector('.bz-try-again-bottom');\n\n            if (topBtn) {\n                topBtn.addEventListener('click', function(){\n                    generateWorkout(false);\n                });\n            }\n\n            if (bottomBtn) {\n                bottomBtn.addEventListener('click', function(){\n                    generateWorkout(true);\n                });\n            }\n        }\n\n        function renderPremiumWorkout(template){\n            renderWorkout({\n                title: template.title,\n                subtitle: template.subtitle,\n                mode: 'group',\n                duration: state.duration,\n                equipment: state.equipment,\n                warmup: template.warmup,\n                blocks: template.blocks,\n                finisher: template.finisher,\n                isPremium: true,\n                challengeLabel: null\n            });\n        }\n\n        function smoothScrollToTop(){\n            if (topAnchor && typeof topAnchor.scrollIntoView === 'function') {\n                topAnchor.scrollIntoView({ behavior: 'smooth', block: 'start' });\n            } else {\n                window.scrollTo({ top: root.offsetTop || 0, behavior: 'smooth' });\n            }\n        }\n\n        function generateWorkout(scrollTopAfter){\n            const totalCount = getCount(STORAGE_KEY_TOTAL) + 1;\n            setCount(STORAGE_KEY_TOTAL, totalCount);\n\n            let groupCount = getCount(STORAGE_KEY_GROUP);\n            if (state.mode === 'group') {\n                groupCount += 1;\n                setCount(STORAGE_KEY_GROUP, groupCount);\n            }\n\n            const seed = Date.now() + totalCount * 37 + (state.mode === 'group' ? groupCount * 101 : 0);\n            const rng = makeRng(seed);\n\n            if (state.mode === 'group' && groupCount % 15 === 0) {\n                const template = pick(rng, PREMIUM_GROUP_TEMPLATES);\n                renderPremiumWorkout(template);\n                if (scrollTopAfter) smoothScrollToTop();\n                return;\n            }\n\n            const architecture = selectArchitecture(rng, state.duration);\n            const warmup = buildWarmup(rng, state.duration);\n            const usedSet = new Set();\n            const usedFormats = [];\n            const blocks = [];\n            let challengeLabel = null;\n            const shouldHaveChallenge = totalCount % 5 === 0;\n\n            function addBlock(title, minutes, allowChallenge){\n                const block = buildBlock(rng, state.mode, minutes, state.equipment, usedSet);\n                usedFormats.push(block.format);\n\n                if (allowChallenge && shouldHaveChallenge && !challengeLabel) {\n                    challengeLabel = injectChallenge(rng, state.mode, block.lines);\n                }\n\n                blocks.push({\n                    title: title + ' (' + minutes + ' min)',\n                    intro: block.intro,\n                    lines: block.lines\n                });\n            }\n\n            if (architecture === '30-A') {\n                const challengeSlot = pick(rng, [1, 2]);\n                addBlock('WOD 1', 10, challengeSlot === 1);\n                addBlock('WOD 2', 10, challengeSlot === 2);\n            }\n            else if (architecture === '30-B') {\n                addBlock('Long WOD', 20, true);\n            }\n            else if (architecture === '30-C') {\n                const challengeSlot = pick(rng, [1, 2]);\n                addBlock('WOD 1', 15, challengeSlot === 1);\n                addBlock('WOD 2', 5, challengeSlot === 2);\n            }\n            else if (architecture === '60-A') {\n                const challengeSlot = pick(rng, [1, 2]);\n                addBlock('WOD 1', 20, challengeSlot === 1);\n                addBlock('WOD 2', 20, challengeSlot === 2);\n            }\n            else if (architecture === '60-B') {\n                addBlock('Long WOD', 40, true);\n            }\n            else if (architecture === '60-C') {\n                const challengeSlot = pick(rng, [1, 2]);\n                addBlock('WOD 1', 30, challengeSlot === 1);\n                addBlock('WOD 2', 10, challengeSlot === 2);\n            }\n\n            const finisher = buildFinisher(rng, state.mode, usedFormats);\n\n            renderWorkout({\n                title: 'Your BADDAZZ Workout',\n                subtitle: 'Outdoor functional training with hybrid structure and real variation.',\n                mode: state.mode,\n                duration: state.duration,\n                equipment: state.equipment,\n                warmup,\n                blocks,\n                finisher,\n                isPremium: false,\n                challengeLabel\n            });\n\n            if (scrollTopAfter) smoothScrollToTop();\n        }\n\n        bindOptionCards();\n\n        generateBtn.addEventListener('click', function(){\n            generateWorkout(false);\n        });\n    })();\n    <\/script>\n    \n<p>Este generador de entrenamientos contiene <strong>cientos de sesiones al aire libre dise\u00f1adas de forma inteligente<\/strong>, tanto para <strong>atletas individuales como para grupos<\/strong>. Cada sesi\u00f3n est\u00e1 estructurada con ejercicios cuidadosamente seleccionados que funcionan en conjunto, no son movimientos aleatorios lanzados en una lista. Carrera, fuerza, core, movilidad, trabajo explosivo, juegos, finishers con m\u00fasica y elementos de entrenamiento h\u00edbrido se combinan para crear entrenamientos que resultan desafiantes, equilibrados y divertidos. El resultado es una variedad real, un flujo de ejercicios inteligente y una experiencia de entrenamiento que se siente mucho m\u00e1s cercana a una sesi\u00f3n dise\u00f1ada por un entrenador que a un generador de ejercicios b\u00e1sico.<\/p>\n<p>\u00bfHas creado ya tu entrenamiento? Ahora sube de nivel con <a href=\"https:\/\/baddazz.com\/workouts\/10-classic-bodyweight-functional-exercises\/\">10 ejercicios funcionales cl\u00e1sicos con peso corporal<\/a>: perfectos para mejorar la fuerza, la movilidad y el control.<\/p>\n<p><strong>S\u00e9 audaz. S\u00e9 BADDAZZ.<\/strong> \ud83d\udca5<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Crea un nuevo entrenamiento funcional al aire libre de 30 o 60 minutos en segundos, con carrera, fuerza, formatos l\u00fadicos y retos inesperados. Cada sesi\u00f3n es diferente, para que puedas entrenar duro, mantener la motivaci\u00f3n y divertirte.<\/p>\n","protected":false},"author":1,"featured_media":1011,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false,"_ppma_block_editor_authors":""},"categories":[193],"tags":[],"ppma_author":[24],"class_list":["post-1012","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-workouts","et-has-post-format-content","et_post_format-et-post-format-standard"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Generador de entrenamientos funcionales gratuito<\/title>\n<meta name=\"description\" content=\"Crea tu propio entrenamiento funcional: 30 o 60 minutos de divertida actividad al aire libre y retos sorprendentes. \u00a1Pru\u00e9balo ahora!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/baddazz.com\/es\/workouts\/generador-de-entrenamientos-funcionales\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Generador de entrenamientos funcionales gratuito\" \/>\n<meta property=\"og:description\" content=\"Crea tu propio entrenamiento funcional: 30 o 60 minutos de divertida actividad al aire libre y retos sorprendentes. \u00a1Pru\u00e9balo ahora!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/baddazz.com\/es\/workouts\/generador-de-entrenamientos-funcionales\/\" \/>\n<meta property=\"og:site_name\" content=\"BADDAZZ\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/baddazz.hybrid.sports\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-19T22:56:52+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/baddazz.com\/wp-content\/uploads\/2026\/03\/functional-training-workout-builder-1.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1536\" \/>\n\t<meta property=\"og:image:height\" content=\"635\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"BADDAZZ\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"BADDAZZ\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"1 minuto\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/baddazz.com\\\/es\\\/workouts\\\/generador-de-entrenamientos-funcionales\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/baddazz.com\\\/es\\\/workouts\\\/generador-de-entrenamientos-funcionales\\\/\"},\"author\":{\"name\":\"BADDAZZ\",\"@id\":\"https:\\\/\\\/baddazz.com\\\/es\\\/#\\\/schema\\\/person\\\/90f68bdb99128f4b0e3a2103c39a86b6\"},\"headline\":\"Generador de entrenamientos funcionales\",\"datePublished\":\"2026-03-19T22:56:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/baddazz.com\\\/es\\\/workouts\\\/generador-de-entrenamientos-funcionales\\\/\"},\"wordCount\":150,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/baddazz.com\\\/es\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/baddazz.com\\\/es\\\/workouts\\\/generador-de-entrenamientos-funcionales\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/baddazz.com\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/functional-training-workout-builder-1.webp\",\"articleSection\":[\"Workouts\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/baddazz.com\\\/es\\\/workouts\\\/generador-de-entrenamientos-funcionales\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/baddazz.com\\\/es\\\/workouts\\\/generador-de-entrenamientos-funcionales\\\/\",\"url\":\"https:\\\/\\\/baddazz.com\\\/es\\\/workouts\\\/generador-de-entrenamientos-funcionales\\\/\",\"name\":\"Generador de entrenamientos funcionales gratuito\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/baddazz.com\\\/es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/baddazz.com\\\/es\\\/workouts\\\/generador-de-entrenamientos-funcionales\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/baddazz.com\\\/es\\\/workouts\\\/generador-de-entrenamientos-funcionales\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/baddazz.com\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/functional-training-workout-builder-1.webp\",\"datePublished\":\"2026-03-19T22:56:52+00:00\",\"description\":\"Crea tu propio entrenamiento funcional: 30 o 60 minutos de divertida actividad al aire libre y retos sorprendentes. \u00a1Pru\u00e9balo ahora!\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/baddazz.com\\\/es\\\/workouts\\\/generador-de-entrenamientos-funcionales\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/baddazz.com\\\/es\\\/workouts\\\/generador-de-entrenamientos-funcionales\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/baddazz.com\\\/es\\\/workouts\\\/generador-de-entrenamientos-funcionales\\\/#primaryimage\",\"url\":\"https:\\\/\\\/baddazz.com\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/functional-training-workout-builder-1.webp\",\"contentUrl\":\"https:\\\/\\\/baddazz.com\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/functional-training-workout-builder-1.webp\",\"width\":1536,\"height\":635,\"caption\":\"Mujer corriendo - Generador de entrenamientos funcionales\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/baddazz.com\\\/es\\\/workouts\\\/generador-de-entrenamientos-funcionales\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Start\",\"item\":\"https:\\\/\\\/baddazz.com\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Generador de entrenamientos funcionales\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/baddazz.com\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/baddazz.com\\\/es\\\/\",\"name\":\"BADDAZZ\",\"description\":\"THE ressource for women in hybrid sports\",\"publisher\":{\"@id\":\"https:\\\/\\\/baddazz.com\\\/es\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/baddazz.com\\\/es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/baddazz.com\\\/es\\\/#organization\",\"name\":\"BADDAZZ\",\"url\":\"https:\\\/\\\/baddazz.com\\\/es\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/baddazz.com\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/baddazz.com\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/cropped-logo-baddazz-1.webp\",\"contentUrl\":\"https:\\\/\\\/baddazz.com\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/cropped-logo-baddazz-1.webp\",\"width\":237,\"height\":64,\"caption\":\"BADDAZZ\"},\"image\":{\"@id\":\"https:\\\/\\\/baddazz.com\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/baddazz.hybrid.sports\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/baddazz.com\\\/es\\\/#\\\/schema\\\/person\\\/90f68bdb99128f4b0e3a2103c39a86b6\",\"name\":\"BADDAZZ\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0f24e0b50d94f01f44d4cbd8ea48d7cbecbe799d7e25d08fba2c1037c604c498?s=96&d=mm&r=gc720cf944558c08e1a5e599c45622976\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0f24e0b50d94f01f44d4cbd8ea48d7cbecbe799d7e25d08fba2c1037c604c498?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0f24e0b50d94f01f44d4cbd8ea48d7cbecbe799d7e25d08fba2c1037c604c498?s=96&d=mm&r=g\",\"caption\":\"BADDAZZ\"},\"description\":\"We are BADDAZZ \u2014 the resource for women in sports. Built by athletes who live the training themselves, we share workouts, insights, and real experiences from the world where strength and endurance meet.\",\"sameAs\":[\"https:\\\/\\\/baddazz.com\"],\"url\":\"https:\\\/\\\/baddazz.com\\\/es\\\/author\\\/baddazz\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Generador de entrenamientos funcionales gratuito","description":"Crea tu propio entrenamiento funcional: 30 o 60 minutos de divertida actividad al aire libre y retos sorprendentes. \u00a1Pru\u00e9balo ahora!","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:\/\/baddazz.com\/es\/workouts\/generador-de-entrenamientos-funcionales\/","og_locale":"es_ES","og_type":"article","og_title":"Generador de entrenamientos funcionales gratuito","og_description":"Crea tu propio entrenamiento funcional: 30 o 60 minutos de divertida actividad al aire libre y retos sorprendentes. \u00a1Pru\u00e9balo ahora!","og_url":"https:\/\/baddazz.com\/es\/workouts\/generador-de-entrenamientos-funcionales\/","og_site_name":"BADDAZZ","article_publisher":"https:\/\/www.facebook.com\/baddazz.hybrid.sports","article_published_time":"2026-03-19T22:56:52+00:00","og_image":[{"width":1536,"height":635,"url":"https:\/\/baddazz.com\/wp-content\/uploads\/2026\/03\/functional-training-workout-builder-1.webp","type":"image\/webp"}],"author":"BADDAZZ","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"BADDAZZ","Tiempo de lectura":"1 minuto"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/baddazz.com\/es\/workouts\/generador-de-entrenamientos-funcionales\/#article","isPartOf":{"@id":"https:\/\/baddazz.com\/es\/workouts\/generador-de-entrenamientos-funcionales\/"},"author":{"name":"BADDAZZ","@id":"https:\/\/baddazz.com\/es\/#\/schema\/person\/90f68bdb99128f4b0e3a2103c39a86b6"},"headline":"Generador de entrenamientos funcionales","datePublished":"2026-03-19T22:56:52+00:00","mainEntityOfPage":{"@id":"https:\/\/baddazz.com\/es\/workouts\/generador-de-entrenamientos-funcionales\/"},"wordCount":150,"commentCount":0,"publisher":{"@id":"https:\/\/baddazz.com\/es\/#organization"},"image":{"@id":"https:\/\/baddazz.com\/es\/workouts\/generador-de-entrenamientos-funcionales\/#primaryimage"},"thumbnailUrl":"https:\/\/baddazz.com\/wp-content\/uploads\/2026\/03\/functional-training-workout-builder-1.webp","articleSection":["Workouts"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/baddazz.com\/es\/workouts\/generador-de-entrenamientos-funcionales\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/baddazz.com\/es\/workouts\/generador-de-entrenamientos-funcionales\/","url":"https:\/\/baddazz.com\/es\/workouts\/generador-de-entrenamientos-funcionales\/","name":"Generador de entrenamientos funcionales gratuito","isPartOf":{"@id":"https:\/\/baddazz.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/baddazz.com\/es\/workouts\/generador-de-entrenamientos-funcionales\/#primaryimage"},"image":{"@id":"https:\/\/baddazz.com\/es\/workouts\/generador-de-entrenamientos-funcionales\/#primaryimage"},"thumbnailUrl":"https:\/\/baddazz.com\/wp-content\/uploads\/2026\/03\/functional-training-workout-builder-1.webp","datePublished":"2026-03-19T22:56:52+00:00","description":"Crea tu propio entrenamiento funcional: 30 o 60 minutos de divertida actividad al aire libre y retos sorprendentes. \u00a1Pru\u00e9balo ahora!","breadcrumb":{"@id":"https:\/\/baddazz.com\/es\/workouts\/generador-de-entrenamientos-funcionales\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/baddazz.com\/es\/workouts\/generador-de-entrenamientos-funcionales\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/baddazz.com\/es\/workouts\/generador-de-entrenamientos-funcionales\/#primaryimage","url":"https:\/\/baddazz.com\/wp-content\/uploads\/2026\/03\/functional-training-workout-builder-1.webp","contentUrl":"https:\/\/baddazz.com\/wp-content\/uploads\/2026\/03\/functional-training-workout-builder-1.webp","width":1536,"height":635,"caption":"Mujer corriendo - Generador de entrenamientos funcionales"},{"@type":"BreadcrumbList","@id":"https:\/\/baddazz.com\/es\/workouts\/generador-de-entrenamientos-funcionales\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Start","item":"https:\/\/baddazz.com\/es\/"},{"@type":"ListItem","position":2,"name":"Generador de entrenamientos funcionales"}]},{"@type":"WebSite","@id":"https:\/\/baddazz.com\/es\/#website","url":"https:\/\/baddazz.com\/es\/","name":"BADDAZZ","description":"THE ressource for women in hybrid sports","publisher":{"@id":"https:\/\/baddazz.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/baddazz.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/baddazz.com\/es\/#organization","name":"BADDAZZ","url":"https:\/\/baddazz.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/baddazz.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/baddazz.com\/wp-content\/uploads\/2026\/02\/cropped-logo-baddazz-1.webp","contentUrl":"https:\/\/baddazz.com\/wp-content\/uploads\/2026\/02\/cropped-logo-baddazz-1.webp","width":237,"height":64,"caption":"BADDAZZ"},"image":{"@id":"https:\/\/baddazz.com\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/baddazz.hybrid.sports"]},{"@type":"Person","@id":"https:\/\/baddazz.com\/es\/#\/schema\/person\/90f68bdb99128f4b0e3a2103c39a86b6","name":"BADDAZZ","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/0f24e0b50d94f01f44d4cbd8ea48d7cbecbe799d7e25d08fba2c1037c604c498?s=96&d=mm&r=gc720cf944558c08e1a5e599c45622976","url":"https:\/\/secure.gravatar.com\/avatar\/0f24e0b50d94f01f44d4cbd8ea48d7cbecbe799d7e25d08fba2c1037c604c498?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0f24e0b50d94f01f44d4cbd8ea48d7cbecbe799d7e25d08fba2c1037c604c498?s=96&d=mm&r=g","caption":"BADDAZZ"},"description":"We are BADDAZZ \u2014 the resource for women in sports. Built by athletes who live the training themselves, we share workouts, insights, and real experiences from the world where strength and endurance meet.","sameAs":["https:\/\/baddazz.com"],"url":"https:\/\/baddazz.com\/es\/author\/baddazz\/"}]}},"jetpack_sharing_enabled":true,"authors":[{"term_id":24,"user_id":1,"is_guest":0,"slug":"baddazz","display_name":"BADDAZZ","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/0f24e0b50d94f01f44d4cbd8ea48d7cbecbe799d7e25d08fba2c1037c604c498?s=96&d=mm&r=g","author_category":"1","first_name":"","last_name":"","user_url":"https:\/\/baddazz.com","job_title":"","description":"We are BADDAZZ \u2014 <strong>the resource for women in sports<\/strong>. Built by athletes who live the training themselves, we share workouts, insights, and real experiences from the world where strength and endurance meet."}],"jetpack_featured_media_url":"https:\/\/baddazz.com\/wp-content\/uploads\/2026\/03\/functional-training-workout-builder-1.webp","_links":{"self":[{"href":"https:\/\/baddazz.com\/es\/wp-json\/wp\/v2\/posts\/1012","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/baddazz.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/baddazz.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/baddazz.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/baddazz.com\/es\/wp-json\/wp\/v2\/comments?post=1012"}],"version-history":[{"count":0,"href":"https:\/\/baddazz.com\/es\/wp-json\/wp\/v2\/posts\/1012\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/baddazz.com\/es\/wp-json\/wp\/v2\/media\/1011"}],"wp:attachment":[{"href":"https:\/\/baddazz.com\/es\/wp-json\/wp\/v2\/media?parent=1012"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/baddazz.com\/es\/wp-json\/wp\/v2\/categories?post=1012"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/baddazz.com\/es\/wp-json\/wp\/v2\/tags?post=1012"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/baddazz.com\/es\/wp-json\/wp\/v2\/ppma_author?post=1012"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}