Создание формы регистрации пользователя в WordPress
У меня есть страница с формой под названием Test Form с такой формой:
<div id="container">
<form action="wp-content/themes/max-magazine/TestForm.php" method="post" name="myForm">
Пользователь <input type="text" name="uname" />
Email <input id="email" type="text" name="uemail" />
Пароль <input type="password" name="upass" />
<input type="submit" value="Отправить" /></form>
</div>
И в бэкенде у меня есть php-файл с именем TestForm.php
<?php
function create_account(){
$user = 'AccountID';
$pass = 'AccountPassword';
$email = 'email@domain.com';
if ( !username_exists( $user ) && !email_exists( $email ) ) {
$user_id = wp_create_user( $user, $pass, $email );
$user = new WP_User( $user_id );
$user->set_role( 'contributor' );
}
}
add_action('init','create_account');
?>
Если эта функция определена в function.php, то она работает нормально и создает пользователя, но та же функция в TestForm.php не работает. Помогите, пожалуйста.
Также я буду получать данные из формы следующим образом:
<?php
$user = $_POST['uname'];
$pass = $_POST['upass'];
$email = $_POST['uemail'];
?>
Вы отправляете данные из формы напрямую в файл TestForm.php
, который является независимым PHP-скриптом, не связанным с логикой WordPress. Вы можете оставить атрибут action
формы пустым — в этом случае данные формы будут отправлены на ту же страницу, которая содержит форму (и является частью WordPress):
<div id="container">
<form method="post" name="myForm">
Пользователь <input type="text" name="uname" />
Email <input id="email" type="text" name="uemail" />
Пароль <input type="password" name="upass" />
<input type="submit" value="Отправить" />
</form>
</div>
В этом случае данные формы отправляются на страницу WordPress, и срабатывает хук add_action('init','create_account');
, если вы добавите его в файл functions.php
, например, так:
add_action('init','create_account');
function create_account(){
//Здесь может потребоваться валидация данных
$user = ( isset($_POST['uname']) ? $_POST['uname'] : '' );
$pass = ( isset($_POST['upass']) ? $_POST['upass'] : '' );
$email = ( isset($_POST['uemail']) ? $_POST['uemail'] : '' );
if ( !username_exists( $user ) && !email_exists( $email ) ) {
$user_id = wp_create_user( $user, $pass, $email );
if( !is_wp_error($user_id) ) {
//пользователь создан
$user = new WP_User( $user_id );
$user->set_role( 'contributor' );
//Перенаправление
wp_redirect( 'URL_куда_перенаправить' );
exit;
} else {
//$user_id содержит объект WP_Error. Обработайте ошибку
}
}
}
Примечание: Рекомендую использовать современную HTML5-разметку форм и типы полей ввода.

Тогда вопрос в том, как получить значения user, email и password в functions.php из формы myForm?

У вас есть доступ к $_POST
внутри функции create_account()
, поэтому вы можете получить значения так же, как и в любой другой форме в PHP. И вы можете создать TestForm.php
, но вам придется загружать движок WordPress в этом файле, что, я думаю, вам точно не нужно.

И где я должен определить эту функцию? В файле functions.php? Или в TestForm.php?

То есть ты имеешь в виду, что мне нужно сделать это в functions.php? Но тогда как форма будет знать, на какой PHP-файл нужно отвечать? И что если мне нужно перенаправить на другую страницу после успешной регистрации?

Используйте wp_redirect
. Думаю, вы путаете URL с расположением PHP-скрипта.

Поместите wp_redirect
туда, где вы хотите, чтобы он выполнялся, очевидно. Например, если вы хотите, чтобы он выполнялся после успешного создания пользователя через wp_create_user
, разместите его после проверки, что wp_create_user
действительно создал пользователя. См. отредактированный ответ. Я думаю, ваш вопрос о "Создании формы регистрации пользователя в WordPress" уже решен, более конкретные вопросы следует задавать в новых вопросах, например, как использовать wp_redirect
? Иначе мы можем затянуть обсуждение здесь до бесконечности.
