在 WooCommerce 我的帐户自定义菜单项内容中定义用户变量

问题描述

自定义菜单显示在woocommerce的我的账户中。
我正在使用以下代码制作自定义菜单

/**
 * Query registration
 */
function my_custom_query_vars($vars)
{
    $vars[] = 'my-dosu-endpoint';
    return $vars;
}
add_filter('query_vars','my_custom_query_vars',0);

function my_custom_my_account_menu_items($items)
{
    $items['my-dosu-endpoint'] = __('OOOO','woocommerce');
    return $items;
}
add_filter('woocommerce_account_menu_items','my_custom_my_account_menu_items');

function my_custom_endpoint_content()
{
}

add_action('woocommerce_account_my-dosu-endpoint_endpoint','my_custom_endpoint_content');


function my_custom_endpoint_title($title)
{
    global $wp_query;
    $is_endpoint = isset($wp_query->query_vars['my-dosu-endpoint']);
    if ($is_endpoint && !is_admin() && is_main_query() && in_the_loop() && is_account_page()) {
        // New page title.
        $title = __('OOOO','woocommerce');
        remove_filter('the_title','my_custom_endpoint_title');
    }
    return $title;
}
add_filter('the_title','my_custom_endpoint_title');

我想在这自定义菜单显示用户信息注册表。

我能够复制和粘贴 form-edit-acount.PHP内容并使用以下内容显示它:

function my_custom_endpoint_content()
{
    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_tag'); ?>>

        <?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 esc_html_e('First name','woocommerce'); ?>&nbsp;<span class="required">*</span></label>
            <input type="text" class="woocommerce-Input woocommerce-Input--text input-text" name="account_first_name" id="account_first_name" autocomplete="given-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 esc_html_e('Last name','woocommerce'); ?>&nbsp;<span class="required">*</span></label>
            <input type="text" class="woocommerce-Input woocommerce-Input--text input-text" name="account_last_name" id="account_last_name" autocomplete="family-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_display_name"><?PHP esc_html_e('display name','woocommerce'); ?>&nbsp;<span class="required">*</span></label>
            <input type="text" class="woocommerce-Input woocommerce-Input--text input-text" name="account_display_name" id="account_display_name" value="<?PHP echo esc_attr($user->display_name); ?>" /> <span><em><?PHP esc_html_e('This will be how your name will be displayed in the account section and in reviews','woocommerce'); ?></em></span>
        </p>
        <div class="clear"></div>

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

        <fieldset>
            <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
                <label for="password_current"><?PHP esc_html_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" autocomplete="off" />
            </p>
            <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
                <label for="password_1"><?PHP esc_html_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" autocomplete="off" />
            </p>
            <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
                <label for="password_2"><?PHP esc_html_e('Confirm new password','woocommerce'); ?></label>
                <input type="password" class="woocommerce-Input woocommerce-Input--password input-text" name="password_2" id="password_2" autocomplete="off" />
            </p>
        </fieldset>
        <div class="clear"></div>

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

        <p>
            <?PHP wp_nonce_field('save_account_details','save-account-details-nonce'); ?>
            <button type="submit" class="woocommerce-Button button" name="save_account_details" value="<?PHP esc_attr_e('Save changes','woocommerce'); ?>"><?PHP esc_html_e('Save changes','woocommerce'); ?></button>
            <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');
}

add_action('woocommerce_account_my-dosu-endpoint_endpoint','my_custom_endpoint_content');

但是我一直无法获取用户信息。

因此对应保存时的非输入检查。
$user 部分显示“未定义变量$user”。我应该在哪里定义它?

解决方法

首先在你的最后一个函数中,defined('ABSPATH') || exit; 是不必要的,它被 php 或模板文件使用。然后需要定义$user变量,它是WP_User对象(当前用户)的一个实例。

因此只需将 defined('ABSPATH') || exit; 替换为 $user = wp_get_current_user();

它应该可以解决“未定义变量$user问题。

,

在函数的开头:

$user = wp_get_current_user();

如果该代码不起作用,这个代码应该可以解决问题:

$user = get_userdata( get_current_user_id() );