ACF Repeater Shortcode Template
November 24, 2024 · AI Conversations
{
global $post;
ob_start();
$output = ob_get_clean();
return $output;
}
add_shortcode('place_acf_fields','place_acf_fields_display_frontend');
get acf repeater field
with seprate template file
### Step 1: Create the Template File
1. **Create a Template File**
Save a new template file in your theme directory (e.g., `acf-repeater-template.php`).
Example content for the file:
<?php
// Ensure this file is being accessed correctly
if (!defined('ABSPATH')) {
exit; // Exit if accessed directly
}
// Get the Repeater Field
if (have_rows('your_repeater_field', $post->ID)): ?>
<div class="acf-repeater">
<?php while (have_rows('your_repeater_field', $post->ID)): the_row(); ?>
<div class="acf-repeater-item">
<h3><?php the_sub_field('sub_field_name'); ?></h3>
<p><?php the_sub_field('another_sub_field_name'); ?></p>
</div>
<?php endwhile; ?>
</div>
<?php else: ?>
<p>No items found.</p>
<?php endif; ?>
Replace `your_repeater_field`, `sub_field_name`, and `another_sub_field_name` with the names of your actual ACF Repeater field and its subfields.
### Step 2: Update the Shortcode Function
Modify your shortcode function to include the template file:
function place_acf_fields_display_frontend()
{
global $post;
// Buffer output
ob_start();
// Include the template file
$template_file = get_template_directory() . '/acf-repeater-template.php';
if (file_exists($template_file)) {
include $template_file;
} else {
echo '<p>Template file not found.</p>';
}
// Capture and return output
return ob_get_clean();
}
add_shortcode('place_acf_fields', 'place_acf_fields_display_frontend');
### Step 3: Use the Shortcode
Add the `[place_acf_fields]` shortcode to any page, post, or widget where you want to display the ACF Repeater content.
### Explanation
1. **ACF Template File**: The `acf-repeater-template.php` contains the logic for displaying the Repeater field's data.
2. **Shortcode**: The shortcode function loads the template file, processes the Repeater field, and outputs the content.
3. **Flexibility**: This setup allows you to keep your logic clean and separate while making it easy to reuse the Repeater field display.
Let me know if you need further customization!
### Step 1: Set Up the Radio Button Field
1. **Create a Radio Button Field in ACF**:
– Go to your ACF field group and add a new field of type **Radio Button**.
– Add choices as `value : label`. For example:
option1 : Option One
option2 : Option Two
option3 : Option Three
Here:
– `value` (e.g., `option1`) is what gets stored in the database.
– `label` (e.g., `Option One`) is what you want to display.
2. Save the field group.
—
### Step 2: Fetch the Radio Button Label in PHP
ACF provides a function to get the **label** of a selected radio button. Use `get_field_object()` to retrieve the label associated with the stored value.
$radio_field = get_field_object('your_radio_field_name');
$radio_value = $radio_field['value']; // The stored value (e.g., 'option1')
$radio_label = $radio_field['choices'][$radio_value]; // The corresponding label
—
### Step 3: Update Your Template Code
Modify your ACF template file (e.g., `acf-repeater-template.php`) to display the radio button label.
Example for a Repeater field:
<?php
// Ensure this file is being accessed correctly
if (!defined('ABSPATH')) {
exit; // Exit if accessed directly
}
if (have_rows('your_repeater_field', $post->ID)): ?>
<div class="acf-repeater">
<?php while (have_rows('your_repeater_field', $post->ID)): the_row();
// Get the radio field
$radio_field = get_sub_field_object('your_radio_field_name'); // Replace with your field name
$radio_value = $radio_field['value']; // The stored value
$radio_label = $radio_field['choices'][$radio_value]; // The corresponding label
?>
<div class="acf-repeater-item">
<h3>Selected Option:</h3>
<p><?php echo esc_html($radio_label); // Display the label ?></p>
</div>
<?php endwhile; ?>
</div>
<?php else: ?>
<p>No items found.</p>
<?php endif; ?>
—
### Key Points
1. **Stored Value**: ACF stores the **value** (e.g., `option1`).
2. **Displayed Label**: Use `get_field_object()` or `get_sub_field_object()` to map the value to its label.
3. **Use `esc_html()`**: Always sanitize output to prevent potential XSS issues.
—
### Example Output
For a stored value of `option2`, the displayed label would be `Option Two`.
This method ensures that your frontend shows the radio button's label instead of its value. Let me know if you need further assistance!
—
### Using `get_field()`
`get_field()` retrieves the value of an ACF field but does not output it. You can assign it to a variable or manipulate it as needed.
**Example**:
$value = get_field('your_field_name'); // Replace 'your_field_name' with your actual field name
if ($value) {
echo $value; // Outputs the field value
}
—
### Using `the_field()`
`the_field()` retrieves the value and immediately outputs it. Use this if you don’t need to process the value.
**Example**:
the_field('your_field_name'); // Replace 'your_field_name' with your actual field name
—
### Contextual Example
If the ACF field is attached to a specific post (e.g., inside a loop or on a single post page):
$value = get_field('your_field_name', get_the_ID()); // Use get_the_ID() to fetch the value for the current post
if ($value) {
echo $value;
}
For options pages or custom locations, pass the location as the second parameter:
$value = get_field('your_field_name', 'option'); // For fields stored in an options page
if ($value) {
echo $value;
}
—
### Display Example in a Template
To display the value of an ACF field in your WordPress template:
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<h2><?php the_title(); ?></h2>
<p>ACF Field Value: <?php the_field('your_field_name'); ?></p>
<?php endwhile; endif; ?>
—
### Key Notes
1. **Field Name**: Replace `your_field_name` with the actual field name defined in ACF.
2. **Default Value**: If a field might not have a value, provide a fallback:
$value = get_field('your_field_name') ?: 'Default Value';
echo $value;
3. **Sanitization**: Always sanitize output if needed, especially if the value comes from user input:
echo esc_html($value);
Let me know if you need more help!
### Example: Fetch and Display Radio Button Label
Here’s how you can retrieve and display the label for a simple radio button field:
<?php
// Get the field object for the radio button field
$field = get_field_object('your_radio_field_name'); // Replace with your field name
if ($field) {
$value = $field['value']; // The stored value (e.g., 'option1')
$label = $field['choices'][$value]; // The corresponding label (e.g., 'Option One')
if ($label) {
echo '<p>Selected Option: ' . esc_html($label) . '</p>'; // Display the label
} else {
echo '<p>No option selected.</p>';
}
} else {
echo '<p>Field not found.</p>';
}
?>
### Explanation
1. **`get_field_object()`**: Fetches the entire field object, including the `choices` array (value-label pairs).
2. **`$field['value']`**: The stored value (e.g., `option1`).
3. **`$field['choices'][$value]`**: Maps the stored value to its label (e.g., `Option One`).
4. **`esc_html()`**: Sanitizes the label for safe output.
—
### Inside a Repeater Field
If the radio button field is inside a Repeater field, use `get_sub_field_object()` instead:
<?php if (have_rows('your_repeater_field')): ?>
<?php while (have_rows('your_repeater_field')): the_row(); ?>
<?php
// Get the subfield object for the radio button field
$field = get_sub_field_object('your_radio_field_name'); // Replace with your subfield name
if ($field) {
$value = $field['value']; // The stored value
$label = $field['choices'][$value]; // The corresponding label
if ($label) {
echo '<p>Selected Option: ' . esc_html($label) . '</p>';
} else {
echo '<p>No option selected.</p>';
}
}
?>
<?php endwhile; ?>
<?php endif; ?>
—
### Display Example in a Template
Use this in your WordPress theme file, such as `single.php`, `page.php`, or a custom template:
<p>Selected Label: <?php echo esc_html($label); ?></p>
### Output
For a radio button field with the following choices:
option1 : Option One
option2 : Option Two
option3 : Option Three
If `option2` is selected, the displayed label will be:
Selected Option: Option Two
Let me know if you need more help!
repeater services_offered not showing
—
### 1. **Check the Field Name**
Ensure that the **exact name** of the Repeater field is `services_offered`. Field names in ACF are case-sensitive.
#### Solution:
Go to the ACF admin interface and verify the field name. Replace `services_offered` with the correct name if necessary:
if (have_rows('actual_field_name', $post->ID)):
—
### 2. **Verify That Data Exists**
Confirm that the `services_offered` field has rows of data for the current post.
#### Test Code:
Add this snippet before your `have_rows()` check to debug:
echo '<pre>';
print_r(get_field('services_offered', $post->ID));
echo '</pre>';
– If the output is empty or `null`, it means the Repeater field has no data for the current post.
– If data exists, the structure will show rows with their respective subfields.
—
### 3. **Check the `$post` Variable**
Ensure the `$post` variable contains the correct post object. In some templates (like archive or custom queries), `$post` might not be set correctly.
#### Solution:
Use `get_the_ID()` instead of `$post->ID`:
if (have_rows('services_offered', get_the_ID())):
—
### 4. **Validate Subfields**
Check that the subfields `service_name`, `service_description`, `service_timing`, and `virtual_or_in_person` exist in the Repeater field. If any subfield is missing or misnamed, it will cause issues.
#### Solution:
Use `get_sub_field()` to confirm each subfield’s data:
while (have_rows('services_offered', get_the_ID())): the_row();
echo '<pre>';
print_r(get_sub_field('service_name'));
echo '</pre>';
endwhile;
—
### 5. **Fix the `get_field_object` Usage**
The issue could be with fetching the `virtual_or_in_person` radio button label inside the Repeater. `get_field_object()` fetches the main field metadata, but in a Repeater context, you need to use `get_sub_field_object()`.
#### Updated Code for Radio Button:
Replace:
$radio_field = get_field_object('virtual_or_in_person');
With:
$radio_field = get_sub_field_object('virtual_or_in_person');
—
### Updated Template Code
Here’s the corrected and optimized version of your code:
<?php
// Ensure this file is being accessed correctly
if (!defined('ABSPATH')) {
exit; // Exit if accessed directly
}
// Get the Repeater Field
if (have_rows('services_offered', get_the_ID())): ?>
<h4><?php echo __('Services', 'twentytwentyfourchild'); ?></h4>
<div class="acf-repeater">
<table>
<tr>
<th><?php echo __('Service name', 'twentytwentyfourchild'); ?></th>
<th><?php echo __('Service description', 'twentytwentyfourchild'); ?></th>
<th><?php echo __('Service Timing', 'twentytwentyfourchild'); ?></th>
<th><?php echo __('Virtual or In Person?', 'twentytwentyfourchild'); ?></th>
</tr>
<?php while (have_rows('services_offered', get_the_ID())): the_row();
$radio_field = get_sub_field_object('virtual_or_in_person'); // Use get_sub_field_object
$radio_value = $radio_field['value']; // The stored value (e.g., 'option1')
$radio_label = $radio_field['choices'][$radio_value]; // Get the label
?>
<tr class="acf-repeater-item">
<td><?php the_sub_field('service_name'); ?></td>
<td><?php the_sub_field('service_description'); ?></td>
<td><?php the_sub_field('service_timing'); ?></td>
<td><?php echo esc_html($radio_label); ?></td>
</tr>
<?php endwhile; ?>
</table>
</div>
<?php else: ?>
<p><?php echo __('No Service found', 'twentytwentyfourchild'); ?>.</p>
<?php endif; ?>
—
### Additional Debugging Steps
1. **View/Edit Post in Admin**:
Check if the `services_offered` Repeater field has data populated in the ACF editor for the current post.
2. **Ensure the Field Group Is Assigned**:
Confirm that the ACF field group containing `services_offered` is assigned to the correct post type/template in ACF settings.
3. **Check for Errors**:
Enable WordPress debugging in `wp-config.php` to see if there are any PHP warnings or errors:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
—
Let me know if the issue persists or if further clarification is needed!
—
### Step 1: Debugging the Subfields
Add a debugging block inside the `while` loop to check what data is being returned for each row and its subfields.
if (have_rows('services_offered', get_the_ID())):
while (have_rows('services_offered', get_the_ID())): the_row();
echo '<pre>';
print_r(get_sub_field('service_name')); // Replace with your subfield names
print_r(get_sub_field('service_description'));
print_r(get_sub_field('service_timing'));
print_r(get_sub_field('virtual_or_in_person'));
echo '</pre>';
endwhile;
endif;
– If the subfields return `null` or empty, it means either:
– The subfield names in the code do not match the names defined in ACF.
– The subfields do not have data in the admin panel for those rows.
—
### Step 2: Verify Subfield Names
Go to the ACF editor and double-check the exact subfield names for `service_name`, `service_description`, `service_timing`, and `virtual_or_in_person`. A common mistake is using a **label** instead of the **field name**.
– Ensure the subfield names in your code match those in ACF.
– Update the `the_sub_field()` and
print_r(get_field('services_offered', $post->ID));
echo '';
this return number of items 3
—
### Step 1: Test the Repeater Structure
Replace your current code with a test script to see the exact structure of the Repeater field data:
<?php
echo '<pre>';
$repeater_field = get_field('services_offered', $post->ID);
print_r($repeater_field);
echo '</pre>';
– This will display the full array of the Repeater field data.
– Verify that the subfields (`service_name`, `service_description`, `service_timing`, and `virtual_or_in_person`) exist within this array and check their exact names.
—
### Step 2: Fix Subfield Access
Once you’ve confirmed the data structure, adjust your code to correctly access the subfields.
#### Example
If the data structure looks like this:
Array
(
[0] => Array
(
[service_name] => Service 1
[service_description] => Description 1
[service_timing] => 10:00 AM - 4:00 PM
[virtual_or_in_person] => option1
)
[1] => Array
(
[service_name] => Service 2
[service_description] => Description 2
[service_timing] => 12:00 PM - 6:00 PM
[virtual_or_in_person] => option2
)
[2] => Array
(
[service_name] => Service 3
[service_description] => Description 3
[service_timing] => 2:00 PM - 8:00 PM
[virtual_or_in_person] => option3
)
)
The correct way to loop through and display the Repeater field is:
<?php
$services = get_field('services_offered', $post->ID);
if ($services && is_array($services)): ?>
<h4><?php echo __('Services', 'twentytwentyfourchild'); ?></h4>
<div class="acf-repeater">
<table>
<tr>
<th><?php echo __('Service name', 'twentytwentyfourchild'); ?></th>
<th><?php echo __('Service description', 'twentytwentyfourchild'); ?></th>
<th><?php echo __('Service Timing', 'twentytwentyfourchild'); ?></th>
<th><?php echo __('Virtual or In Person?', 'twentytwentyfourchild'); ?></th>
</tr>
<?php foreach ($services as $service): ?>
<tr class="acf-repeater-item">
<td><?php echo esc_html($service['service_name']); ?></td>
<td><?php echo esc_html($service['service_description']); ?></td>
<td><?php echo esc_html($service['service_timing']); ?></td>
<td>
<?php
$choices = [
'option1' => 'Virtual',
'option2' => 'In Person',
'option3' => 'Both'
];
echo esc_html($choices[$service['virtual_or_in_person']] ?? 'Unknown');
?>
</td>
</tr>
<?php endforeach; ?>
</table>
</div>
<?php else: ?>
<p><?php echo __('No Service found', 'twentytwentyfourchild'); ?>.</p>
<?php endif; ?>
—
### Step 3: Handle Radio Labels
In the example above:
– Replace `option1`, `option2`, etc., with your actual values from the Repeater field.
– Update the `$choices` array to map those values to labels (e.g., `Virtual`, `In Person`, etc.).
—
### Step 4: Additional Debugging
If you’re still having issues:
1. Confirm the ACF field group is assigned to the correct post type or page.
2. Double-check the `$post` variable or use `get_the_ID()` instead:
$services = get_field('services_offered', get_the_ID());
3. Enable WordPress debugging in `wp-config.php`:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
This will help log errors that might provide clues.
Let me know how it works!
—
### 1. **Verify Subfield Names**
Ensure that the subfield names in your code exactly match the subfield names defined in ACF. Subfield names are case-sensitive and should match the **field name** (not the label).
#### Solution:
Go to **Custom Fields > Field Group** in the WordPress admin panel, find your `services_offered` Repeater field, and confirm the **field names** of:
– `service_name`
– `service_description`
– `service_timing`
– `virtual_or_in_person`
If they differ (e.g., `ServiceName` or `serviceName`), update your code to use the correct names.
—
### 2. **Debug Subfield Values**
Add the following debug code inside the `while (have_rows())` loop to check what data is being retrieved for each row:
if (have_rows('services_offered', get_the_ID())):
while (have_rows('services_offered', get_the_ID())): the_row();
echo '<pre>';
print_r(get_sub_field('service_name')); // Replace with other subfield names to test
print_r(get_sub_field('service_description'));
print_r(get_sub_field('service_timing'));
print_r(get_sub_field('virtual_or_in_person'));
echo '</pre>';
endwhile;
endif;
If these return `null` or empty, the issue lies in either:
1. **The subfield names are incorrect.**
2. **The rows don't contain any data.**
—
### 3. **Test Subfields Outside the Loop**
Sometimes, the loop might not behave as expected due to how ACF handles nested queries. To test subfield values outside the loop, directly retrieve the Repeater field as an array:
$services = get_field('services_offered', get_the_ID());
if ($services && is_array($services)) {
echo '<pre>';
print_r($services); // Outputs the entire array
echo '</pre>';
}
If this displays the data structure, you can access subfields like this:
echo esc_html($services[0]['service_name']); // Access the first row's 'service_name'
—
### 4. **Correct Template for Repeater Loop**
Here's an updated version of your template with proper handling of subfields:
<?php
if (have_rows('services_offered', get_the_ID())): ?>
<h4><?php echo __('Services', 'twentytwentyfourchild'); ?></h4>
<div class="acf-repeater">
<table>
<tr>
<th><?php echo __('Service name', 'twentytwentyfourchild'); ?></th>
<th><?php echo __('Service description', 'twentytwentyfourchild'); ?></th>
<th><?php echo __('Service Timing', 'twentytwentyfourchild'); ?></th>
<th><?php echo __('Virtual or In Person?', 'twentytwentyfourchild'); ?></th>
</tr>
<?php while (have_rows('services_offered', get_the_ID())): the_row(); ?>
<tr class="acf-repeater-item">
<td><?php the_sub_field('service_name'); ?></td>
<td><?php the_sub_field('service_description'); ?></td>
<td><?php the_sub_field('service_timing'); ?></td>
<td>
<?php
$radio_field = get_sub_field_object('virtual_or_in_person');
$radio_value = $radio_field['value']; // The stored value
$radio_label = $radio_field['choices'][$radio_value]; // Get the label
echo esc_html($radio_label);
?>
</td>
</tr>
<?php endwhile; ?>
</table>
</div>
<?php else: ?>
<p><?php echo __('No Service found', 'twentytwentyfourchild'); ?>.</p>
<?php endif; ?>
—
### 5. **Check Field Group Assignment**
Ensure that the ACF field group containing the `services_offered` Repeater is assigned to the correct post type or template:
1. Go to **Custom Fields > Field Groups**.
2. Check the **Location Rules**. For example, confirm the group is assigned to:
– The correct post type (e.g., "Post" or "Page").
– Specific posts or templates, if applicable.
—
### 6. **Permissions or Corrupted Data**
If everything seems correct but subfields still aren't working:
1. **Resave the Post**: Edit the post in the WordPress admin and re-save it. This can sometimes refresh and save the field data.
2. **Revalidate Field Group**:
– Go to the ACF field group, make any minor change (like renaming a field temporarily), and save it.
3. **Check Database Data**:
Run the following query to verify that data for the Repeater and its subfields exists in the database (`wp_postmeta` table):
SELECT * FROM wp_postmeta WHERE post_id = YOUR_POST_ID AND meta_key LIKE 'services_offered%';
Replace `YOUR_POST_ID` with the ID of the post you're testing.
—
### 7. **Enable Debugging**
If the above steps don't resolve the issue, enable debugging to catch potential errors:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
Then check the debug log (`/wp-content/debug.log`) for any errors related to ACF or your template.
—
Let me know if any of these steps resolve the issue!
and sub fields "servicename,description"
—
### Correct Implementation for Repeater Fields
<?php
// Check if the Repeater field has rows
if (have_rows('services_offered', get_the_ID())): ?>
<h4><?php echo __('Services Offered', 'twentytwentyfourchild'); ?></h4>
<div class="acf-repeater">
<table>
<tr>
<th><?php echo __('Service Name', 'twentytwentyfourchild'); ?></th>
<th><?php echo __('Description', 'twentytwentyfourchild'); ?></th>
</tr>
<?php
// Loop through each row in the Repeater field
while (have_rows('services_offered', get_the_ID())): the_row(); ?>
<tr class="acf-repeater-item">
<td><?php the_sub_field('servicename'); ?></td>
<td><?php the_sub_field('description'); ?></td>
</tr>
<?php endwhile; ?>
</table>
</div>
<?php else: ?>
<p><?php echo __('No services found.', 'twentytwentyfourchild'); ?></p>
<?php endif; ?>
—
### How It Works
1. **`have_rows('services_offered')`:**
– Checks if the Repeater field has rows for the current post.
2. **`while (have_rows())`:**
– Loops through each row of the Repeater field.
3. **`the_row()`:**
– Prepares the current row for accessing subfields.
4. **`the_sub_field('servicename')` & `the_sub_field('description')`:**
– Fetches and outputs the values of the subfields `servicename` and `description`.
—
### Debugging If Not Working
1. **Verify Field Names in ACF**:
– Go to **Custom Fields > Field Groups** and ensure:
– The Repeater field is named `services_offered`.
– Subfields are named `servicename` and `description` (case-sensitive).
2. **Debug Output**:
Replace the table code with debug output to check if data is being retrieved:
if (have_rows('services_offered', get_the_ID())):
while (have_rows('services_offered', get_the_ID())): the_row();
echo '<pre>';
print_r(get_sub_field('servicename')); // Check service name
print_r(get_sub_field('description')); // Check description
echo '</pre>';
endwhile;
endif;
3. **Verify Data in Admin Panel**:
– Confirm the post you're testing has rows added to the `services_offered` Repeater and that both `servicename` and `description` contain values.
4. **Check Database**:
Run a query in the database to confirm data is saved for `services_offered`:
SELECT * FROM wp_postmeta WHERE post_id = YOUR_POST_ID AND meta_key LIKE 'services_offered%';
Replace `YOUR_POST_ID` with the post ID.
—
### Additional Notes
If the field group is assigned conditionally (e.g., only to specific post types or templates), ensure you're testing with the correct post. Use `get_the_ID()` to fetch the current post's ID dynamically.
Let me know if this resolves the issue or if you encounter further problems!
### 1. **Accessing the Repeater Field and Subfields**
You should use `get_field()` to retrieve the Repeater field and loop through it using `have_rows()`. To access the subfields within each row, use `the_sub_field()` or `get_sub_field()`.
### Correct Code Example
<?php
// Check if there are rows in the Repeater field
if (have_rows('services_offered', get_the_ID())): ?>
<h4><?php echo __('Services', 'twentytwentyfourchild'); ?></h4>
<div class="acf-repeater">
<table>
<tr>
<th><?php echo __('Service Name', 'twentytwentyfourchild'); ?></th>
<th><?php echo __('Description', 'twentytwentyfourchild'); ?></th>
</tr>
<?php
// Loop through the rows of the Repeater field
while (have_rows('services_offered', get_the_ID())): the_row();
// Retrieve the subfields
$servicename = get_sub_field('servicename');
$description = get_sub_field('description');
?>
<tr>
<td><?php echo esc_html($servicename); ?></td>
<td><?php echo esc_html($description); ?></td>
</tr>
<?php endwhile; ?>
</table>
</div>
<?php else: ?>
<p><?php echo __('No Services found', 'twentytwentyfourchild'); ?>.</p>
<?php endif; ?>
### Explanation:
– `have_rows('services_offered', get_the_ID())`: Checks if there are any rows in the `services_offered` Repeater field for the current post.
– `the_row()`: Moves to the next row in the Repeater.
– `get_sub_field('servicename')`: Retrieves the value of the `servicename` subfield for the current row.
– `get_sub_field('description')`: Retrieves the value of the `description` subfield for the current row.
– `esc_html()`: This function ensures the values are properly escaped for safe output.
### 2. **Debugging**
If it's still not showing, try debugging by printing the Repeater field’s data:
<?php
// Debug: Print the entire Repeater field
$services = get_field('services_offered', get_the_ID());
echo '<pre>';
print_r($services);
echo '</pre>';
This will show you the exact structure of the data and help confirm the subfield names. The data should be an array where each item corresponds to a row in the Repeater, and each row should have `servicename` and `description` keys.
—
### 3. **Check Field Names**
Ensure that the field names in your code (`servicename` and `description`) exactly match the names set in the ACF field group. Field names are case-sensitive, so they must match exactly.
—
### 4. **Check Field Group Location**
Verify that the field group is assigned to the correct post type (e.g., `Post`, `Page`, or a custom post type) and that it's displayed on the right page.
—
### 5. **Advanced Custom Fields Debugging**
To further debug, check if the `services_offered` field exists in the `wp_postmeta` table for the post you're working with. You can run a SQL query like this to verify that data is correctly saved:
SELECT * FROM wp_postmeta WHERE post_id = YOUR_POST_ID AND meta_key = 'services_offered';
—
### Final Result
With the correct field names and a properly structured template, the services should display in a table. If everything is set up correctly, the output will look something like:
| Service Name | Description |
|—————–|—————–|
| Service 1 | Description 1 |
| Service 2 | Description 2 |
—
Let me know if you need further assistance!