Wordpress 如何设置WooCommerce的产品选项,使其像Volusion的选项系统一样运行?

Wordpress 如何设置WooCommerce的产品选项,使其像Volusion的选项系统一样运行?,wordpress,woocommerce,volusion,Wordpress,Woocommerce,Volusion,我们正在将一个Volusion网站迁移到WooCommerce。该站点的管理员喜欢插件是一个独立的实体,可以独立管理 我将尝试通过一个例子来解释Volusion是如何允许这样做的。例如,选项类别可以是:雕刻部分 而选择将是 1差价$0 2差价8美元 另一类是:添加可选螺钉 这些选择将是 青铜螺丝$0.20 镍螺丝$0.20 通过输入产品代码,在编辑屏幕上将每个选项分配给产品。管理员喜欢Volusion的神奇之处在于,你可以进入选项编辑器,编辑一个选项,它适用于它的所有相关产品。在这个例子中,他可

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

我将尝试通过一个例子来解释Volusion是如何允许这样做的。例如,选项类别可以是:雕刻部分

而选择将是

1差价$0 2差价8美元 另一类是:添加可选螺钉

这些选择将是

青铜螺丝$0.20 镍螺丝$0.20 通过输入产品代码,在编辑屏幕上将每个选项分配给产品。管理员喜欢Volusion的神奇之处在于,你可以进入选项编辑器,编辑一个选项,它适用于它的所有相关产品。在这个例子中,他可以将镍螺丝改为0.30美元,这将适用于1000种产品

我试图看看如何在WooCommerce中做到这一点,但被卡住了。我正在使用替换Volusion中的选项。问题是,附加组件要么是逐个产品进行管理,要么是在全球范围内,除了在这种情况下不起作用的类别之外,在配置可以分配给哪些产品方面没有太多的可用性


Volusion存储和管理选项的方式与任何其他电子商务平台存储和管理附加组件的方式完全不同。我被卡住了,不知道如何配置WooCommerce,以Volusion处理选项的方式处理附加组件。请帮忙。谢谢

所以我已经设法让一些东西分为三个部分

在“附加组件”选项卡上的“产品数据”元框中将全局附加组件显示为多选项 保存自定义元字段 将全局加载项添加到要显示在前端的加载项列表中 注意:我建议创建一个虚拟产品类别。为虚拟类别中的产品指定要显示的全局加载项,以防止它们到处显示,因此它们仅在您将其添加到metabox时显示

/**
 * 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 );

因此,我已经设法让一些工作分为三个部分

在“附加组件”选项卡上的“产品数据”元框中将全局附加组件显示为多选项 保存自定义元字段 将全局加载项添加到要显示在前端的加载项列表中 注意:我建议创建一个虚拟产品类别。为虚拟类别中的产品指定要显示的全局加载项,以防止它们到处显示,因此它们仅在您将其添加到metabox时显示

/**
 * 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 );

外接程序支持全局外接程序,这些外接程序如何?目前无法使用全局附加组件检查自己,在配置这些选项可以分配给哪些产品方面,没有太多可用选项。我们现在只有的AFAIR映射到类别。我不认为你可以为每个附加组件列出一个产品列表。>我们现在只有一个映射到类别的产品是的,我也看到了这一点。很遗憾,你至少不能用标签来做这件事。或者最好添加一个元字段,以选择要应用的全局加载项。看起来创意板上有几个帖子是关于添加对标签/术语的支持的:附加组件支持全局附加组件,那么这些呢?目前无法使用全局附加组件检查自己,在配置这些选项可以分配给哪些产品方面,没有太多可用选项。我们现在只有的AFAIR映射到类别。我不认为你可以为每个附加组件列出一个产品列表。>我们现在只有一个映射到类别的产品是的,我也看到了这一点。很遗憾,你至少不能用标签来做这件事。或者最好添加一个元字段,以选择要应用的全局加载项。看起来创意板上有几个帖子是关于添加对标签/术语和PS的支持的——这似乎有点小问题,因为这些选项显示在metabox中,而它们不应该显示出来。以后可能需要再次检查它。PS-这似乎有点小故障,因为选项显示在metabox中,而它们不应该显示。以后可能要再检查一遍。