php - fields - Agregue campos personalizados a la forma existente en Dokan(wordpress/woocoomerce)
campos personalizados wordpress (3)
Estoy tratando de agregar campos personalizados en Dokan (plugin woocommerce - http://demo.wedevs.com/dokan/ ) configuración del vendedor para editar los valores de la dirección de usuario en woocommerce. Dokan tiene un formulario en la interfaz para que los vendedores editen la configuración de su tienda. Cambié mis temas functions.php con este código:
<?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'' );
El formulario muestra bien, pero simplemente no actualiza el meta del usuario. Otra cosa que no pude hacer sin errores es mostrar el valor actual en el campo de formulario de entrada.
Creo que esto es bastante fácil para un buen programador. ¿Puede alguien ayudarme? Muchas gracias.
Por favor, prueba este código en su lugar:
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 );
Espero que solucione tus problemas.
Si desea agregar un campo personalizado, es decir, seller_url a la configuración de Dokan, consulte el código a continuación.
/*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
}
El siguiente paso es guardar la configuración usando el código siguiente. Esto no sobrescribirá la configuración existente.
//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 );
}
Tuve el mismo problema y encontré esta respuesta. Usé el método de Sergiy Byelozyorov que fue muy útil, pero estaba funcionando parcialmente, al menos en mi caso.
Lo que me sucedió fue que solo se almacenaban las configuraciones nuevas, y todas las configuraciones anteriores (en otras palabras, las originales, no personalizadas) se eliminaban en cada actualización de configuración.
Esto fue porque en dokan, el enlace do_action "dokan_store_profile_saved" acepta solo 1 arg, store_id. No se aprobaron dokan_settings, por lo que la nueva función
update_user_meta( $store_id, ''dokan_profile_settings'', $dokan_settings );
estaba actualizando solo la última matriz $ dokan_settings creada, sobrescribiendo todas las otras $ dokan_settings args con valores vacíos.
Así que tuve que confiar en la variable $ store_id solamente y en la función get_user_meta () y me gustó esto (tenga en cuenta que necesitaba otro campo adicional diferente de los que necesitaba):
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 );
}
Espero que esto ayude a alguien más también.