Используйте AJAX для получения миниатюры текущего поста в WordPress при загрузке через медиагрузчик на фронтенде.

Вопрос или проблема

Я использую загрузчик медиафайлов WordPress на фронтенде, чтобы пользователи могли загружать миниатюры для своего сайта UGC. Я также отображаю предварительный просмотр изображения на фронтенде. Когда пользователь нажимает кнопку, открывается загрузчик медиафайлов, пользователь загружает изображение, устанавливает его как выделенное изображение, и всё готово. Но предварительный просмотр изображения всё еще показывает старое изображение.

У меня есть сайт на WordPress, основанный на контенте, созданном пользователями, где люди могут создавать посты через форму на фронтенде.

Когда пользователь обновляет выделенное изображение на фронтенде с помощью загрузчика медиафайлов, как мне обновить предварительный просмотр новым изображением?

Ниже представлен код для загрузчика медиафайлов, который пользователи используют для загрузки выделенного изображения:

            $uparms="?post_id=" . $post_id;
            $uparms .= '&' . 'type=image';
            $uparms .= '&' . 'TB_iframe=1';
            //$uparms .= '&'.'inline=1';
            $uparms .= '&' . 'tab=library';

echo '<a class="Thumbnail-Upload-Button thickbox"  title="' . __("Выбрать выделенное изображение") . '" href="' . site_url('/wp-admin/media-upload.php') . $uparms . '" id="frontier-post-select-thumbnail set-post-thumbnail" name="set-post-thumbnail"></div>';

Ниже представлен код, который я использую для предварительного просмотра изображения.

echo '<img class="milyin-field milyin-thumbnail-true" align="center" style="padding:0 !Important; width:100vw;  min-height:250px; object-fit:contain; " src="';
echo get_the_post_thumbnail_url($post_id, 'hestia_blogs', array(
                                                          'class' => 'milyin-post-feat-img'
                                                         ));
echo '"> ';

Теперь приходит трудная часть

Теперь я хочу реализовать код на JS, который автоматически обновляет предварительный просмотр миниатюры, когда мы обновляем само выделенное изображение.

Я использую WordPress Thickbox для появления загрузчика медиафайлов, поэтому, на мой взгляд, лучшая стратегия будет заключаться в том, чтобы проверять каждый раз, когда Thickbox закрывается, JS проверяет сервер и находит URL миниатюры, а затем вставляет этот URL в атрибут “SRC” моего предварительного просмотра <img class="milyin-thumbnail-true" />

Пожалуйста, помогите мне реализовать это или предложите другую, по вашему мнению, лучшую стратегию.

Я использую сильно модифицированную версию плагина Frontier Post для WordPress…

Кнопка, закрывающая Thickbox, имеет class="tb-close-icon", поэтому при нажатии на эту кнопку нам нужно получить URL миниатюры текущего поста…

Моя ссылка на сайт: 17 секретов, как я оптимизировал свой сайт на WordPress для загрузки за 927 мс (100% GTMetrix)

Итак,

Вопросе вы указали, что код должен выполняться при закрытии thickbox.

Мы можем решить вашу проблему двумя способами: первый — это проверять изменение URL миниатюры каждые x секунд и обновлять изображение, если URL меняется, это работает хорошо, но требует много данных, поэтому я не могу это рекомендовать.

Второй способ — использовать событие закрытия thickbox, чтобы каждый раз при закрытии thickbox запускать AJAX-запрос, который возвращает URL миниатюры, и этот URL затем вставляется в содержимое.


jQuery(".Thumbnail.Close").click(function(){
jQuery.ajax({
url: "/wp-admin/admin-ajax.php",
type: "POST",
data: {'ID' : '<?php echo $thispost->ID; ?>', 'action': 'Featured_Image'},
dataType:'json',
success: function(response){
        console.log(response['img']);
        jQuery('.Thumbnail-IMG').attr('src', response['img']);
}
});

Здесь я предполагаю, что класс для закрытия thickbox — .Thumbnail.Close. Я протестировал этот код на обычном iFrame, потому что большинство читателей, вероятно, будут использовать обычную реализацию iFrame.

Таким образом, когда кнопка закрытия миниатюры нажата, мы запускаем AJAX-запрос, здесь я использовал PHP, чтобы вставить ID поста в данные JS, если вы хотите делать это иначе, вы можете использовать скрытое поле ввода для хранения ID поста, а затем получить его с помощью JS тоже.

Следующий момент — вот код для части PHP AJAX.

function Featured_Image(){
        if (has_post_thumbnail($_POST['ID'])) {
            $return_data= array('img'=> get_the_post_thumbnail_url($_POST['ID'], 'full'));
        }
         wp_send_json($return_data);
        exit;
}

add_action( 'wp_ajax_nopriv_Featured_Image', 'Featured_Image' );

add_action( 'wp_ajax_Featured_Image', 'Featured_Image' );

Ответ или решение

Для решения вашей задачи по обновлению предварительного просмотра миниатюры в WordPress, когда пользователь загружает новое изображение через медиагалерею на фронтэнде, мы можем использовать AJAX-технологии. Мы обсудим, как организовать необходимую структуру кода для достижения этой цели.

Шаг 1: Изменение JavaScript-кода

Первым шагом будет добавление JavaScript-кода, который будет отслеживать закрытие ThickBox и отправлять AJAX-запрос для получения новой URL-адреса миниатюры. Нужно убедиться, что мы используем правильный селектор для элемента, который закрывает ThickBox. Следующий код демонстрирует, как это сделать:

jQuery(document).ready(function($) {
    // Обработка клика по кнопке закрытия ThickBox
    $(document).on('click', '.tb-close-icon', function() {
        var postId = '<?php echo $post_id; ?>'; // Получение ID поста

        // AJAX-запрос для получения нового URL миниатюры
        $.ajax({
            url: '/wp-admin/admin-ajax.php',
            type: 'POST',
            data: {
                'ID': postId,
                'action': 'get_featured_image' // Действие для обработки на сервере
            },
            dataType: 'json',
            success: function(response) {
                if (response.success) {
                    // Обновляем источник изображения для предварительного просмотра
                    $('.milyin-thumbnail-true').attr('src', response.img);
                }
            }
        });
    });
});

Шаг 2: Создание обработчика AJAX в PHP

Теперь нужно создать обработчик AJAX на стороне сервера, который будет возвращать URL миниатюры. Вот код, который нужно добавить в файл functions.php вашей темы или в плагин:

function get_featured_image() {
    if (!isset($_POST['ID'])) {
        wp_send_json_error();
        exit;
    }

    $post_id = intval($_POST['ID']);

    // Проверяем, есть ли миниатюра для поста
    if (has_post_thumbnail($post_id)) {
        // Получаем URL миниатюры
        $thumbnail_url = get_the_post_thumbnail_url($post_id, 'full');

        // Возвращаем результат
        wp_send_json_success(array('img' => $thumbnail_url));
    } else {
        wp_send_json_error('Thumbnail not found');
    }

    exit;
}

// Регистрация обработчика AJAX для авторизованных и неавторизованных пользователей
add_action('wp_ajax_get_featured_image', 'get_featured_image');
add_action('wp_ajax_nopriv_get_featured_image', 'get_featured_image');

Шаг 3: Обновление HTML для предварительного просмотра

Убедитесь, что у вас правильно установлен класс для изображения, чтобы JavaScript мог его найти и обновить:

echo '<img class="milyin-field milyin-thumbnail-true" align="center" style="padding:0 !Important; width:100vw; min-height:250px; object-fit:contain;" src="' . get_the_post_thumbnail_url($post_id, 'hestia_blogs') . '">';

Заключение

С вышеуказанным кодом, когда пользователь закроет ThickBox после загрузки новой миниатюры, будет выполнен AJAX-запрос к серверу, который в ответ вернёт новый URL миниатюры. Этот URL будет использован для обновления источника изображения в HTML.

Таким образом, вы обеспечите актуальность предварительного просмотра миниатюры, и пользователи сразу увидят изменения после загрузки нового изображения.

Если у вас возникнут дополнительные вопросы или потребуется дальнейшая помощь, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...