首页 > 解决方案 > 找到保存产品变化图像的函数-WooCommerce

问题描述

我正在尝试更新处理将图像上传到变体产品的功能![图像变体] https://i.imgur.com/reNn6x7.png

我认为处理它的代码是:

   protected function set_variation_image( $variation, $image ) {
    $attachment_id = isset( $image['id'] ) ? absint( $image['id'] ) : 0;

    if ( 0 === $attachment_id && isset( $image['src'] ) ) {
        $upload = wc_rest_upload_image_from_url( esc_url_raw( $image['src'] ) );

        if ( is_wp_error( $upload ) ) {
            if ( ! apply_filters( 'woocommerce_rest_suppress_image_upload_error', false, $upload, $variation->get_id(), array( $image ) ) ) {
                throw new WC_REST_Exception( 'woocommerce_variation_image_upload_error', $upload->get_error_message(), 400 );
            }
        }

        $attachment_id = wc_rest_set_uploaded_image_as_attachment( $upload, $variation->get_id() );
    }

    if ( ! wp_attachment_is_image( $attachment_id ) ) {
        /* translators: %s: attachment ID */
        throw new WC_REST_Exception( 'woocommerce_variation_invalid_image_id', sprintf( __( '#%s is an invalid image ID.', 'woocommerce' ), $attachment_id ), 400 );
    }

    $variation->set_image_id( $attachment_id );

    // Set the image alt if present.
    if ( ! empty( $image['alt'] ) ) {
        update_post_meta( $attachment_id, '_wp_attachment_image_alt', wc_clean( $image['alt'] ) );
    }

    // Set the image name if present.
    if ( ! empty( $image['name'] ) ) {
        wp_update_post(
            array(
                'ID'         => $attachment_id,
                'post_title' => $image['name'],
            )
        );
    }

    return $variation;
} `

在 - 的里面class-wc-rest-product-variations-controller.php

但此功能的任何修改都不会改变文件上传的方式。

这个想法是上传图像并将相同的变体图像应用于每个可用的变体,但找不到将图像保存到产品的功能。

在itzmekhokan回复后@edit

我创建了一个向 woocommerce_save_product_variation 添加操作的插件

add_action('woocommerce_save_product_variation', 'salvarfoto',10,2);


function salvarfoto($variation_id,$i){

    $variation = new WC_Product_Variation($variation_id);
    $produto_pai =wc_get_product( $variation->get_parent_id() );
    foreach( $produto_pai->get_children() as $variation_values ){
        //  $variation_id = $variation_values['variation_id']; // variation id
        $product = new WC_Product_Variation( $variation_values );
        if( $product->get_attribute( 'pa_cor' ) == $variation->get_attribute('pa_cor'))
        {
            $id_img = $variation->get_image_id();
            $product->set_image_id($id_img);
        }
        $product->save();
    }



}

此代码将相同的 image_id 应用于具有相同颜色属性的所有变体

标签: phpwordpresswoocommerce

解决方案


WC_Meta_Box_Product_Data::save_variations( $post_id, $post )在文件class-wc-meta-box-product-data.php中。

和 -

$errors = $variation->set_props(
    array( 
        'image_id'          => isset( $_POST['upload_image_id'][ $i ] ) ? wc_clean( wp_unslash( $_POST['upload_image_id'][ $i ] ) ) : null,
        )
);

image_id基本上存储每个变体图像ID。首先检查功能,然后我认为您可以使用此do_action( 'woocommerce_save_product_variation', $variation_id, $i );挂钩进行修改。


推荐阅读