我们正在将Volusion网站迁移到WooCommerce。该站点的管理员喜欢这样的事实,即附件是一个单独的实体,可以独立管理。
我将通过一个示例来解释Volusion如何允许这样做。例如,选项类别可以是:雕刻版块
选项为
另一个类别是:添加可选螺钉
那些选项应该是
通过输入产品代码,在编辑屏幕上将每个选项分配给产品。管理员喜欢Volusion的“魔术”是您可以进入选项编辑器,然后编辑一个选项,它适用于其所有相关产品。在此示例中,他可以将“镍制螺丝钉”更改为$ 0.30,这将适用于1000种产品。
我试图看看如何在WooCommerce中做到这一点,但被卡住了。我正在用add-ons代替Volusion中的“选项”。这样做的问题是,要么按产品逐个产品地管理加载项,要么在全局范围内没有足够的可用资源来配置可以分配给哪些产品(除了在这种情况下不起作用的类别) )。
Volusion如何存储和管理选项与其他任何电子商务平台如何存储和管理附件一样。而且我很困惑,也不知道如何配置WooCommerce以Volusion处理选项的方式处理加载项。请帮忙。谢谢!
答案 0 :(得分:0)
所以我设法使工作分三部分进行。
注意:我建议创建一个虚拟产品类别。分配全局加载项以显示在虚拟类别中的产品中,以防止它们在任何地方显示,因此仅当您将它们添加到元框时才显示。
/**
* 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…', '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 );