我试图在Dokan (woocommerce插件- http://demo.wedevs.com/dokan/)卖家设置上添加自定义字段,以从woocommerce上的用户地址编辑值。Dokan的前端有一个表单,供卖家编辑他的商店设置。我用以下代码更改了主题functions.php:
<?php
function endereco() {
$user_id = get_current_user_id();
?> <div class="gregcustom dokan-form-group">
<label class="dokan-w3 dokan-control-label" for="setting_address"><?php _e( 'Cidade', 'dokan' ); ?></label>
<div class="dokan-w5">
<input type="text" class="dokan-form-control input-md valid" name="billing_first_name" id="reg_billing_first_name" value="<?php echo esc_attr_e( $_POST['billing_city'] ); ?>" />
</div> </div>
<div class="gregcustom dokan-form-group">
<label class="dokan-w3 dokan-control-label" for="setting_address"><?php _e( 'Estado', 'dokan' ); ?></label>
<div class="dokan-w5">
<input type="text" class="dokan-form-control input-md valid" name="billing_first_name" id="reg_billing_first_name" value="<?php esc_attr_e( $_POST['billing_state'] ); ?>" />
</div>
</div>
<div class="gregcustom dokan-form-group">
<label class="dokan-w3 dokan-control-label" for="setting_address"><?php _e( 'CEP', 'dokan' ); ?></label>
<div class="dokan-w5">
<input type="text" class="dokan-form-control input-md valid" name="billing_first_name" id="reg_billing_first_name" value="<?php esc_attr_e( $_POST['billing_postcode'] ); ?>" />
</div> </div>
<div class="gregcustom dokan-form-group">
<label class="dokan-w3 dokan-control-label" for="setting_address"><?php _e( 'Endereço', 'dokan' ); ?></label>
<div class="dokan-w5">
<input type="text" class="dokan-form-control input-md valid" name="billing_first_name" id="reg_billing_first_name" value="<?php esc_attr_e( $_POST['billing_address_1'] ); ?>" />
</div>
</div>
<?php
}
add_filter( 'dokan_settings_after_banner', 'endereco');
/**
* Save the extra fields.
*
* @param int $customer_id Current customer ID.
*
* @return void
*/
function save_extra_endereco_fields( $customer_id ) {
if ( isset( $_POST['billing_city'] ) ) {
// WordPress default first name field.
update_user_meta( $customer_id, 'billing_city', sanitize_text_field( $_POST['billing_city'] ) );
}
if ( isset( $_POST['billing_postcode'] ) ) {
// WordPress default last name field.
update_user_meta( $customer_id, 'billing_postcode', sanitize_text_field( $_POST['billing_postcode'] ) );
}
if ( isset( $_POST['billing_state'] ) ) {
// WooCommerce billing phone
update_user_meta( $customer_id, 'billing_state', sanitize_text_field( $_POST['billing_address_1'] ) );
}
if ( isset( $_POST['billing_address_1'] ) ) {
// WooCommerce billing phone
update_user_meta( $customer_id, 'billing_address_1', sanitize_text_field( $_POST['billing_address_1'] ) );
}
}
add_action( 'dokan_store_profile_saved', 'save_extra_endereco_fields' );
表单显示ok,但它只是不更新用户元。另一件我无法避免错误的事情是在表单imput字段上显示当前值。
我认为这对于一个好的程序员来说是相当容易的。有人能帮我吗?非常感谢。
发布于 2014-11-20 09:48:59
请尝试以下代码:
function endereco( $current_user, $profile_info ) {
$billing_city = isset( $profile_info['billing_city'] ) ? $profile_info['billing_city'] : '';
$billing_postcode = isset( $profile_info['billing_postcode'] ) ? $profile_info['billing_postcode'] : '';
$billing_state = isset( $profile_info['billing_state'] ) ? $profile_info['billing_state'] : '';
$billing_address_1 = isset( $profile_info['billing_address_1'] ) ? $profile_info['billing_address_1'] : '';
?>
<div class="gregcustom dokan-form-group">
<label class="dokan-w3 dokan-control-label" for="setting_address"><?php _e( 'Cidade', 'dokan' ); ?></label>
<div class="dokan-w5">
<input type="text" class="dokan-form-control input-md valid" name="billing_city" id="reg_billing_city" value="<?php echo $billing_city; ?>" />
</div>
</div>
<div class="gregcustom dokan-form-group">
<label class="dokan-w3 dokan-control-label" for="setting_address"><?php _e( 'Estado', 'dokan' ); ?></label>
<div class="dokan-w5">
<input type="text" class="dokan-form-control input-md valid" name="billing_postcode" id="reg_billing_postcode" value="<?php echo $billing_postcode; ?>" />
</div>
</div>
<div class="gregcustom dokan-form-group">
<label class="dokan-w3 dokan-control-label" for="setting_address"><?php _e( 'CEP', 'dokan' ); ?></label>
<div class="dokan-w5">
<input type="text" class="dokan-form-control input-md valid" name="billing_state" id="reg_billing_state" value="<?php echo $billing_postcode; ?>" />
</div>
</div>
<div class="gregcustom dokan-form-group">
<label class="dokan-w3 dokan-control-label" for="setting_address"><?php _e( 'Endereço', 'dokan' ); ?></label>
<div class="dokan-w5">
<input type="text" class="dokan-form-control input-md valid" name="billing_address_1" id="reg_billing_address_1" value="<?php echo $billing_address_1; ?>" />
</div>
</div>
<?php
}
add_filter( 'dokan_settings_after_banner', 'endereco', 10, 2);
/**
* Save the extra fields.
*
* @param int $customer_id Current customer ID.
*
* @return void
*/
function save_extra_endereco_fields( $store_id, $dokan_settings ) {
if ( isset( $_POST['billing_city'] ) ) {
$dokan_settings['billing_city'] = $_POST['billing_city'];
}
if ( isset( $_POST['billing_postcode'] ) ) {
$dokan_settings['billing_postcode'] = $_POST['billing_postcode'];
}
if ( isset( $_POST['billing_state'] ) ) {
$dokan_settings['billing_state'] = $_POST['billing_state'];
}
if ( isset( $_POST['billing_address_1'] ) ) {
$dokan_settings['billing_address_1'] = $_POST['billing_address_1'];
}
update_user_meta( $store_id, 'dokan_profile_settings', $dokan_settings );
}
add_action( 'dokan_store_profile_saved', 'save_extra_endereco_fields', 10, 2 );希望它能解决你的问题。
发布于 2017-05-10 03:43:38
如果要向Dokan设置添加自定义字段(即seller_url ),请参见下面的代码。
/*Extra field on the seller settings and show the value on the store banner -Dokan*/
// Add extra field in seller settings
add_filter( 'dokan_settings_after_banner', 'extra_fields', 10, 2);
function extra_fields( $current_user, $profile_info ){
$seller_url= isset( $profile_info['seller_url'] ) ? $profile_info['seller_url'] : '';
?>
<div class="gregcustom dokan-form-group">
<label class="dokan-w3 dokan-control-label" for="setting_address">
<?php _e( 'Website', 'dokan' ); ?>
</label>
<div class="dokan-w5">
<input type="text" class="dokan-form-control input-md valid" name="seller_url" id="reg_seller_url" value="<?php echo $seller_url; ?>" />
</div>
</div>
<?php
}下一步是使用下面的代码保存设置。这不会覆盖现有设置。
//save the field value
add_action( 'dokan_store_profile_saved', 'save_extra_fields', 15 );
function save_extra_fields( $store_id ) {
if ( isset( $_POST['seller_url'] ) ) {
$dokan_settings['seller_url'] = $_POST['seller_url'];
}
$existing_dokan_settings = get_user_meta( $store_id, 'dokan_profile_settings', true );
$prev_dokan_settings = ! empty( $existing_dokan_settings ) ? $existing_dokan_settings : array();
$dokan_settings = array_merge( $prev_dokan_settings,$dokan_settings);
update_user_meta( $store_id, 'dokan_profile_settings', $dokan_settings );
}发布于 2016-02-16 13:42:55
我也遇到了同样的问题,找到了这个答案。我使用了方法,这是非常有用的,但它部分地起作用,至少在我的例子中是这样的。
发生在我身上的是,只有新设置被存储,所有旧设置(换句话说,原始设置,而不是自定义设置)都在每个设置更新时被删除。
这是因为在dokan中,do_action钩子"dokan_store_profile_saved“只接受1 arg,即store_id。没有传递dokan_settings,所以新函数
update_user_meta( $store_id, 'dokan_profile_settings', $dokan_settings );只更新最新创建的$dokan_settings数组,用空值覆盖所有其他$dokan_settings arg。
因此,我只能依赖变量$store_id和函数get_user_meta(),并且我确实这样做了(请考虑到我需要另一个与您需要的字段不同的字段):
function save_extra_concept_field( $store_id ) {
if ( isset( $_POST['vendor_concept'] ) ) {
$dokan_settings['vendor_concept'] = $_POST['vendor_concept'];
//update_user_meta( $store_id, 'vendor_concept', sanitize_text_field( $_POST['vendor_concept'] ) );
}
$prev_dokan_settings = get_user_meta( $store_id, 'dokan_profile_settings', true );
$dokan_settings = array_merge($prev_dokan_settings,$dokan_settings);
update_user_meta( $store_id, 'dokan_profile_settings', $dokan_settings );
}希望这对其他人也有帮助。
https://stackoverflow.com/questions/26985251
复制相似问题