Как получить ID записи Gravityform из текущей отправки формы пользователем?
Ситуация: Когда пользователь отправляет форму (Gravity), плагин автоматически генерирует уникальный ID записи для этой конкретной формы. В моем случае настройки формы позволяют пользователю отправить форму только один раз и только если пользователь зарегистрирован. Когда пользователь отправляет форму, создается страница с содержимым формы. URL этой страницы генерируется динамически на основе ID записи (www.example.com/entry-ID).
Вопрос: После того, как пользователь отправил форму и авторизовался, я хочу показать ссылку на страницу, которая была создана пользователем. Не только сразу после отправки, но и каждый раз, когда пользователь снова входит в систему. Но как получить и отобразить ID записи этого пользователя на странице, если пользователь авторизован?
У меня есть этот код в page.php для идентификации пользователя и определения того, что отображать:
<?php if ( is_user_logged_in() ) { ?>
<?php global $wpdb;
$user = wp_get_current_user();
$where = get_posts_by_author_sql( 'page', true, $user->ID );
$count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts $where" );
if ( $count >= 1 ) { ?>
// Это то, что видит пользователь, если форма отправлена, где '{entry-ID}' должен быть заменен на ID записи пользователя
<h2>Привет, <?php echo $current_user->display_name ?>, спасибо за отправку формы. Посетите вашу страницу здесь: www.example.com/{entry-ID}</h2>
<?php } else { ?>
// Если пользователь не отправил форму, показывается информация ниже с формой для отправки
<h2>Привет, <?php echo $current_user->display_name ?>, спасибо за присоединение. Чтобы создать страницу, пожалуйста, заполните форму ниже:</h2><?php echo do_shortcode('[gravityform id="2" name="just a form" title="false" description="false"]'); ?>
<?php } } else { ?>
// если пользователь не авторизован, его просят войти в систему для отправки формы
<h2><Пожалуйста, войдите в систему, чтобы создать страницу <?php do_action( 'wordpress_social_login' ); ?></h2>
<?php } ?>
Это функция, которую я использую, чтобы форма (ID=2) создавала 'страницу':
add_filter("gform_post_data", "change_post_type", 10, 2);
function change_post_type($post_data, $form){
//изменять тип записи только для формы с id 1
if($form["id"] != 2)
return $post_data;
$post_data["post_type"] = "page";
return $post_data;
}

Вы можете использовать хук gform_after_submission
[1], чтобы добавить ID записи (и, возможно, ID формы, чтобы избежать путаницы при наличии нескольких форм) в мета-информацию пользователя с помощью функции add_user_meta()
.
<?php
add_action( 'gform_after_submission', 'wpse96468_map_user_to_entry', 10, 2 );
// чтобы привязать к конкретной форме, используйте формат ниже,
// заменив '{$form_id}' на реальный ID формы
// add_action( 'gform_after_submission_{$form_id}', 'wpse96468_map_user_to_entry', 10, 2 );
function wpse96468_map_user_to_entry( $entry, $form ) {
// получаем ID пользователя
// ИСПРАВЛЕНО -- это должно работать,
// если форму могут отправлять только авторизованные пользователи
$user_id = $entry['created_by'];
// задаем аргументы для функции add_user_meta()
$meta_key = 'gform_entry_id';
$meta_value = $entry['id'];
// если нужно передать и ID записи, и ID формы, можно использовать массив:
// $meta_value = array( 'entry_id' => $entry['id'], 'form_id' => $form['id'] );
$unique = true;
// опционально, но по умолчанию false,
// и, если я правильно понял вопрос, вам нужно уникальное значение
add_user_meta( $user_id, $meta_key, $meta_value, $unique );
}
?>
Лучший способ (возможно)
Если вы используете GForms для создания записи (или страницы), есть более простой способ:
<?php
add_action( 'gform_after_submission', 'wpse96480_map_user_to_page', 10, 2);
function wpse96480_map_user_page( $entry, $form ) {
$user_id = $entry['created_by'];
$meta_key = 'generated_page_id';
$meta_value = $entry['post_id']; // см. примечание [2] для ссылки
$unique = true;
add_user_meta( $user_id, $meta_key, $meta_value, $unique );
}
?>
Чтобы показать пользователю ссылку на созданную страницу, добавьте следующий код в functions.php
:
<?php
add_filter( 'the_content', 'wpse96480_get_generated_page_for_user' );
function wpse96480_get_generated_page_for_user( $content ) {
if ( is_user_logged_in() ) {
global $current_user;
$current_user = get_currentuserinfo();
$user_id = $current_user->ID;
$meta_key = 'generated_page_id';
$single = true;
$page_id = get_user_meta( $user_id, $meta_key, $single );
if( strlen( $page_id ) > 0 && is_numeric( $page_id ) ) {
$page_link = '<a href="' . get_permalink( $page_id ) . '">' . get_the_title( $page_id ) . '</a>';
$content .= "Привет, {$current_user->display_name}, спасибо за отправку формы. Ваша страница: $page_link";
} else {
$content .= "Привет, {$current_user->display_name}, пожалуйста, заполните форму ниже<br />\n";
$content .= do_shortcode('[gravityform id="2" name="Join the movement of Gooders" title="false" description="false"]');
}
}
return $content;
}
?>
В ответ на ваши комментарии
Предположим, что генерация страницы выполняется так, как указано в исходном вопросе (т.е., example.com/{entry-ID}
), и вам нужен код, который можно вставить в файл шаблона страницы (page.php
или аналогичный). Вот мое предложение:
Добавьте ID записи в мета-данные пользователя, как описано в первом примере кода (тот, который начинается с add_action( 'gform_after_submission', 'wpse96468_map_user_to_entry', 10, 2 );
). Весь этот код можно поместить в файл functions.php
, чтобы он всегда был доступен для формы Gravity Forms.
Затем добавьте следующий код в файл шаблона страницы (page.php
по умолчанию):
<?php
if ( is_user_logged_in() ) {
global $current_user;
// $current_user = get_currentuserinfo();
// кажется, я перезаписывал существующую переменную $current_user
$user_id = $current_user->ID;
$meta_key = 'gform_entry_id';
$single = true;
$entry_id = get_user_meta( $user_id, $meta_key, $single );
if( strlen( $entry_id ) > 0 && is_numeric( $entry_id ) ) {
// теперь у нас есть ID записи
?>
<h2>Привет, <?php echo $current_user->display_name ?>, спасибо за отправку формы. Ваша страница: www.example.com/<?php echo( $entry_id ); ?></h2>
<?php
} else {
// у нас нет ID записи для этого пользователя
?>
<h2>Привет, <?php echo $current_user->display_name ?>, спасибо за регистрацию. Чтобы создать страницу, заполните форму ниже:</h2><?php echo do_shortcode('[gravityform id="2" name="Join the movement of Gooders" title="false" description="false"]'); ?>
<?php
}
} else {
// пользователь не авторизован
?>
<h2>Пожалуйста, войдите, чтобы создать страницу <?php do_action( 'wordpress_social_login' ); ?></h2>
<?php
}
?>
Думаю, это должно решить вашу задачу.
[1] Для доступа к документации Gravity Forms требуется войти на их сайт.
[2] http://www.gravityhelp.com/documentation/page/Entry_Object -- вам нужен параметр post_id
на этой странице.

Код работает (т.е. не выдает ошибок), но функционирует не так, как мы хотели. Я создал нового пользователя, и при входе форма отображается (это нормально), но после отправки форма по-прежнему остается видимой (вместо первого варианта с url/ID записи). Я скопировал ваш первый (верхний) фрагмент кода в мой functions.php и добавил ID формы (2) вот так в первой строке: add_action( 'gform_after_submission_2', 'wpse96468_map_user_to_entry', 10, 2 );

Я также попробовал функцию 'Лучший способ (возможно)', но результат тот же. Похоже, что она не может успешно получить ID записи?

В файле page.php
добавьте это сразу после строки $entry_id = get_user_meta( $user_id, $meta_key, $single );
: echo( "DEBUG: \$user_id = $user_id; \$entry_id = $entry_id<br />\n" );
Что выводится?

На веб-странице отображается "DEBUG: $user_id = ; $entry_id =" прямо над <h2>Привет, <?php echo $current_user->display_name ?>, спасибо за участие. Чтобы создать страницу, заполните форму ниже:</h2><?php echo do_shortcode('[gravityform id="2" name="Join the movement of Gooders" title="false" description="false"]'); ?>

Я обновил код page.php
после тестирования на локальной установке. Я закомментировал вызов get_currentuserinfo()
, потому что похоже, что он обнулял глобальную переменную $current_user
. Надеюсь, это решит вашу проблему.

Да!! Это сработало. Отличная находка и большое спасибо. Можно ли как-то связаться с вами в личных сообщениях для дальнейшего общения? Я хотел бы упомянуть вас в титрах сайта ;-)

Мой сайт указан в моем профиле — просто нажмите на мое имя пользователя. На главной странице, в конце раздела "О Патрике", вы найдете ссылки на мои аккаунты в Facebook и Twitter. И еще — если мой ответ вам помог, пожалуйста, отметьте его как Принятый.

Извините, решение не работает для залогиненных пользователей, которые зарегистрировались через Wordpress Social Login (или другие плагины социального входа). После регистрации через социальные сети и отправки формы возникает проблема с распознаванием ID записи для этих пользователей. Когда я проверяю страницы или пользователей в админке, нет ничего необычного по сравнению с пользователями, зарегистрированными обычным способом, как я тестировал вчера. Сегодня я протестировал несколько плагинов социального входа с двумя провайдерами (Twitter и Facebook). Есть идеи, почему так происходит и как найти решение этой проблемы?

Извините, я не знаком с плагинами для социального входа. Первое, что я бы предложил — выяснить, как эти плагины создают пользователей — получают ли они User ID таким же образом, как "обычные" пользователи WordPress? Если нет, то мой код не будет работать, так как он предполагает, что у пользователя есть все поля в базе данных, которые есть у стандартного пользователя WordPress. Больше я ничем не могу помочь.
