Как получить ID записи Gravityform из текущей отправки формы пользователем?

19 апр. 2013 г., 17:57:26
Просмотры: 29.9K
Голосов: 5

Ситуация: Когда пользователь отправляет форму (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;
}
5
Комментарии

Вам нужен ID записи Gravity Forms, связанный с пользователем, или ID страницы, которая создается при отправке его формы?

Pat J Pat J
19 апр. 2013 г. 21:55:27

Мне нужно отображать ID записи, связанный с текущим пользователем. Цель - дать этому пользователю (когда он авторизован) заголовок/ссылку на созданную им страницу.

tobe tobe
19 апр. 2013 г. 23:30:43

Возможно, есть более простой способ. Если вы используете Gravity Forms для создания страниц, то в объекте Entry есть ID новой страницы/записи. Я добавлю еще один фрагмент кода в свой ответ, чтобы показать, о чем я говорю.

Pat J Pat J
19 апр. 2013 г. 23:45:57

Смотрите выше добавленный код функции, который я использую, чтобы Gravityforms создавал страницу (вместо записи), если используется форма с ID=2. Возможно, это поможет выяснить, почему функция для получения ID записи не работает?

tobe tobe
20 апр. 2013 г. 15:48:25

'$current_user->entry_id' возвращает его, когда ваш пользователь авторизован - у вас уже есть '$current_user->ID'

Steve Steve
13 нояб. 2016 г. 22:07:54
Все ответы на вопрос 1
9

Вы можете использовать хук 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 на этой странице.

19 апр. 2013 г. 19:17:49
Комментарии

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

tobe tobe
20 апр. 2013 г. 10:19:30

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

tobe tobe
20 апр. 2013 г. 15:51:47

В файле 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 Pat J
20 апр. 2013 г. 21:37:46

На веб-странице отображается "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 tobe
20 апр. 2013 г. 22:55:49

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

Pat J Pat J
20 апр. 2013 г. 23:11:14

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

tobe tobe
20 апр. 2013 г. 23:33:15

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

Pat J Pat J
20 апр. 2013 г. 23:43:39

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

tobe tobe
22 апр. 2013 г. 19:09:19

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

Pat J Pat J
22 апр. 2013 г. 19:12:53
Показать остальные 4 комментариев