Вопрос или проблема
Я пытаюсь создать функцию, которая программно создаёт продукт при создании поста. Я не могу понять, как связать миниатюрное изображение поста с изображением продукта. (Если я прикреплю изображение к содержимому поста, оно появится в описании продукта, но это не сделает его видимым в сетке продуктов.)
Я – визуальный художник, использую 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)
.
Пример реализации
Для начала взглянем на ваш текущий код. Обратите внимание на несколько аспектов:
-
Использование правильного хука: Вы используете
publish_post
, что может быть проблематично, так как миниатюра поста может быть еще не задана в момент вызова этого хука. Подходящим вариантом может быть использование хукаsave_post
с дополнительной проверкой на автоматическое сохранение, чтобы избежать зацикливания. -
Получение миниатюры: Ваше использование
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. Это решение уменьшает объем ручной работы, необходимой для поддержания вашего творческого архива и магазина в актуальном состоянии. Кроме того, оно улучшает совокупный пользовательский опыт, представляя согласованную визуальную информацию вашим потенциальным покупателям. Если у вас возникают проблемы с производительностью или корректностью этого подхода, вы можете дополнительно внедрить отладочные механизмы, такие как логирование или уведомления, для мониторинга успешности выполнения данного автоматического процесса.