Связать миниатюру изображения поста при автоматическом создании продукта Woocommerce из поста WordPress.

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

Я пытаюсь создать функцию, которая программно создаёт продукт при создании поста. Я не могу понять, как связать миниатюрное изображение поста с изображением продукта. (Если я прикреплю изображение к содержимому поста, оно появится в описании продукта, но это не сделает его видимым в сетке продуктов.)

Я – визуальный художник, использую WordPress как для архива портфолио, так и для платформы электронной коммерции. Прошло много времени с тех пор, как я занимался кодом WordPress, и WC ещё более сложен.

Я использую код, основанный на этом посте: Создать продукт WooCommerce с тем же именем при публикации пользовательского типа записи

Вот текущий код, который создаёт и публикует продукты, но не связывает идентификатор изображения с продуктом:

/* создание продукта при посте -- */

add_action( 'publish_post', 'auto_create_product_from_post', 100, 2 );
function auto_create_product_from_post($id, $post){
    // Создайте пустой экземпляр WC_Product
    $product = new WC_Product_Simple(); // <=== Простой продукт

    $product->set_name( $post->post_title );
    $product->set_status( $post->post_status );
    $product->set_description( $post->post_content ); // (необязательно)
    $product->set_short_description( $post->post_excerpt ); // (необязательно)
    $product->set_gallery_image_ids(21741); // устанавливает пример изображения 'обратная сторона принта' в галерею продукта
//  $product->set_image_id( xxx ?какая переменная? xxx ); // часть, которая вызывает затруднения

    // Вы можете использовать любые доступные методы WC_Product для установки других свойств
    // см.: https://docs.woocommerce.com/wc-apidocs/class-WC_Product.html

    $product->save(); // Сохранить (опубликовать) новый продукт
}

Я попробовал, безуспешно:

$image = get_post_thumbnail_id( $post->ID );

^^ Это возвращает результат ‘0‘. ^^

$image = get_attached_media( 'image', $post->ID );

Я пробовал 'save_post' вместо 'publish_post', но это создавало цикл из-за автосохранения, создававшего тысячи экземпляров “чернового элемента”.

.

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

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

Теоретическая основа

WordPress и WooCommerce предлагают мощные API и хуки, которые позволяют интегрировать различные части платформы. Чтобы установить изображение для нового товара, вы используете функции WordPress для получения идентификатора миниатюры и затем устанавливаете это изображение как основное изображение товара в WooCommerce. В вашем коде ключевым параметром является функция get_post_thumbnail_id(), которая возвращает идентификатор миниатюры для данного поста. Этот идентификатор затем можно установить для товара с помощью метода $product->set_image_id($image_id).

Пример реализации

Для начала взглянем на ваш текущий код. Обратите внимание на несколько аспектов:

  1. Использование правильного хука: Вы используете publish_post, что может быть проблематично, так как миниатюра поста может быть еще не задана в момент вызова этого хука. Подходящим вариантом может быть использование хука save_post с дополнительной проверкой на автоматическое сохранение, чтобы избежать зацикливания.

  2. Получение миниатюры: Ваше использование get_post_thumbnail_id($post->ID) является правильным, однако вы указываете, что результат равен нулю. Это может происходить, если миниатюра поста не установлена на момент выполнения.

Применение

Исходя из вышеизложенной теории и анализа проблемы, приведем пример исправленного кода:

add_action('save_post', 'auto_create_product_from_post', 20, 2);
function auto_create_product_from_post($post_id, $post) {
    // Проверка, чтобы избежать выполнения в случае автоматического сохранения
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;

    // Проверка типа поста, чтобы сработать только для нужного типа
    if ($post->post_type !== 'post') return;

    // Получение идентификатора миниатюры поста
    $thumbnail_id = get_post_thumbnail_id($post_id);

    // Проверка, чтобы убедиться, что миниатюра установлена
    if (!$thumbnail_id) return;

    // Создание экземпляра товара WooCommerce
    $product = new WC_Product_Simple();
    $product->set_name($post->post_title);
    $product->set_status('publish');
    $product->set_description($post->post_content);
    $product->set_short_description($post->post_excerpt);
    $product->set_image_id($thumbnail_id); // Установка полученного идентификатора как изображения товара

    // Сохранение товара
    $product->save();
}

Заключение

Рассмотренный подход позволяет автоматически устанавливать миниатюру поста как основное изображение для создаваемого товара WooCommerce. Это решение уменьшает объем ручной работы, необходимой для поддержания вашего творческого архива и магазина в актуальном состоянии. Кроме того, оно улучшает совокупный пользовательский опыт, представляя согласованную визуальную информацию вашим потенциальным покупателям. Если у вас возникают проблемы с производительностью или корректностью этого подхода, вы можете дополнительно внедрить отладочные механизмы, такие как логирование или уведомления, для мониторинга успешности выполнения данного автоматического процесса.

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

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