{"slug":"acf-advanced-custom-fields","title":"ACF — Advanced Custom Fields","tags":["acf","custom-fields","php","repeater","options-page"],"agent_summary":"ACF field group registration via PHP code, getting field values in templates, repeater field loops, options pages for site-wide settings, ACF JSON sync for version control, and Elementor Pro dynamic tag integration.","trigger_phrases":["acf wordpress","advanced custom fields","acf field group php","get_field acf","acf repeater","acf options page","acf elementor dynamic","acf json sync"],"runnable":true,"markdown":"\nACF extends WordPress with custom fields attached to posts, pages, CPTs, users, taxonomy terms, or options pages.\n\n## Register Field Group via PHP (Preferred — No DB Dependency)\n\n```php\nadd_action('acf/init', function() {\n    acf_add_local_field_group([\n        'key'    => 'group_service_fields',\n        'title'  => 'Service Fields',\n        'fields' => [\n            [\n                'key'           => 'field_service_icon',\n                'label'         => 'Icon',\n                'name'          => 'service_icon',\n                'type'          => 'image',\n                'return_format' => 'url',\n            ],\n            [\n                'key'     => 'field_service_price',\n                'label'   => 'Price',\n                'name'    => 'service_price',\n                'type'    => 'number',\n                'prepend' => '$',\n            ],\n            [\n                'key'        => 'field_service_features',\n                'label'      => 'Features',\n                'name'       => 'service_features',\n                'type'       => 'repeater',\n                'sub_fields' => [\n                    [\n                        'key'   => 'field_feature_text',\n                        'label' => 'Feature',\n                        'name'  => 'feature_text',\n                        'type'  => 'text',\n                    ],\n                ],\n            ],\n        ],\n        'location' => [\n            [[\n                'param'    => 'post_type',\n                'operator' => '==',\n                'value'    => 'service',\n            ]],\n        ],\n    ]);\n});\n```\n\n## Getting Field Values\n\n```php\n// Current post in template\n$icon  = get_field('service_icon');\n$price = get_field('service_price');\n\n// Specific post ID\n$icon = get_field('service_icon', 123);\n\n// Repeater field\n$features = get_field('service_features');\nif ($features) {\n    foreach ($features as $row) {\n        echo esc_html($row['feature_text']);\n    }\n}\n\n// Options page field\n$phone = get_field('company_phone', 'option');\n```\n\n## Options Page\n\n```php\n// Register in functions.php\nif (function_exists('acf_add_options_page')) {\n    acf_add_options_page([\n        'page_title' => 'Site Settings',\n        'menu_title' => 'Site Settings',\n        'menu_slug'  => 'site-settings',\n        'capability' => 'edit_posts',\n        'redirect'   => false,\n    ]);\n}\n```\n\n## ACF + Elementor Pro Dynamic Tags\n\n1. Elementor widget > click Dynamic Data icon\n2. Select \"ACF Field\"\n3. Choose field name\n4. Works with: text, image, URL, color, number field types\n\n## ACF JSON Sync (Version Control)\n\n```php\n// Save field groups as JSON files in theme\nadd_filter('acf/settings/save_json', function() {\n    return get_stylesheet_directory() . '/acf-json';\n});\n\n// Load field groups from JSON\nadd_filter('acf/settings/load_json', function($paths) {\n    $paths[] = get_stylesheet_directory() . '/acf-json';\n    return $paths;\n});\n```\n\nCommit `/acf-json/` directory to git. Field groups sync automatically across environments.\n","html":"<p>ACF extends WordPress with custom fields attached to posts, pages, CPTs, users, taxonomy terms, or options pages.</p>\n<h2>Register Field Group via PHP (Preferred — No DB Dependency)</h2>\n<pre><code class=\"language-php\">add_action('acf/init', function() {\n    acf_add_local_field_group([\n        'key'    => 'group_service_fields',\n        'title'  => 'Service Fields',\n        'fields' => [\n            [\n                'key'           => 'field_service_icon',\n                'label'         => 'Icon',\n                'name'          => 'service_icon',\n                'type'          => 'image',\n                'return_format' => 'url',\n            ],\n            [\n                'key'     => 'field_service_price',\n                'label'   => 'Price',\n                'name'    => 'service_price',\n                'type'    => 'number',\n                'prepend' => '$',\n            ],\n            [\n                'key'        => 'field_service_features',\n                'label'      => 'Features',\n                'name'       => 'service_features',\n                'type'       => 'repeater',\n                'sub_fields' => [\n                    [\n                        'key'   => 'field_feature_text',\n                        'label' => 'Feature',\n                        'name'  => 'feature_text',\n                        'type'  => 'text',\n                    ],\n                ],\n            ],\n        ],\n        'location' => [\n            [[\n                'param'    => 'post_type',\n                'operator' => '==',\n                'value'    => 'service',\n            ]],\n        ],\n    ]);\n});\n</code></pre>\n<h2>Getting Field Values</h2>\n<pre><code class=\"language-php\">// Current post in template\n$icon  = get_field('service_icon');\n$price = get_field('service_price');\n\n// Specific post ID\n$icon = get_field('service_icon', 123);\n\n// Repeater field\n$features = get_field('service_features');\nif ($features) {\n    foreach ($features as $row) {\n        echo esc_html($row['feature_text']);\n    }\n}\n\n// Options page field\n$phone = get_field('company_phone', 'option');\n</code></pre>\n<h2>Options Page</h2>\n<pre><code class=\"language-php\">// Register in functions.php\nif (function_exists('acf_add_options_page')) {\n    acf_add_options_page([\n        'page_title' => 'Site Settings',\n        'menu_title' => 'Site Settings',\n        'menu_slug'  => 'site-settings',\n        'capability' => 'edit_posts',\n        'redirect'   => false,\n    ]);\n}\n</code></pre>\n<h2>ACF + Elementor Pro Dynamic Tags</h2>\n<ol>\n<li>Elementor widget > click Dynamic Data icon</li>\n<li>Select \"ACF Field\"</li>\n<li>Choose field name</li>\n<li>Works with: text, image, URL, color, number field types</li>\n</ol>\n<h2>ACF JSON Sync (Version Control)</h2>\n<pre><code class=\"language-php\">// Save field groups as JSON files in theme\nadd_filter('acf/settings/save_json', function() {\n    return get_stylesheet_directory() . '/acf-json';\n});\n\n// Load field groups from JSON\nadd_filter('acf/settings/load_json', function($paths) {\n    $paths[] = get_stylesheet_directory() . '/acf-json';\n    return $paths;\n});\n</code></pre>\n<p>Commit <code>/acf-json/</code> directory to git. Field groups sync automatically across environments.</p>\n"}