我在WordPress中使用了很多custom_fields。
目前我正在与WooCommerce合作,我不知道我的问题是WP还是Woo相关。
我有一个自定义字段设置作为选择框。 我可以选择几个项目,如:
当我选择“sold_out”并保存帖子/产品时,我不仅要保存此字段,还要将“_stock_status”设置为“outofstock”。
字段“_stock_status”是默认的WooCommerce字段。它也是一个下拉框。您可以选择值“instock”或“outofstock”。
Iam正在使用WooCommerce保存功能,名为woocommerce_process_product_meta
。
我以为我可以运行两个update_post_meta
函数。但那不起作用。
我尝试了以下操作,进行测试,检查我的自定义字段是否为空。如果它不为空,则使用所选值更新它,并更新“_stock_status”。
$woocommerce_select = $_POST['_my_custom_field'];
if( !empty( $woocommerce_select ) ) {
update_post_meta( $post_id, '_my_custom_field', esc_attr( $woocommerce_select ) );
update_post_meta( $post_id, '_stock_status', 'outofstock' );
}
使用此功能,我可以保存_my_custom_field,但_stock_status不会更改。
我也试过了这个和其他if函数的变体。 但似乎我不能像这样更新那个领域。
$woocommerce_select = $_POST['_my_custom_field'];
if( $woocommerce_select == 'sold_out' ) {
update_post_meta( $post_id, '_my_custom_field', esc_attr( $woocommerce_select ) );
update_post_meta( $post_id, '_stock_status', 'outofstock' );
} else {
update_post_meta( $post_id, '_my_custom_field', esc_attr( $woocommerce_select ) );
}
不知道我在这里做错了什么,也许有人可以指点我。
谢谢, 沫
更新:添加了功能/挂钩:
function woo_add_custom_general_fields_save( $post_id ){
$woocommerce_select = $_POST['_my_custom_field'];
if( !empty( $woocommerce_select ) ) {
update_post_meta( $post_id, '_my_custom_field', esc_attr( $woocommerce_select ) );
update_post_meta( $post_id, '_stock_status', 'outofstock' );
}
}
add_action( 'woocommerce_process_product_meta', 'woo_add_custom_general_fields_save', 999 );
我也尝试过较低或没有优先权。
这就是我创建自定义字段的方式:
function woo_add_custom_general_fields() {
global $woocommerce, $post; ?>
<div class="options_group">
<p class="form-field custom_stock">
<label for="custom_stock"><?php echo __( 'Custom Stock', 'aat-net-theme' ); ?></label>
<span class="wrap">
<?php $custom_stock = get_post_meta( $post->ID, '_my_custom_field', true ); ?>
<select id="custom_stock" name="_my_custom_field">
<option value="" <?php selected( $custom_stock, '' ); ?>> - Select Stock - </option>
<option value="new" <?php selected( $custom_stock, 'new' ); ?>>New</option>
<option value="in_stock" <?php selected( $custom_stock, 'in_stock' ); ?>>In Stock</option>
<option value="on_request" <?php selected( $custom_stock, 'on_request' ); ?>>On Request</option>
<option value="in_transit" <?php selected( $custom_stock, 'in_transit' ); ?>>In Transit</option>
<option value="not_available" <?php selected( $custom_stock, 'not_available' ); ?>>Not Available</option>
</select>
</span>
<span class="description"><?php _e( 'Select the custom stock-status here.', 'aat-net-theme' ); ?></span>
</p>
<?php }
add_action( 'woocommerce_product_options_general_product_data', 'woo_add_custom_general_fields' );
答案 0 :(得分:0)
也许这对其他人有帮助。
我尝试了很多不同的东西,在某些时候我停用了我的元框保存功能,字段仍然可以保存而没有问题。
我的问题似乎是使用2个默认的WooCommerce操作来创建和保存我的字段/元框。
add_action( 'woocommerce_process_product_meta'...
和
add_action( 'woocommerce_product_options_general_product_data'...
由于我找不到解决方案,我现在创建了一个正常的WordPress元框:
function lwsaat_custom_meta() {
add_meta_box(
'lwsaat_meta', // HTML 'id' attribute of the edit screen section
__( 'Heading', 'lwsaat-plugin' ), // Title of the edit screen section
'lwsaat_meta_callback', // Function that prints out the HTML for the edit screen section
'product', // The type of writing screen on which to show the edit screen section
'normal', // The part of the page where the edit screen section should be shown ('normal', 'advanced', or 'side')
'high' // The priority within the context where the boxes should show ('high', 'core', 'default' or 'low')
);
}
add_action( 'add_meta_boxes', 'lwsaat_custom_meta' );
我创建了回调函数,如下所示:
function lwsaat_meta_callback( $post ) {
wp_nonce_field( basename( __FILE__ ), 'lwsaat_nonce' );
$lwsaat_stored_meta = get_post_meta( $post->ID );
?>
<p class="form-field custom_stock">
<label for="custom_stock"><?php echo __( 'Custom Stock', 'lwsaat-plugin' ); ?></label>
<?php $custom_stock = $lwsaat_stored_meta['_aat_stock_select'][0]; ?>
<select id="custom_stock" name="_aat_stock_select">
<option value="new" <?php selected( $custom_stock, 'new' ); ?>>New</option>
<option value="in_stock" <?php selected( $custom_stock, 'in_stock' ); ?>>In Stock</option>
<option value="not_available" <?php selected( $custom_stock, 'not_available' ); ?>>Not Available</option>
<option value="eu_no_import" <?php selected( $custom_stock, 'eu_no_import' ); ?>>Import to EU not allowed</option>
</select>
</p>
<?php
}
保存功能如下:
function lwsaat_meta_save( $post_id ) {
// Checks save status
$is_autosave = wp_is_post_autosave( $post_id );
$is_revision = wp_is_post_revision( $post_id );
$is_valid_nonce = ( isset( $_POST[ 'lwsaat_nonce' ] ) && wp_verify_nonce( $_POST[ 'lwsaat_nonce' ], basename( __FILE__ ) ) ) ? 'true' : 'false';
// Exits script depending on save status
if ( $is_autosave || $is_revision || !$is_valid_nonce ) {
return;
}
// Save custom stock select
$custom_stock = $_POST[ '_aat_stock_select' ];
if( $custom_stock == 'new' ) {
update_post_meta( $post_id, '_aat_stock_select', $_POST[ '_aat_stock_select' ] );
update_post_meta( $post_id, '_stock_status', 'instock' );
} elseif ( $custom_stock == 'not_available' ) {
update_post_meta( $post_id, '_aat_stock_select', $_POST[ '_aat_stock_select' ] );
update_post_meta( $post_id, '_stock_status', 'outofstock' );
} else {
update_post_meta( $post_id, '_aat_stock_select', $_POST[ '_aat_stock_select' ] );
}
}
add_action( 'save_post', 'lwsaat_meta_save' );
使用此代码,我可以重新保存产品库存以及我的自定义字段。 使用原生WooCoommerce功能,我无法使用。