Получение данных из формы пользователя

11 дек. 2012 г., 13:53:22
Просмотры: 22.3K
Голосов: 1

Я пытаюсь создать форму, которая позволит пользователям обновлять свою информацию во фронтенде. Я только начинаю изучать PHP (хорошо знаю C#). Если я использую этот код для создания формы на странице WordPress, как мне получить информацию от пользователя при нажатии кнопки 'Обновить' и затем обновить базу данных?

function Insert_AccountTable_1()
{
    $current_user = wp_get_current_user();

    if ($current_user->ID != 0)
    {
        return <<<HTML
            <form class="AlumniForm" method="post">
            <h3>Имя</h3>
            <br>
            <table>
                <tbody>
                    <tr>
                        <th><label for="Username">Имя пользователя</label></th>
                        <td><span>$current_user->user_login</span></td>
                        <td><span class="description">Имена пользователей изменить нельзя.</span></td>
                    </tr>
                    <tr>
                        <th><label for="current_user_firstname">Имя</label></th>
                        <td><input id="current_user_firstname" type="text" name="current_user_firstname" value="$current_user->user_firstname"/></td>
                    </tr>
                    <tr>
                        <th><label for="current_user_lastname">Фамилия</label></th>
                        <td><input id="current_user_lastname" name="current_user_lastname" type="text" value="$current_user->user_lastname"/></td>
                    </tr>
                    <tr>
                        <th><label for="current_user_displayname">Отображаемое имя<span class="description">(обязательно)</span></label></th>
                        <td><input id="current_user_displayname" type="text" value="$current_user->display_name"/></td>
                    </tr>
                </tbody>
            </table>

            <h3>Контактная информация</h3>
            <br>
            <table>
                <tbody>
                    <tr>
                        <th><label for="current_user_email">E-mail<span class="description">(Обязательно)</span></label></th>
                        <td><input id="current_user_email" type="text" value="$current_user->user_email"/></td>
                    </tr>
                    <tr>
                        <th><label for="current_user_url">Веб-сайт</label></th>
                        <td><input id="current_user_email" type="text" value="$current_user->user_url"/></td>
                    </tr>
                </tbody>
            </table>
            <input type="submit" name="current_user_submitupdates">Обновить</input>
            </form>
HTML;
    }
    else
    {
        return <<<HTML
        <h3>Ошибка - Пользователь не авторизован</h3>
HTML;
    }
}

add_shortcode('InsertAccountTableI', 'Insert_AccountTable_1');
1
Комментарии

Привет, @William, твой вопрос немного общий, так как он не совсем специфичен для WordPress, а скорее относится к общим знаниям PHP. Сначала ознакомься с созданием форм на HTML & PHP — после этого ты можешь использовать функцию wp_update_user($user) для достижения своей цели.

fischi fischi
11 дек. 2012 г. 14:09:37
Все ответы на вопрос 1
5

Используйте wp-admin/admin-post.php как обработчик действия формы и привяжите вашу пользовательскую функцию в качестве callback к нему.

Простой пример для обновления email. Мы будем использовать шорткод с именем [userform] здесь, но вы также можете использовать шаблон.

add_shortcode( 'userform', 'wpse_75723_userform' );
add_action( 'admin_post_update_user_email', 'wpse_75723_update' );

/**
 * Создание формы.
 */
function wpse_75723_userform()
{
    $here = esc_url( home_url( $_SERVER['REQUEST_URI'] ) );

    if ( ! is_user_logged_in() )
        return  'Вы должны <a href="' . wp_login_url( $here ) . '">войти в систему</a>, чтобы использовать эту страницу.';

    $action  = admin_url( 'admin-post.php');
    $user_id = get_current_user_id();

    return "<form method='post' action='$action'>
    <input type='hidden' name='action' value='update_user_email'>
    <input type='hidden' name='redirect' value='$here'>
    <input type='hidden' name='user_id' value='$user_id'>
    <input type='email' name='email' size='15'>
    <input type='submit'>
    </form>";
}

/**
 * Обновление email пользователя
 */
function wpse_75723_update()
{
    if ( ! isset ( $_POST['user_id'] ) )
        die( 'не указан ID' );

    $user_id = absint( $_POST['user_id'] );

    if ( ! current_user_can( 'edit_user', $user_id ) )
        die( 'доступ запрещен' );

    if ( ! isset ( $_POST['email'] ) )
        die( 'не указан email' );

    if ( ! is_email( $_POST['email'] ) )
        die( 'некорректный email' );

    $user = get_userdata( $user_id );

    if ( empty ( $user->user_login ) )
        die( 'пользователь не найден' );

    global $wpdb;

    $wpdb->query(
        $wpdb->prepare(
            "UPDATE {$wpdb->users} SET user_email = %s WHERE user_login = %s",
            $_POST['email'],
            $user->user_login
        )
    );

    $location = isset ( $_POST['redirect'] )
        ? urldecode( $_POST['redirect'] )
        : home_url( '/' );

    wp_redirect( $location, 303 );
    exit;
}

Вставка …

[userform]

… на страницу создаст базовую форму:

Форма для изменения email

Пользователь может изменить свой email здесь.

Чтобы понять, какие переменные доступны и где они хранятся, посмотрите эти файлы:

  • wp-admin/user-edit.php
  • wp-admin/includes/user.php и
  • wp-includes/user.php

Также стоит взглянуть на таблицы users и user_meta, если вы хотите отправлять простые SQL-запросы.

11 дек. 2012 г. 15:32:11
Комментарии

Я нигде не могу найти этот хук 'admin_post_update_user_email'. Откуда вы его взяли?

Ari Ari
21 сент. 2013 г. 15:20:47

@AriSusanto Это комбинация admin_post_ и значения <input type='hidden' name='action' value='update_user_email'>.

fuxia fuxia
21 сент. 2013 г. 15:23:19

Как добавить другие рабочие поля ввода, такие как веб-сайт пользователя и т.д.?

Ari Ari
21 сент. 2013 г. 21:14:26

Просто запишите это в wpse_75723_userform() и прочитайте в wpse_75723_update(). Я не понимаю этот вопрос.

fuxia fuxia
21 сент. 2013 г. 23:23:42

Да, это просто работает. Я использую wp_update_user для обновления дополнительного поля профиля пользователя.

Ari Ari
22 сент. 2013 г. 05:51:50