チェックアウトおよび登録時のmy_accountユーザーの詳細にカスタムフィールドを追加します

ブライアン・エデルマン

構築しているwoocommerceサイトがあり、ユーザーの生年月日をデータベースのusermetaに追加し、wp-adminのプロファイルの下に表示したいと思います。

PHPをいじった経験は限られています。

私はここのWoocommerceドキュメントから引き出して、チェックアウト時に表示しました。これは正しく実行されています。

Woocommerceのドキュメントには、注文情報に追加する方法が示されていますが、ユーザーアカウント自体には追加されていません。注文には正しく追加されていますが、アカウントには追加されていません。

これが私がこれまでに持っているものです:

/**
 * Add the field to the checkout
 */
add_action( 'woocommerce_after_order_notes', 'my_custom_checkout_field' );

function my_custom_checkout_field( $checkout ) {

    echo '<div id="my_custom_checkout_field">';

    woocommerce_form_field( 'birthdate', array(
        'type'          => 'text',
        'class'         => array('my-field-class form-row-wide'),
        'label'         => __('Date of Birth'),
        'placeholder'   => __('mm/dd/yyyy'),
        ), $checkout->get_value( 'birthdate' ));

    echo '</div>';

}

/**
 * Process the checkout
 */
add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');

function my_custom_checkout_field_process() {
    // Check if set, if its not set add an error.
    if ( ! $_POST['birthdate'] )
        wc_add_notice( __( 'Please enter your date of birth.' ), 'error' );
}

/**
 * update order meta with field value
 */

add_action( 'woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta' );


function my_custom_checkout_field_update_order_meta( $order_id ) {
    if ( ! empty( $_POST['birthdate'] ) ) {
        update_post_meta( $order_id, 'Birthdate', sanitize_text_field( $_POST['birthdate'] ) );
    }
}

/**
 * update user meta with birthdate
 */

add_action ( 'personal_options_update', 'my_save_extra_profile_fields' );
add_action ( 'edit_user_profile_update', 'my_save_extra_profile_fields' );

function my_save_extra_profile_fields( $user_id )
{
    if ( ! empty( $_POST['birthdate'] ) ) {
        update_usermeta( $user_id, 'Birthdate', sanitize_text_field( $_POST['birthdate'] ) );
    }
}


/**
 * Display field value on the order edit page
 */
add_action( 'woocommerce_admin_order_data_after_billing_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1 );
add_action ( 'show_user_profile', 'my_custom_checkout_field_display_admin_order_meta' );
add_action ( 'edit_user_profile', 'my_custom_checkout_field_display_admin_order_meta' );

function my_custom_checkout_field_display_admin_order_meta($order){
    echo '<p><strong>'.__('Birthdate').':</strong> ' . get_post_meta( $order->id, 'Birthdate', true ) . '</p>';
}

ユーザー情報ページでもこのエラーが発生します:

Notice: WP_User->id was called with an argument that is deprecated since 
version 2.1.0! Use WP_User->ID instead. in 
/Applications/MAMP/htdocs/tst_dev/wp-includes/functions.php on line 3891

私のバージョンのユーザー更新メタの代わりに、これも試しました。

add_action( 'user_register', 'my_custom_update_user');

function my_custom_update_user( $user_id )
{        
    if ( $user_id != 0 ) {             // check if user is not a guest
            update_usermeta( $user_id, 'Birthdate', sanitize_text_field( $_POST['birthdate'] ) );
        }
}
LoicTheAztec

—軽い更新— (すべてのデータがデータベースで更新されるようになりました)


1)エラーの解決:

エラーを回避するupdate_user_meta()には、非推奨でなくを使用update_usermeta()する必要があります。

2)コードのクリーニングと変更:

カスタムフィールドの場合、スラッグの大文字を避けることをお勧めします。

// Add the field to the checkout
add_action( 'woocommerce_after_order_notes', 'birth_day_checkout_field' );
function birth_day_checkout_field( $checkout ) {

    // if customer is logged in and his birth date is defined
    if(!empty(get_user_meta( get_current_user_id(), 'account_birth_date', true ))){
        $checkout_birht_date = esc_attr(get_user_meta( get_current_user_id(), 'account_birth_date', true ));
    }
    // The customer is not logged in or his birth date is NOT defined
    else {
        $checkout_birht_date = $checkout->get_value( 'birth_date' );
    }

    echo '<div id="my_custom_checkout_field">';

    woocommerce_form_field( 'birth_date', array(
        'type'          => 'text',
        'class'         => array('birth-date form-row-wide'),
        'label'         => __( 'Date of Birth', 'theme_domain_slug' ),
        'placeholder'   => __( 'mm/dd/yyyy', 'theme_domain_slug' ),
        ), $checkout_birht_date);

    echo '</div>';

}


// Process the checkout
add_action('woocommerce_checkout_process', 'birth_day_checkout_field_process');
function birth_day_checkout_field_process() {
    // Check if set, if its not set add an error.
    if ( ! $_POST['birth_date'] )
        wc_add_notice( __( 'Please enter your date of birth.', 'theme_domain_slug' ), 'error' );
}


// update order meta with field value
add_action( 'woocommerce_checkout_update_order_meta', 'birth_day_checkout_field_update_order_meta' );
function birth_day_checkout_field_update_order_meta( $order_id ) {
    if (!empty( $_POST['birth_date'])){
        update_post_meta( $order_id, 'birth_date', sanitize_text_field( $_POST['birth_date'] ) );

        // updating user meta (for customer my account edit details page post data)
        update_user_meta( get_post_meta( $order_id, '_customer_user', true ), 'account_birth_date', sanitize_text_field($_POST['birth_date']) );
    }
}

// update user meta with Birth date (in checkout and my account edit details pages)
add_action ( 'personal_options_update', 'birth_day_save_extra_profile_fields' );
add_action ( 'edit_user_profile_update', 'birth_day_save_extra_profile_fields' );
add_action( 'woocommerce_save_account_details', 'birth_day_save_extra_profile_fields' );
function birth_day_save_extra_profile_fields( $user_id )
{
    // for checkout page post data
    if ( isset($_POST['birth_date']) ) {
        update_user_meta( $user_id, 'account_birth_date', sanitize_text_field($_POST['birth_date']) );
    }
    // for customer my account edit details page post data
    if ( isset($_POST['account_birth_date']) ) {
        update_user_meta( $user_id, 'account_birth_date', sanitize_text_field($_POST['account_birth_date']) );
    }
}


// Display field value on the order edit page
add_action( 'woocommerce_admin_order_data_after_billing_address', 'birth_day_checkout_field_display_admin_order_meta', 10, 1 );
add_action ( 'show_user_profile', 'birth_day_checkout_field_display_admin_order_meta' );
add_action ( 'edit_user_profile', 'birth_day_checkout_field_display_admin_order_meta' );
function birth_day_checkout_field_display_admin_order_meta($order){
    echo '<p><strong>' . __( 'Birth date:', 'theme_domain_slug' ) . '</strong> ' . get_post_meta( $order->id, 'birth_date', true ) . '</p>';
}

3)顧客のアカウント編集の詳細にフィールドを追加する:

woocommerce_edit_account_form_startフックを使用してこのカスタムフィールドを顧客のmy_account編集詳細ページに挿入することもできますが、配置と順序を制御することはできません。

アクティブなテーマwoocommerceテンプレートフォルダーを含めることをおmy_account/form-edit-account.php勧めします(このフォルダーがまだない場合は、テーマを介したテンプレートのオーバーライドを読んで、その方法を理解してください。

ここでは、[マイアカウント編集]アカウント詳細フォームのメールアドレスの右側にある[生年月日]カスタムフィールドがあります。

このカスタマイズされたテンプレートのコードは次のとおりです。

<?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-FormRow woocommerce-FormRow--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-FormRow woocommerce-FormRow--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>

    <!-- class modification here in <p> tag -->
    <p class="woocommerce-FormRow woocommerce-FormRow--wide form-row form-row-first"><?php // <== Changed the class from "form-row-wide" to "form-row-first" ?>
        <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>
    <!-- (BEGIN) ADDED: Birth day field -->
    <p class="woocommerce-FormRow woocommerce-FormRow--last form-row form-row-last">
        <label for="account_birth_date"><?php _e( 'Birth date', 'theme_domain_slug' ); ?> <span class="required">*</span></label>
        <input type="text" class="woocommerce-Input woocommerce-Input--email input-text" name="account_birth_date" id="account_birth_date" placeholder="mm/dd/yyyy" value="<?php echo esc_attr(get_user_meta( $user->ID, 'account_birth_date', true )); ?>" />
    </p>
    <div class="clear"></div>
    <!-- (END) Birth day field -->

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

        <p class="woocommerce-FormRow woocommerce-FormRow--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-FormRow woocommerce-FormRow--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-FormRow woocommerce-FormRow--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' ); ?>

4)ボーナスギフトを提供してくれてありがとう:管理者編集ユーザーにフィールドを追加:

ここに画像の説明を入力してください

// ADDING CUSTOM FIELD TO INDIVIDUAL USER SETTINGS PAGE IN BACKEND
add_action( 'show_user_profile', 'add_extra_birth_date' );
add_action( 'edit_user_profile', 'add_extra_birth_date' );
function add_extra_birth_date( $user )
{
    ?>
        <h3><?php _e("Birth Date", "theme_domain_slug"); ?></h3>
        <table class="form-table">
            <tr>
                <th><label for="birth_date_profile"><?php _e("Date", "theme_domain_slug"); ?> </label></th>
                <td><input type="text" name="account_birth_date" value="<?php echo esc_attr(get_user_meta( $user->ID, 'account_birth_date', true )); ?>" class="regular-text" /></td>
            </tr>
        </table>
        <br />
    <?php
}

add_action( 'personal_options_update', 'save_extra_birth_date' );
add_action( 'edit_user_profile_update', 'save_extra_birth_date' );
function save_extra_birth_date( $user_id )
{
    update_user_meta( $user_id, 'account_birth_date', sanitize_text_field( $_POST['account_birth_date'] ) );
}

すべてのコードは、アクティブな子テーマ(またはテーマ)のfunction.phpファイル、または任意のプラグインファイル(テンプレートコードを除く)に含まれます。

このコードはテストされ、機能します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

カスタムチェックアウトの配達時間フィールドの値をWooCommerceの注文の詳細に保存します

分類Dev

カートおよびチェックアウトにWooCommerceカスタム製品フィールドのメタデータを表示します

分類Dev

Woocommerceで詳細を請求する前に、新しいカスタムチェックアウトフィールドを追加しますか?

分類Dev

カスタムチェックアウトフィールドの値をユーザーデータとしてWooCommerceに保存します

分類Dev

カスタムチェックアウトフィールドを電子メール注文の詳細に印刷する方法

分類Dev

カスタムチェックアウトフィールドを電子メール注文の詳細に印刷する方法

分類Dev

Woocommerceユーザー登録フォームに追加のチェックボックスを追加し、ユーザーの追加データとしてバックエンドでチェックされているかどうかを保存/表示します

分類Dev

Woocommerceユーザー登録フォームに追加のチェックボックスを追加し、ユーザーの追加データとしてバックエンドでチェックされているかどうかを保存/表示します

分類Dev

チェックアウトページとWooCommerceデータフィールドに集荷場所のカスタムフィールドを追加します

分類Dev

Woocommerceのカートアイテムの数量に基づいてカスタムチェックアウトフィールドを追加します

分類Dev

ユーザーが登録されるたびに、データベースのユーザーノードにユーザーと追加の詳細をどのように追加しますか?

分類Dev

WooCommerceのカスタムチェックアウトフィールドからユーザー表示名を更新します

分類Dev

WooCommerceチェックアウトにユーザーカスタムアカウントフィールドを追加する

分類Dev

woocommerceはカスタムチェックアウトフィールドをメールに追加します

分類Dev

opencartでチェックアウト/登録するために必要なフィールドを追加します

分類Dev

Woocommerce3でカスタムメタデータの注文としてカスタムチェックアウトフィールドを追加します

分類Dev

カートとチェックアウトのWooCommerce製品名にカスタムフィールド値を追加します

分類Dev

値をWooCommerceの既存のフィールドにマージするチェックアウトカスタムフィールドを保存します

分類Dev

商品のカスタムフィールド値をカートに保存し、カートに表示してチェックアウトします

分類Dev

Magentoは、1ページのチェックアウト配送先住所と請求先住所にカスタムフィールドを追加します

分類Dev

Woocommerceでカスタムチェックアウトフィールドを追加するときに空白のチェックアウトページ

分類Dev

アカウントの作成またはExpressjsを使用した登録フォームにユーザーの画像をアップロードします

分類Dev

Woocommerceの利用規約の下にカスタムチェックアウトフィールドを追加します

分類Dev

WooCommerceの姓の下にカスタムチェックアウト請求フィールドを追加します

分類Dev

woocommerceチェックアウトページのカスタムフィールドに日付を追加

分類Dev

Woocommerceのチェックアウトフォームフィールドのクラスを追加します

分類Dev

追加のユーザーフィールド、ネストされたモデル/属性、およびカスタムルートを使用して考案する

分類Dev

WooCommerceの顧客注文メモにカスタムチェックアウトフィールド値を追加します

分類Dev

連絡先詳細フォーム、請求先住所フォームなどの各フォームフィールドリストをSilvershopマルチステップチェックアウトのカスタムテンプレートにレンダリングする方法

Related 関連記事

  1. 1

    カスタムチェックアウトの配達時間フィールドの値をWooCommerceの注文の詳細に保存します

  2. 2

    カートおよびチェックアウトにWooCommerceカスタム製品フィールドのメタデータを表示します

  3. 3

    Woocommerceで詳細を請求する前に、新しいカスタムチェックアウトフィールドを追加しますか?

  4. 4

    カスタムチェックアウトフィールドの値をユーザーデータとしてWooCommerceに保存します

  5. 5

    カスタムチェックアウトフィールドを電子メール注文の詳細に印刷する方法

  6. 6

    カスタムチェックアウトフィールドを電子メール注文の詳細に印刷する方法

  7. 7

    Woocommerceユーザー登録フォームに追加のチェックボックスを追加し、ユーザーの追加データとしてバックエンドでチェックされているかどうかを保存/表示します

  8. 8

    Woocommerceユーザー登録フォームに追加のチェックボックスを追加し、ユーザーの追加データとしてバックエンドでチェックされているかどうかを保存/表示します

  9. 9

    チェックアウトページとWooCommerceデータフィールドに集荷場所のカスタムフィールドを追加します

  10. 10

    Woocommerceのカートアイテムの数量に基づいてカスタムチェックアウトフィールドを追加します

  11. 11

    ユーザーが登録されるたびに、データベースのユーザーノードにユーザーと追加の詳細をどのように追加しますか?

  12. 12

    WooCommerceのカスタムチェックアウトフィールドからユーザー表示名を更新します

  13. 13

    WooCommerceチェックアウトにユーザーカスタムアカウントフィールドを追加する

  14. 14

    woocommerceはカスタムチェックアウトフィールドをメールに追加します

  15. 15

    opencartでチェックアウト/登録するために必要なフィールドを追加します

  16. 16

    Woocommerce3でカスタムメタデータの注文としてカスタムチェックアウトフィールドを追加します

  17. 17

    カートとチェックアウトのWooCommerce製品名にカスタムフィールド値を追加します

  18. 18

    値をWooCommerceの既存のフィールドにマージするチェックアウトカスタムフィールドを保存します

  19. 19

    商品のカスタムフィールド値をカートに保存し、カートに表示してチェックアウトします

  20. 20

    Magentoは、1ページのチェックアウト配送先住所と請求先住所にカスタムフィールドを追加します

  21. 21

    Woocommerceでカスタムチェックアウトフィールドを追加するときに空白のチェックアウトページ

  22. 22

    アカウントの作成またはExpressjsを使用した登録フォームにユーザーの画像をアップロードします

  23. 23

    Woocommerceの利用規約の下にカスタムチェックアウトフィールドを追加します

  24. 24

    WooCommerceの姓の下にカスタムチェックアウト請求フィールドを追加します

  25. 25

    woocommerceチェックアウトページのカスタムフィールドに日付を追加

  26. 26

    Woocommerceのチェックアウトフォームフィールドのクラスを追加します

  27. 27

    追加のユーザーフィールド、ネストされたモデル/属性、およびカスタムルートを使用して考案する

  28. 28

    WooCommerceの顧客注文メモにカスタムチェックアウトフィールド値を追加します

  29. 29

    連絡先詳細フォーム、請求先住所フォームなどの各フォームフィールドリストをSilvershopマルチステップチェックアウトのカスタムテンプレートにレンダリングする方法

ホットタグ

アーカイブ