• Resolved ahmedraja458

    (@ahmedraja458)


    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">&larr;</button>
    <button class="nav-next">&rarr;</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">&larr;</button>
    <button class="nav-next">&rarr;</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();
    });


Viewing 1 replies (of 1 total)
Viewing 1 replies (of 1 total)

The topic ‘Formiantor forms to testimonail’ is closed to new replies.