如何设置WooCommerce的产品选件使其像Volusion的选件系统一样运作?

时间:2019-11-06 19:42:56

标签: wordpress woocommerce volusion

我们正在将Volusion网站迁移到WooCommerce。该站点的管理员喜欢这样的事实,即附件是一个单独的实体,可以独立管理。

我将通过一个示例来解释Volusion如何允许这样做。例如,选项类别可以是:雕刻版块

选项为

  • 1(价格差$ 0)
  • 2(价格差$ 8)

另一个类别是:添加可选螺钉

那些选项应该是

  • 青铜螺丝($ 0.20)
  • 镍制螺丝($ 0.20)

通过输入产品代码,在编辑屏幕上将每个选项分配给产品。管理员喜欢Volusion的“魔术”是您可以进入选项编辑器,然后编辑一个选项,它适用于其所有相关产品。在此示例中,他可以将“镍制螺丝钉”更改为$ 0.30,这将适用于1000种产品。

我试图看看如何在WooCommerce中做到这一点,但被卡住了。我正在用add-ons代替Volusion中的“选项”。这样做的问题是,要么按产品逐个产品地管理加载项,要么在全局范围内没有足够的可用资源来配置可以分配给哪些产品(除了在这种情况下不起作用的类别) )。

Volusion如何存储和管理选项与其他任何电子商务平台如何存储和管理附件一样。而且我很困惑,也不知道如何配置WooCommerce以Volusion处理选项的方式处理加载项。请帮忙。谢谢!

1 个答案:

答案 0 :(得分:0)

所以我设法使工作分三部分进行。

  1. 在“附加组件”标签上的产品数据元框中以多选形式显示全局附加组件
  2. 保存自定义元字段
  3. 将全局加载项添加到要显示在前端的加载项列表中

注意:我建议创建一个虚拟产品类别。分配全局加载项以显示在虚拟类别中的产品中,以防止它们在任何地方显示,因此仅当您将它们添加到元框时才显示。

/**
 * Add a custom field to the Add-ons meta panel
 */
function kia_add_custom_addons_fields() {

    global $product_object;

    if( ! $product_object instanceof WC_Product )  {
        return;
    }

    $global_addons = WC_Product_Addons_Groups::get_all_global_groups();

    ?>
    <div class="wc-pao-field-header">
        <p><strong><?php esc_html_e( 'Global Add-on Groups', 'your-text-domain' ); ?><?php echo wc_help_tip( __( 'Add a global group to this particular product', 'your-text-domain' ) ); ?></strong></p>
    </div>

    <div class="wc-pao-global-addons">

        <p class="form-field">
            <label for="global_addons"><?php _e( 'Apply Global Add-ons to this product', 'your-text-domain' ); ?></label>

        <?php

        // Generate some data for the select2 input.
        $product_add_ons = array_filter( (array) $product_object->get_meta( '_global_addons' ) );

            ?>

            <select id="global_addons" class="wc-enhanced-select" name="global_addons[]" multiple="multiple" style="width: 400px;" data-sortable="sortable" data-placeholder="<?php esc_attr_e( 'Search for a Global Add-on&hellip;', 'your-text-domain' ); ?>" >
            <?php
                foreach ( $global_addons as $add_on ) {
                    echo '<option value="' . esc_attr( $add_on['id'] ) . '"' . selected( in_array( $add_on['id'], $product_add_ons ), true, false ) . '>' . wp_kses_post( $add_on['name'] ) . '</option>';

                }
            ?>
            </select>

        </p>
    </div>
<?php
}
add_action( 'woocommerce_product_addons_panel_start', 'kia_add_custom_addons_fields' );


/**
 * Save the custom field data.
 *
 * @param obj $product WC_Product - the product object.
 */
function kia_save_custom_addons_fields( $product ) {

    // Layout.
    if ( ! empty( $_POST[ 'global_addons' ] ) ) {

        $meta = array_map( 'intval', (array) $_POST[ 'global_addons' ] );

        $product->add_meta_data( '_global_addons', $meta, true );
    }

}
add_action( 'woocommerce_admin_process_product_object', 'kia_save_custom_addons_fields' );


/**
 * Force the custom add-on into the product display.
 *
 * @param  array $product_addons
 * @param  int $post_id
 * @param  return array 
 */
function kia_add_global_product_addons( $product_addons, $post_id ) {

    global $product;

    if( ! is_admin() && $product instanceof WC_Product && $post_id === $product->get_id() ) {


        $meta = $product->get_meta( '_global_addons', true );

        if( ! empty( $meta ) ) {

            $args = array(
                'posts_per_page'   => -1,
                'post_type'        => 'global_product_addon',
                'post_status'      => 'publish',
                'suppress_filters' => true,
                'include' => $meta
            );

            $global_addons = get_posts( $args );

            if ( $global_addons ) {
                $new_addons = array();
                foreach ( $global_addons as $global_addon ) {
                    $new_addon = apply_filters( 'get_product_addons_fields', array_filter( (array) get_post_meta( $global_addon->ID, '_product_addons', true ) ), $global_addon->ID );
                    $new_addons = $new_addons + $test;
                }

                $product_addons = array_merge( $new_addons, $product_addons );

            }

        }
    }

    return $product_addons;
}
add_filter( 'get_product_addons_fields', 'kia_add_global_product_addons', 10, 2 );