Я пытаюсь сделать какую-то функцию восстановления пароля (не спрашивайте, зачем).
У меня есть сайт WordPress, и я использую Gravity Forms, чтобы запросить почтовый адрес клиента. Затем я хочу использовать этот адрес, чтобы найти соответствующий продукт woo-commerce, у которого тот же адрес электронной почты добавлен в качестве пользовательского атрибута (pa_e-mail). Затем я хочу использовать другой атрибут, который содержит пароль (нет необходимости в сверхнадежной безопасности, md5, хэшах и т. д.) в качестве пользовательского атрибута (pa_pw) и отправить этот пароль обратно в Gravity Forms, чтобы отправить его по почте пользователю. . Кроме того, я хочу отправить ссылку на этот продукт, используя постоянную ссылку.
Код, который у меня есть до сих пор, находится внутри functions.php, а в Gravity Forms у меня есть два текстовых поля, которые могут получать динамическое заполнение. (edit_pw и edit_link)
function get_pw_by_email( $email ) {
// Get all products
$products = wc_get_products( array(
'limit' => -1,
'status' => 'publish',
) );
// Loop through the products
foreach ( $products as $product ) {
// Get the value of the "pa_e-mail" attribute
$pa_email = $product->get_attribute('pa_e-mail');
// Check if the "pa_e-mail" attribute matches the email
if ( $pa_email == $email ) {
// Get the value of the "pa_pw" attribute
$pa_pw = $product->get_attribute('pa_pw');
// Return the value of the "pa_pw" attribute
return $pa_pw;
// Break the loop
break;
}
}
}
function get_product_permalink_by_email( $email ) {
// Get all products
$products = wc_get_products( array(
'limit' => -1,
'status' => 'publish',
) );
// Loop through the products
foreach ( $products as $product ) {
// Get the value of the "pa_e-mail" attribute
$pa_email = $product->get_attribute('pa_e-mail');
// Check if the "pa_e-mail" attribute matches the email
if ( $pa_email == $email ) {
$permalink = $product->get_permalink();
// Return the permalink
return $permalink;
// Break the loop
break;
}
}
}
add_filter( 'gform_field_value_edit_link', 'my_custom_population_function1' );
function my_custom_population_function1($value) {
if ( rgpost( 'is_submit_6') ) {
// Form has been submitted, so retrieve the values from the database
// get mail address from gf field
$email = rgar($entry, '4');
// Permalink
$link = get_product_permalink_by_email($email);
// Output the value of $link to the PHP error log
error_log( 'edit_link: ' . $link );
return $link;
} else {
// Form has not been submitted, so return an empty value
return '';
}
}
add_filter( 'gform_field_value_edit_pw', 'my_custom_population_function2' );
function my_custom_population_function2($value) {
if ( rgpost( 'is_submit_6') ) {
// Form has been submitted, so retrieve the values from the database
// get mail address from gf field
$email = rgar($entry, '4');
// Password
$password = get_pw_by_email($email);
// Output the value of $password to the PHP error log
error_log( 'edit_pw: ' . $password );
return $password;
} else {
// Form has not been submitted, so return an empty value
return '';
}
}
Но почта, которую я получаю, просто имеет пустые значения, где я хочу, чтобы {Link: 6} и {Password: 7} отображались.
Да, пароль сгенерирован и задан заранее
Я переписал код.
function get_product_permalink_by_email($email) {
$products = get_posts(array('post_type' = >'product', 'tax_query' = >array(array('taxonomy' = >'pa_e-mail', 'field' = >'name', 'terms' = >$email))));
if (empty($products)) {
return '';
}
return get_permalink($products[0] - >ID);
}
function get_pw_by_email($email) {
$products = get_posts(array('post_type' = >'product', 'tax_query' = >array(array('taxonomy' = >'pa_e-mail', 'field' = >'name', 'terms' = >$email))));
$terms = wp_get_post_terms($products[0] - >ID, 'pa_pw', true);
if (empty($terms)) {
return '';
}
return $terms[0] - >name;
}
add_filter('gform_field_value_edit_link', 'my_custom_population_function1');
function my_custom_population_function1($value, $entry) {
// Form has been submitted, so retrieve the values from the database
// get mail address from gf field
$email = rgar($entry, '4');
// Permalink
$link = get_product_permalink_by_email($email);
// Output the value of $link to the PHP error log
error_log('edit_link: '.$link);
return $link;
}
add_filter('gform_field_value_edit_pw', 'my_custom_population_function2');
function my_custom_population_function2($value, $entry) {
// Form has been submitted, so retrieve the values from the database
// get mail address from gf field
$email = rgar($entry, '4');
// Password
$password = get_pw_by_email($email);
// Output the value of $password to the PHP error log
error_log('edit_pw: '.$password);
return $password;
}
и я совершенно уверен, что именно эта строка вызывает «ошибку»:
$email = rgar($entry, '4');
Если я ввожу адрес электронной почты вручную как $email, он работает так, как ожидалось. Таким образом, должно быть что-то в Gravity Forms, не передающее значение текстового поля ввода электронной почты (ID 4).
Кто-нибудь подскажет?
Что если вы замените $email = rgar($entry,'4'); со следующим:
if (GFAPI::entry_exists($entry) == true){
$get_entry = GFAPI::get_entry($entry);
$email = $get_entry['4'];
}
Нет, тот же результат. Может быть, ввод из этого поля не готов в данный момент времени? Какая-то проблема курицы и яйца.
Наконец-то я заработал! Моя проблема заключалась в том, что значение моего поля электронной почты (ID4) не было доступно в переменной $ enrtry моих фильтров «gform_field_value_».
Вот мой рабочий код:
function get_product_permalink_by_email($email) {
$products = get_posts(array('post_type' =>'product', 'tax_query' =>array(array('taxonomy' =>'pa_e-mail', 'field' =>'name', 'terms' =>$email))));
if (empty($products)) {
return '';
}
return get_permalink($products[0] ->ID);
}
function get_pw_by_email($email) {
$products = get_posts(array('post_type' =>'product', 'tax_query' =>array(array('taxonomy' =>'pa_e-mail', 'field' =>'name', 'terms' =>$email))));
$terms = wp_get_post_terms($products[0] ->ID, 'pa_pw', true);
if (empty($terms)) {
return '';
}
return $terms[0]->name;
}
add_action( 'gform_pre_submission_7', 'pre_submission' );
function pre_submission( $entry, $form ) {
$entry_id = $entry['id'];
global $email;
$email = $_POST['input_2'];
$edit_link = get_product_permalink_by_email( $email );
if ( $edit_link ) {
$edit_link .= 'edit';
}
$edit_pw = get_pw_by_email( $email );
$_POST['input_3'] = $edit_link;
$_POST['input_4'] = $edit_pw;
}
Извините, я знаю, вы говорите, что это не имеет значения, но «нет необходимости в сверхнадежной защите» плюс слово «пароль» несовместимы. Вам все равно, это ваше право, а мне (пользователю вашего сайта) все равно. У подавляющего большинства пользователей плохие пароли, которые они используют везде. Небезопасно храня пароль, вы только что потенциально могли украсть чужой банковский пароль или пароль электронной почты. Позор пользователю за это, правда. Но исправление тривиально с вашей стороны. Единственное исключение может быть, если вы генерируете пароль случайным образом и не позволяете пользователям изменять его.