Replies: 1
I wanted to created a widget that pulls data submited in forminator through a specific form but the code i have is not working i need some help to find where i could be wrong
here is the code i have:
<?php
// Register shortcode for custom testimonial widget
define('FORMINATOR_FORM_ID', 7673);
add_shortcode('custom_testimonial_widget', function () {
global $wpdb;
// Define Forminator tables
$entry_table = $wpdb->prefix . 'frmt_form_entry';
$meta_table = $wpdb->prefix . 'frmt_form_entry_meta';
// Fetch the latest 5 entries for the specified form ID
$entries = $wpdb->get_results($wpdb->prepare(
"SELECT
em1.meta_value AS name,
em2.meta_value AS designation,
em3.meta_value AS review,
em4.meta_value AS image_url
FROM {$entry_table} e
INNER JOIN {$meta_table} em1 ON e.id = em1.entry_id
INNER JOIN {$meta_table} em2 ON e.id = em2.entry_id
INNER JOIN {$meta_table} em3 ON e.id = em3.entry_id
INNER JOIN {$meta_table} em4 ON e.id = em4.entry_id
WHERE e.form_id = %d
AND em1.meta_key = 'name-1'
AND em2.meta_key = 'text-1'
AND em3.meta_key = 'textarea-1'
AND em4.meta_key = 'upload-1'
ORDER BY e.id DESC
LIMIT 5",
FORMINATOR_FORM_ID
));
// If no entries found, display a message
if (empty($entries)) {
return '<p>No testimonials found for this form.</p>';
}
// Render the testimonials in a slider
ob_start();
?>
<div class="custom-testimonial-slider">
<?php foreach ($entries as $entry): ?>
<div class="testimonial-item">
<p class="testimonial-text">"<?php echo esc_html($entry->review); ?>"</p>
<hr />
<div class="testimonial-author">
<img class="author-photo" src="<?php echo esc_url($entry->image_url); ?>" alt="<?php echo esc_attr($entry->name); ?>">
<div class="author-info">
<h4 class="author-name"><?php echo esc_html($entry->name); ?></h4>
<p class="author-position"><?php echo esc_html($entry->designation); ?></p>
</div>
</div>
</div>
<?php endforeach; ?>
<div class="testimonial-nav">
<button class="nav-prev">←</button>
<button class="nav-next">→</button>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
const slider = document.querySelector('.custom-testimonial-slider');
const items = slider.querySelectorAll('.testimonial-item');
const prevButton = slider.querySelector('.nav-prev');
const nextButton = slider.querySelector('.nav-next');
let currentIndex = 0;
function updateSlider() {
items.forEach((item, index) => {
item.style.display = index === currentIndex ? 'block' : 'none';
});
}
prevButton.addEventListener('click', function () {
currentIndex = (currentIndex - 1 + items.length) % items.length;
updateSlider();
});
nextButton.addEventListener('click', function () {
currentIndex = (currentIndex + 1) % items.length;
updateSlider();
});
updateSlider();
});
</script>
<style>
.custom-testimonial-slider {
max-width: 800px;
margin: 0 auto;
text-align: center;
}
.testimonial-item {
display: none;
}
.testimonial-text {
font-size: 1.2rem;
margin-bottom: 1rem;
}
.testimonial-author {
display: flex;
align-items: center;
justify-content: center;
margin-top: 1rem;
}
.author-photo {
width: 50px;
height: 50px;
border-radius: 50%;
margin-right: 1rem;
}
.author-name {
font-weight: bold;
}
.author-position {
color: gray;
font-size: 0.9rem;
}
.testimonial-nav {
margin-top: 1rem;
}
.nav-prev, .nav-next {
background-color: #0073e6;
color: #fff;
border: none;
padding: 0.5rem 1rem;
cursor: pointer;
font-size: 1rem;
margin: 0 0.5rem;
}
.nav-prev:hover, .nav-next:hover {
background-color: #005bb5;
}
</style>
<?php
return ob_get_clean();
// Define Forminator tables
$entry_table = $wpdb->prefix . 'frmt_form_entry';
$meta_table = $wpdb->prefix . 'frmt_form_entry_meta';
// Fetch the latest 5 entries for the specified form ID
$entries = $wpdb->get_results($wpdb->prepare(
"SELECT
em1.meta_value AS name,
em2.meta_value AS designation,
em3.meta_value AS review,
em4.meta_value AS image_url
FROM {$entry_table} e
INNER JOIN {$meta_table} em1 ON e.id = em1.entry_id
INNER JOIN {$meta_table} em2 ON e.id = em2.entry_id
INNER JOIN {$meta_table} em3 ON e.id = em3.entry_id
INNER JOIN {$meta_table} em4 ON e.id = em4.entry_id
WHERE e.form_id = %d
AND em1.meta_key = 'name-1'
AND em2.meta_key = 'text-1'
AND em3.meta_key = 'textarea-1'
AND em4.meta_key = 'upload-1'
ORDER BY e.id DESC
LIMIT 5",
FORMINATOR_FORM_ID
));
// If no entries found, display a message
if (empty($entries)) {
return '<p>No testimonials found for this form.</p>';
}
// Render the testimonials in a slider
ob_start();
?>
<div class="custom-testimonial-slider">
<?php foreach ($entries as $entry): ?>
<div class="testimonial-item">
<p class="testimonial-text">"<?php echo esc_html($entry->review); ?>"</p>
<hr />
<div class="testimonial-author">
<img class="author-photo" src="<?php echo esc_url($entry->image_url); ?>" alt="<?php echo esc_attr($entry->name); ?>">
<div class="author-info">
<h4 class="author-name"><?php echo esc_html($entry->name); ?></h4>
<p class="author-position"><?php echo esc_html($entry->designation); ?></p>
</div>
</div>
</div>
<?php endforeach; ?>
<div class="testimonial-nav">
<button class="nav-prev">←</button>
<button class="nav-next">→</button>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
const slider = document.querySelector('.custom-testimonial-slider');
const items = slider.querySelectorAll('.testimonial-item');
const prevButton = slider.querySelector('.nav-prev');
const nextButton = slider.querySelector('.nav-next');
let currentIndex = 0;
function updateSlider() {
items.forEach((item, index) => {
item.style.display = index === currentIndex ? 'block' : 'none';
});
}
prevButton.addEventListener('click', function () {
currentIndex = (currentIndex - 1 + items.length) % items.length;
updateSlider();
});
nextButton.addEventListener('click', function () {
currentIndex = (currentIndex + 1) % items.length;
updateSlider();
});
updateSlider();
});
</script>
<style>
.custom-testimonial-slider {
max-width: 800px;
margin: 0 auto;
text-align: center;
}
.testimonial-item {
display: none;
}
.testimonial-text {
font-size: 1.2rem;
margin-bottom: 1rem;
}
.testimonial-author {
display: flex;
align-items: center;
justify-content: center;
margin-top: 1rem;
}
.author-photo {
width: 50px;
height: 50px;
border-radius: 50%;
margin-right: 1rem;
}
.author-name {
font-weight: bold;
}
.author-position {
color: gray;
font-size: 0.9rem;
}
.testimonial-nav {
margin-top: 1rem;
}
.nav-prev, .nav-next {
background-color: #0073e6;
color: #fff;
border: none;
padding: 0.5rem 1rem;
cursor: pointer;
font-size: 1rem;
margin: 0 0.5rem;
}
.nav-prev:hover, .nav-next:hover {
background-color: #005bb5;
}
</style>
<?php
return ob_get_clean();
});