Last active
November 5, 2021 12:47
-
-
Save spivurno/3bb450d5469df7b10f6d273a6cd24272 to your computer and use it in GitHub Desktop.
Gravity Wiz // Gravity Forms // User Registration // Update by Email
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* WARNING! THIS SNIPPET MAY BE OUTDATED. | |
* The latest version of this snippet can be found in the Gravity Wiz Snippet Library: | |
* https://github.com/gravitywiz/snippet-library/blob/master/gravity-forms/gw-user-registration-update-by-email.php | |
*/ | |
/** | |
* Gravity Wiz // Gravity Forms // User Registration // Update by Email | |
* | |
* Create User Registration feeds that will update the user by the submitted email address, allowing non-logged-in users | |
* to be targeted by GFUR update feeds. | |
* | |
* @version 0.6 | |
* @author David Smith <david@gravitywiz.com> | |
* @license GPL-2.0+ | |
* @link http://gravitywiz.com/... | |
* | |
* Plugin Name: Gravity Forms User Registration - Update by Email | |
* Plugin URI: http://gravitywiz.com/... | |
* Description: Create User Registration feeds that will update the user by the submitted email address, allowing non-logged-in users to be targeted by GFUR update feeds. | |
* Author: Gravity Wiz | |
* Version: 0.2 | |
* Author URI: http://gravitywiz.com | |
*/ | |
class GW_UR_Update_By_Email { | |
public function __construct( $args = array() ) { | |
// set our default arguments, parse against the provided arguments, and store for use throughout the class | |
$this->_args = wp_parse_args( $args, array( | |
'form_id' => false, | |
'field_id' => false | |
) ); | |
// do version check in the init to make sure if GF is going to be loaded, it is already loaded | |
add_action( 'init', array( $this, 'init' ) ); | |
} | |
public function init() { | |
// make sure we're running the required minimum version of Gravity Forms | |
if( ! property_exists( 'GFCommon', 'version' ) || ! version_compare( GFCommon::$version, '1.8', '>=' ) ) { | |
return; | |
} | |
if( ! function_exists( 'gf_user_registration' ) ) { | |
return; | |
} | |
add_filter( 'gform_userregistration_feed_settings_fields', array( $this, 'add_setting' ) ); | |
if( ! is_user_logged_in() ) { | |
add_filter( 'gform_get_form_filter', array( $this, 'remove_hide_form_function' ), 10, 2 ); | |
add_action( 'gform_pre_process', array( $this, 'handle_validation' ) ); | |
add_filter( 'gform_entry_post_save', array( $this, 'add_created_by_by_email' ), 9, 2 ); | |
add_filter( 'gform_gravityformsuserregistration_pre_process_feeds', array( $this, 'filter_feeds' ), 10, 3 ); | |
} | |
} | |
public function add_setting( $settings ) { | |
$settings['additional_settings']['fields'][] = array( | |
'name' => 'updateByEmail', | |
'label' => esc_html__( 'Update by Email' ), | |
'type' => 'checkbox', | |
'choices' => array( | |
array( | |
'label' => esc_html__( 'Update by submitted email address.' ), | |
'value' => 1, | |
'name' => 'updateByEmail', | |
) | |
), | |
'tooltip' => sprintf( '<h6>%s</h6> %s', esc_html__( 'Update by Email' ), esc_html__( 'Update non-logged-in users by the submitted email address (if matching user is found).' ) ), | |
'dependency' => array( | |
'field' => 'feedType', | |
'values' => 'update' | |
), | |
); | |
return $settings; | |
} | |
public function remove_hide_form_function( $string, $form ) { | |
if( $this->has_update_by_email( $form ) ) { | |
remove_action( 'gform_get_form_filter_' . $form['id'], array( gf_user_registration(), 'hide_form' ) ); | |
} | |
return $string; | |
} | |
public function handle_validation( $form ) { | |
$feed = $this->get_single_submission_feed( GFFormsModel::get_current_lead(), $form ); | |
if ( $this->is_update_by_email( $feed ) && $this->does_feed_email_exist( $feed, GFFormsModel::get_current_lead() ) ) { | |
remove_filter( 'gform_validation', array( gf_user_registration(), 'validate' ) ); | |
add_action( 'gform_validation', array( $this, 'validate_role' ) ); | |
} | |
// let's just be safe and reset current lead to false so it doesn't disrupt the normal flow of things... | |
//GFFormsModel::set_current_lead( false ); | |
} | |
public function add_created_by_by_email( $entry, $form ) { | |
$feed = $this->get_single_submission_feed( $entry, $form ); | |
if( ! $feed ) { | |
return $entry; | |
} | |
$user = $this->get_user_by_feed_email( $feed, $entry ); | |
if( $user !== false ) { | |
$entry['created_by'] = $user->ID; | |
GFAPI::update_entry_property( $entry['id'], 'created_by', $user->ID ); | |
} | |
return $entry; | |
} | |
public function does_feed_email_exist( $feed, $entry ) { | |
return $this->get_user_by_feed_email( $feed, $entry ) !== false; | |
} | |
public function get_user_by_feed_email( $feed, $entry ) { | |
$email_field_id = rgars( $feed, 'meta/email' ); | |
$email = rgar( $entry, $email_field_id ); | |
return get_user_by( 'email', $email ); | |
} | |
public function filter_feeds( $feeds, $entry, $form ) { | |
$feed = $this->get_single_submission_feed( $entry, $form ); | |
if( $feed ) { | |
$feeds = array( $feed ); | |
} | |
return $feeds; | |
} | |
public function has_update_by_email( $form ) { | |
$feeds = gf_user_registration()->get_active_feeds( $form['id'] ); | |
foreach( $feeds as $feed ) { | |
if( $this->is_update_by_email( $feed ) ) { | |
return true; | |
} | |
} | |
return false; | |
} | |
public function is_update_by_email( $feed ) { | |
return rgars( $feed, 'meta/updateByEmail' ); | |
} | |
/** | |
* Prevent users from submitted the form if the Update by Email feed matches their current role. | |
* | |
* @param $result | |
*/ | |
public function validate_role( $result ) { | |
$entry = GFFormsModel::get_current_lead(); | |
$feed = $this->get_single_submission_feed( $entry, $result['form'] ); | |
$target_role = rgars( $feed, 'meta/role' ); | |
$user = $this->get_user_by_feed_email( $feed, $entry ); | |
if( ! in_array( $target_role, $user->roles ) ) { | |
return $result; | |
} | |
$result['is_valid'] = false; | |
$email_field_id = rgars( $feed, 'meta/email' ); | |
foreach( $result['form']['fields'] as &$field ) { | |
if( $field->id == $email_field_id ) { | |
$field->failed_validation = true; | |
$field->validation_message = 'The account registered with this email has already been upgraded.'; | |
} | |
} | |
return $result; | |
} | |
public function get_single_submission_feed( $entry, $form ) { | |
$feeds = gf_user_registration()->get_active_feeds( $form['id'] ); | |
foreach( $feeds as $feed ) { | |
if( ! $this->is_update_by_email( $feed ) || ! gf_user_registration()->is_feed_condition_met( $feed, $form, $entry ) ) { | |
continue; | |
} | |
if ( ! $this->is_update_by_email( $feed ) || ! $this->does_feed_email_exist( $feed, $entry ) ) { | |
continue; | |
} | |
return $feed; | |
} | |
return false; | |
} | |
} | |
# Configuration | |
new GW_UR_Update_By_Email(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
👉 This Gist has been migrated to the Gravity Wiz Snippet Library:
https://github.com/gravitywiz/snippet-library/blob/master/gravity-forms/gw-user-registration-update-by-email.php