重力形式 - 从条目中省略字段
Gravity Forms - Omit fields from entry
我正在使用 Gravity Forms 和 WooCommerce 以及 WooCommerce Gravity Forms Addons 插件。我有一张附在产品上的表格,需要进行一些计算以确定产品的最终价格。
为了这样做,我在表单中有一些我不想显示在购物车或订单条目中的中间计算字段。
我已经查看并尝试过 gform_pre_submission,我可以成功删除所需的字段。问题是 Gravity Forms 显然会在提交时重新计算表单,因此取消设置 gform_pre_submission 中的字段会破坏计算并导致添加到购物车的项目具有不正确的值。
显然,我可以使用 CSS 隐藏购物车中的字段,但这并没有将必要的字段保留在条目之外,因此也保留在 WooCommerce 订单信息中。
那么,如何在不破坏计算的情况下从条目中省略不需要的字段?
谢谢!
PS - 这是我尝试的提交前代码,以防我的测试出现问题
add_action( 'gform_pre_submission_5', 'pre_submission_handler' );
function pre_submission_handler( $form ) {
//remove some fields which we don't need to save
unset($_POST['input_23']); //remove base price
}
编辑:请参阅下面 David 的代码。我对其进行了这一修改以处理古怪的产品:
for( $i = count( $other_data ) - 1; $i >= 0; $i-- ) {
if (isset($other_data[$i]['name'])){ //if not, must be a WC variation, not GF so ignore
if( $other_data[$i]['name'] == GFCommon::get_label( $field ) )
unset( $other_data[$i] );
}
}
具有 WooCommerce 变体和 Gravity Forms Addons 变体的产品的 $other_data 价值的屏幕截图:
$other_data var dump
此代码段(可以作为插件安装)向每个字段添加一个选项,以允许您从 WooCommerce 购物车项目描述中隐藏它 (screenshot)。
为了方便那些以后发现的人,这里是@David 的方便代码,经过我的修改以支持具有 WooCommerce 变体和 Gravity Forms Addons 变体的产品。
/**
* WooCommerce Gravity Forms Add-on: Add support for removing a field from the product description in the cart.
* This handy code came from: https://gist.github.com/spivurno/6951662 as a result of this
* discussion: https://gravitywiz.com/how-to-hide-gravity-forms-product-fields/
*
* It's used to remove the calulational fields in product forms from the cart.
*/
class WooGFRemoveFieldFromProductDescription {
public function __construct() {
add_action( 'gform_field_advanced_settings', array( $this, 'field_settings_ui' ), 10, 2 );
add_action( 'gform_editor_js', array( $this, 'field_settings_js' ) );
add_filter( 'woocommerce_get_item_data', array( $this, 'modify_item_data' ), 11, 2 );
add_action( 'woocommerce_add_order_item_meta', array( $this, 'delete_order_item_meta' ), 11, 2 );
}
public function modify_item_data( $other_data, $cart_item ) {
$form_id = rgars( $cart_item, '_gravity_form_data/id' );
if( ! $form_id )
return $other_data;
$form = GFFormsModel::get_form_meta( $form_id );
foreach( $form['fields'] as $field ) {
if( ! rgar( $field, 'wgfrfEnable' ) )
continue;
//var_dump($other_data); //debug
//echo '<br>';
// reindex array for next loop
$other_data = array_values( $other_data );
for( $i = count( $other_data ) - 1; $i >= 0; $i-- ) {
if (isset($other_data[$i]['name'])){ //if not, must be a WC variation, not GF so ignore
if( $other_data[$i]['name'] == GFCommon::get_label( $field ) )
unset( $other_data[$i] );
}
}
}
return $other_data;
}
public function delete_order_item_meta( $item_id, $cart_item ) {
$form_id = rgars( $cart_item, '_gravity_form_data/id' );
if( ! $form_id )
return;
$form = GFFormsModel::get_form_meta( $form_id );
foreach( $form['fields'] as $field ) {
if( ! rgar( $field, 'wgfrfEnable' ) )
continue;
woocommerce_delete_order_item_meta( $item_id, GFCommon::get_label( $field ) );
}
}
public function field_settings_ui( $position ) {
if( $position != 450 )
return;
?>
<li class="wgfrf-enable-setting field_setting">
<input type="checkbox" id="wgfrf-enable" value="1" onclick="SetFieldProperty( 'wgfrfEnable', this.checked )">
<label class="inline" for="wgfrf-enable">
<?php _e( 'Remove This Field From WooCommerce Cart Item Description' ); ?>
</label>
</li>
<?php
}
public function field_settings_js() {
?>
<script type="text/javascript">
(function($) {
$(document).bind('gform_load_field_settings', function(event, field, form) {
$("#wgfrf-enable").attr( 'checked', field.wgfrfEnable == true );
});
for( inputType in fieldSettings ) {
if( fieldSettings.hasOwnProperty( inputType ) )
fieldSettings[inputType] += ', .wgfrf-enable-setting';
}
})(jQuery);
</script>
<?php
}
}
new WooGFRemoveFieldFromProductDescription();
我正在使用 Gravity Forms 和 WooCommerce 以及 WooCommerce Gravity Forms Addons 插件。我有一张附在产品上的表格,需要进行一些计算以确定产品的最终价格。
为了这样做,我在表单中有一些我不想显示在购物车或订单条目中的中间计算字段。
我已经查看并尝试过 gform_pre_submission,我可以成功删除所需的字段。问题是 Gravity Forms 显然会在提交时重新计算表单,因此取消设置 gform_pre_submission 中的字段会破坏计算并导致添加到购物车的项目具有不正确的值。
显然,我可以使用 CSS 隐藏购物车中的字段,但这并没有将必要的字段保留在条目之外,因此也保留在 WooCommerce 订单信息中。
那么,如何在不破坏计算的情况下从条目中省略不需要的字段?
谢谢!
PS - 这是我尝试的提交前代码,以防我的测试出现问题
add_action( 'gform_pre_submission_5', 'pre_submission_handler' );
function pre_submission_handler( $form ) {
//remove some fields which we don't need to save
unset($_POST['input_23']); //remove base price
}
编辑:请参阅下面 David 的代码。我对其进行了这一修改以处理古怪的产品:
for( $i = count( $other_data ) - 1; $i >= 0; $i-- ) {
if (isset($other_data[$i]['name'])){ //if not, must be a WC variation, not GF so ignore
if( $other_data[$i]['name'] == GFCommon::get_label( $field ) )
unset( $other_data[$i] );
}
}
具有 WooCommerce 变体和 Gravity Forms Addons 变体的产品的 $other_data 价值的屏幕截图:
$other_data var dump
此代码段(可以作为插件安装)向每个字段添加一个选项,以允许您从 WooCommerce 购物车项目描述中隐藏它 (screenshot)。
为了方便那些以后发现的人,这里是@David 的方便代码,经过我的修改以支持具有 WooCommerce 变体和 Gravity Forms Addons 变体的产品。
/**
* WooCommerce Gravity Forms Add-on: Add support for removing a field from the product description in the cart.
* This handy code came from: https://gist.github.com/spivurno/6951662 as a result of this
* discussion: https://gravitywiz.com/how-to-hide-gravity-forms-product-fields/
*
* It's used to remove the calulational fields in product forms from the cart.
*/
class WooGFRemoveFieldFromProductDescription {
public function __construct() {
add_action( 'gform_field_advanced_settings', array( $this, 'field_settings_ui' ), 10, 2 );
add_action( 'gform_editor_js', array( $this, 'field_settings_js' ) );
add_filter( 'woocommerce_get_item_data', array( $this, 'modify_item_data' ), 11, 2 );
add_action( 'woocommerce_add_order_item_meta', array( $this, 'delete_order_item_meta' ), 11, 2 );
}
public function modify_item_data( $other_data, $cart_item ) {
$form_id = rgars( $cart_item, '_gravity_form_data/id' );
if( ! $form_id )
return $other_data;
$form = GFFormsModel::get_form_meta( $form_id );
foreach( $form['fields'] as $field ) {
if( ! rgar( $field, 'wgfrfEnable' ) )
continue;
//var_dump($other_data); //debug
//echo '<br>';
// reindex array for next loop
$other_data = array_values( $other_data );
for( $i = count( $other_data ) - 1; $i >= 0; $i-- ) {
if (isset($other_data[$i]['name'])){ //if not, must be a WC variation, not GF so ignore
if( $other_data[$i]['name'] == GFCommon::get_label( $field ) )
unset( $other_data[$i] );
}
}
}
return $other_data;
}
public function delete_order_item_meta( $item_id, $cart_item ) {
$form_id = rgars( $cart_item, '_gravity_form_data/id' );
if( ! $form_id )
return;
$form = GFFormsModel::get_form_meta( $form_id );
foreach( $form['fields'] as $field ) {
if( ! rgar( $field, 'wgfrfEnable' ) )
continue;
woocommerce_delete_order_item_meta( $item_id, GFCommon::get_label( $field ) );
}
}
public function field_settings_ui( $position ) {
if( $position != 450 )
return;
?>
<li class="wgfrf-enable-setting field_setting">
<input type="checkbox" id="wgfrf-enable" value="1" onclick="SetFieldProperty( 'wgfrfEnable', this.checked )">
<label class="inline" for="wgfrf-enable">
<?php _e( 'Remove This Field From WooCommerce Cart Item Description' ); ?>
</label>
</li>
<?php
}
public function field_settings_js() {
?>
<script type="text/javascript">
(function($) {
$(document).bind('gform_load_field_settings', function(event, field, form) {
$("#wgfrf-enable").attr( 'checked', field.wgfrfEnable == true );
});
for( inputType in fieldSettings ) {
if( fieldSettings.hasOwnProperty( inputType ) )
fieldSettings[inputType] += ', .wgfrf-enable-setting';
}
})(jQuery);
</script>
<?php
}
}
new WooGFRemoveFieldFromProductDescription();