Hello CStaff,
You may be using the {{dc:post:title id="{{dc:acf:field key='review_product'}}"}} dynamic content incorrectly. Take note that you have:
Slider Container - Looper Provider Custom `review_slides`
Slide - Looper Consumer
Group - Looper Provider Custom `reviews_for_slide`
Review - Looper Consumer
As for the reviews for slides function;
// 2) Return exactly 2 reviews for a given slide number
add_filter('cs_looper_custom_reviews_for_slide', function ($items, $args) {
$cpt = 'review'; // <-- your CPT slug
$per = 2;
$page = isset($args['page']) ? max(1, (int) $args['page']) : 1;
$off = ($page - 1) * $per;
return get_posts([
'post_type' => $cpt,
'posts_per_page' => $per,
'offset' => $off,
'orderby' => 'date',
'order' => 'DESC',
'post_status' => 'publish',
'ignore_sticky_posts' => true,
]);
}, 10, 2);
This will already return post object which means that you do not need to use the {{dc:post:title id="{{dc:acf:field key='review_product'}}"}}. You only need this if you want to display specific post data WITHOUT using a looper. In your use case, the review_product field SHOULD return an ID because that is what is needed by the {{dc:post:title id="123"}} dynamic content.
#1] Dynamic Content supports ACF Post Object fields. The POST ID return format is needed depending on which dynamic content parameter you used it.
#2] Yes, there is. When the ACF field returns a Post Object, you will have to use a Looper Provider Dynamic Content {{dc:acf:field key='review_product'}}. Therefore, your element structure will now becomes:
Slider Container - Looper Provider Custom `review_slides`
Slide - Looper Consumer
Group - Looper Provider Custom `reviews_for_slide`
Review - Looper Consumer
DIV - Looper Provider Dynamic Content `{{dc:acf:field key='review_product'}}`
DIV - Looper Consumer
Headline - {{dc:post:title}}
Image - {{dc:post:thumbnail}}
#3] I do not think there is a need to improve here because the {{dc:post:title id="123"}} is pretty much straightforward that it needs the ID value. And this {{dc:acf:field key='field_name'}} dynamic content will always return whatever the return format is set for the field.
Hope this makes sense.