Как получить 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 );
tobe
Я также попробовал функцию 'Лучший способ (возможно)', но результат тот же. Похоже, что она не может успешно получить ID записи?
tobe
В файле page.php добавьте это сразу после строки $entry_id = get_user_meta( $user_id, $meta_key, $single );: echo( "DEBUG: \$user_id = $user_id; \$entry_id = $entry_id<br />\n" ); Что выводится?
Pat J
На веб-странице отображается "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"]'); ?>
tobe
Я обновил код page.php после тестирования на локальной установке. Я закомментировал вызов get_currentuserinfo(), потому что похоже, что он обнулял глобальную переменную $current_user. Надеюсь, это решит вашу проблему.
Pat J
Да!! Это сработало. Отличная находка и большое спасибо. Можно ли как-то связаться с вами в личных сообщениях для дальнейшего общения? Я хотел бы упомянуть вас в титрах сайта ;-)
tobe
Мой сайт указан в моем профиле — просто нажмите на мое имя пользователя. На главной странице, в конце раздела "О Патрике", вы найдете ссылки на мои аккаунты в Facebook и Twitter. И еще — если мой ответ вам помог, пожалуйста, отметьте его как Принятый.
Pat J
Извините, решение не работает для залогиненных пользователей, которые зарегистрировались через Wordpress Social Login (или другие плагины социального входа). После регистрации через социальные сети и отправки формы возникает проблема с распознаванием ID записи для этих пользователей. Когда я проверяю страницы или пользователей в админке, нет ничего необычного по сравнению с пользователями, зарегистрированными обычным способом, как я тестировал вчера. Сегодня я протестировал несколько плагинов социального входа с двумя провайдерами (Twitter и Facebook). Есть идеи, почему так происходит и как найти решение этой проблемы?
tobe
Извините, я не знаком с плагинами для социального входа. Первое, что я бы предложил — выяснить, как эти плагины создают пользователей — получают ли они User ID таким же образом, как "обычные" пользователи WordPress? Если нет, то мой код не будет работать, так как он предполагает, что у пользователя есть все поля в базе данных, которые есть у стандартного пользователя WordPress. Больше я ничем не могу помочь.
Pat J