2017-12-01 4 views
0

Ich habe Felder benutzerdefinierte Kasse favorite_color, dass Benutzer in während der Prüfung (nicht erforderlich), imilar zu anderen Standard Kasse Felder ausfüllen ...ein benutzerdefiniertes Feld in WooCommerce Konto bearbeiten Seite hinzufügen

Ihr Konto Abschnitt in "Konto bearbeiten", möchte ich das benutzerdefinierte Feld favorite_color hinzufügen, damit der Kunde diesen Feldwert bearbeiten kann.

Dafür habe ich die Vorlage bearbeitet haben myaccount/form-edit-account.php durch das Kopieren und Bearbeiten einer ursprünglichen Codezeile in es:

<p class="woocommerce-form-row woocommerce-form-row--first form-row form-row-first"> 
    <label for="account_first_name"><?php _e('First name', 'woocommerce'); ?> <span class="required">*</span></label> 
    <input type="text" class="woocommerce-Input woocommerce-Input--text input-text" name="account_first_name" id="account_first_name" value="<?php echo esc_attr($user->first_name); ?>" /> 
</p> 

Ich ersetzte den account_first_name mit meinem favorite_color und das Feld selbst zeigt den gespeicherten Wert im Feld (Danke an $user->favorite_color)

Aber der schlechte Teil ist, es wird nicht gespeichert.

Welchen Code muss ich hinzufügen, damit dies funktioniert und gespeichert wird?

Die ursprüngliche Template-Code ist:

<?php 
/** 
* Edit account form 
* 
* This template can be overridden by copying it to yourtheme/woocommerce/myaccount/form-edit-account.php. 
* 
* HOWEVER, on occasion WooCommerce will need to update template files and you 
* (the theme developer) will need to copy the new files to your theme to 
* maintain compatibility. We try to do this as little as possible, but it does 
* happen. When this occurs the version of the template file will be bumped and 
* the readme will list any important changes. 
* 
* @see  https://docs.woocommerce.com/document/template-structure/ 
* @author WooThemes 
* @package WooCommerce/Templates 
* @version 2.6.0 
*/ 

if (! defined('ABSPATH')) { 
    exit; 
} 

do_action('woocommerce_before_edit_account_form'); ?> 

<form class="woocommerce-EditAccountForm edit-account" action="" method="post"> 

    <?php do_action('woocommerce_edit_account_form_start'); ?> 

    <p class="woocommerce-form-row woocommerce-form-row--first form-row form-row-first"> 
     <label for="account_first_name"><?php _e('First name', 'woocommerce'); ?> <span class="required">*</span></label> 
     <input type="text" class="woocommerce-Input woocommerce-Input--text input-text" name="account_first_name" id="account_first_name" value="<?php echo esc_attr($user->first_name); ?>" /> 
    </p> 
    <p class="woocommerce-form-row woocommerce-form-row--last form-row form-row-last"> 
     <label for="account_last_name"><?php _e('Last name', 'woocommerce'); ?> <span class="required">*</span></label> 
     <input type="text" class="woocommerce-Input woocommerce-Input--text input-text" name="account_last_name" id="account_last_name" value="<?php echo esc_attr($user->last_name); ?>" /> 
    </p> 
    <div class="clear"></div> 

    <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide"> 
     <label for="account_email"><?php _e('Email address', 'woocommerce'); ?> <span class="required">*</span></label> 
     <input type="email" class="woocommerce-Input woocommerce-Input--email input-text" name="account_email" id="account_email" value="<?php echo esc_attr($user->user_email); ?>" /> 
    </p> 

    <fieldset> 
     <legend><?php _e('Password change', 'woocommerce'); ?></legend> 

     <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide"> 
      <label for="password_current"><?php _e('Current password (leave blank to leave unchanged)', 'woocommerce'); ?></label> 
      <input type="password" class="woocommerce-Input woocommerce-Input--password input-text" name="password_current" id="password_current" /> 
     </p> 
     <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide"> 
      <label for="password_1"><?php _e('New password (leave blank to leave unchanged)', 'woocommerce'); ?></label> 
      <input type="password" class="woocommerce-Input woocommerce-Input--password input-text" name="password_1" id="password_1" /> 
     </p> 
     <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide"> 
      <label for="password_2"><?php _e('Confirm new password', 'woocommerce'); ?></label> 
      <input type="password" class="woocommerce-Input woocommerce-Input--password input-text" name="password_2" id="password_2" /> 
     </p> 
    </fieldset> 
    <div class="clear"></div> 

    <?php do_action('woocommerce_edit_account_form'); ?> 

    <p> 
     <?php wp_nonce_field('save_account_details'); ?> 
     <input type="submit" class="woocommerce-Button button" name="save_account_details" value="<?php esc_attr_e('Save changes', 'woocommerce'); ?>" /> 
     <input type="hidden" name="action" value="save_account_details" /> 
    </p> 

    <?php do_action('woocommerce_edit_account_form_end'); ?> 
</form> 

<?php do_action('woocommerce_after_edit_account_form'); ?> 
+0

Idealerweise sollten Sie dies über einen der in dieser Vorlage aufgerufenen Aktions-Hooks einfügen, anstatt die Vorlage selbst zu ändern. – CBroe

+0

Ich möchte nur den Benutzer das benutzerdefinierte Checkout-Feld ändern (in meinem Beispiel nannte ich es "favorite_color"). Welchen Code muss ich zur form-edit-account.php hinzufügen? – Josione

Antwort

1

Dies kann ohne zwingende Template-Dateien durchgeführt werden, nur verfügbar Haken auf diese Weise mit:

// Add the custom field "favorite_color" 
add_action('woocommerce_edit_account_form', 'add_favorite_color_to_edit_account_form'); 
function add_favorite_color_to_edit_account_form() { 
    $user = wp_get_current_user(); 
    ?> 
     <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide"> 
     <label for="favorite_color"><?php _e('Favorite color', 'woocommerce'); ?> 
     <input type="text" class="woocommerce-Input woocommerce-Input--text input-text" name="favorite_color" id="favorite_color" value="<?php echo esc_attr($user->favorite_color); ?>" /> 
    </p> 
    <?php 
} 

// Save the custom field 'favorite_color' 
add_action('woocommerce_save_account_details', 'save_favorite_color_account_details', 12, 1); 
function save_favorite_color_account_details($user_id) { 
    // For Favorite color 
    if(isset($_POST['favorite_color'])) 
     update_user_meta($user_id, 'favorite_color', sanitize_text_field($_POST['favorite_color'])); 

    // For Billing email (added related to your comment) 
    if(isset($_POST['account_email'])) 
     update_user_meta($user_id, 'billing_email', sanitize_text_field($_POST['account_email'])); 
} 

-Code geht in function.php Datei Ihrer aktives Kindthema (oder aktives Theme) oder in einer beliebigen Plugin-Datei.

Getestet und funktioniert.

Wenn Sie die Vorlage überschreiben möchten, um das benutzerdefinierte Feld anzuzeigen, müssen Sie nur die zweite hooked-Funktion beibehalten (die, die die Daten bei der Bearbeitung speichert).

+0

Danke, es funktioniert. Ist es jedoch möglich, die Parameter "abrechnung_E-Mail" und "account_email" gleichzeitig zu aktualisieren? Denn mit dem Standard-Code wird nur die account_email und nicht die billing_email bearbeitet. Gibt es einen "Trick", also bearbeitet er gleichzeitig die billing_email? -Jo – Josione

+0

Danke, wenn Sie eine andere Frage nicht stört: Ist es auch möglich, ein benutzerdefiniertes Feld, "Lieblingsfarbe 2" hinzuzufügen? . Ich habe versucht, es hinzuzufügen, aber es funktioniert nicht, etwas, das ich falsch mache – Josione

+0

ja ich fragte eine neue Frage https://StackOverflow.com/Questions/47604357/issue-when-Adding-an-additional-custom-field-in- woocommerce-edit-account-Seite – Josione

Verwandte Themen