-
-
Save spivurno/6584835 to your computer and use it in GitHub Desktop.
| <?php | |
| /** | |
| Plugin Name: Gravity Forms Cookies | |
| Plugin URI: http://ounceoftalent.com/ | |
| Description: Saves the query string parameters from a users visit to a cookie and allows these values to be populated via Gravity Forms' Dynamic Population feature. | |
| Version: 1.5 | |
| Author: David Smith | |
| Author URI: http://ounceoftalent.com | |
| License: GPL2 | |
| */ | |
| class GFCookie { | |
| public static $cookie_prefix = 'gfc_'; | |
| public static $session = false; | |
| public static $fresh_cookies = array(); | |
| public static function init() { | |
| //GFCookie::delete_cookies(); exit; | |
| if(!is_admin()) { | |
| add_action('parse_request', array('GFCookie', 'save_cookie'), 9); | |
| add_action('gform_pre_render', array('GFCookie', 'load_cookie')); | |
| } | |
| add_shortcode('gf_cookied_link', array('GFCookie', 'cookied_link_shortcode')); | |
| } | |
| public static function save_cookie() { | |
| // if cookies are not enabled, default to session use | |
| // start the session regardless of $_GET being empty as session may have been previously populated | |
| if(!self::cookies_enabled()) { | |
| session_start(); | |
| } | |
| // don't do anything with cookie if there is no data | |
| if(!empty($_GET)) | |
| self::save_get_data(); | |
| self::save_server_data(); | |
| } | |
| public static function load_cookie($form = null) { | |
| $cookie = self::get_cookie_data(false); | |
| foreach($cookie as $key => $value) { | |
| // skip cookies that were not added by us | |
| if(strpos($key, self::$cookie_prefix) === false) | |
| continue; | |
| // load cookie value into $_GET for population into Gravity Forms | |
| $key = str_replace(self::$cookie_prefix, '', $key); | |
| $_GET[$key] = $value; | |
| } | |
| // if gfc referrer is set, find {referer} merge tag and replace | |
| if(self::get_cookie_data('HTTP_REFERER')) { | |
| foreach($form['fields'] as &$field) { | |
| if(strpos(rgar($field, 'defaultValue'), '{referer}') !== false) | |
| $field['defaultValue'] = str_replace('{referer}', self::get_cookie_data('HTTP_REFERER'), $field['defaultValue']); | |
| } | |
| } | |
| return $form; | |
| } | |
| public static function get_cookie_data($key = false) { | |
| $session = isset($_SESSION) && is_array($_SESSION) ? $_SESSION : array(); | |
| $cookie = self::cookies_enabled() ? $_COOKIE : $session; | |
| // cookies that have not yet been sent through the header are merged with existing cookies | |
| $cookie = array_merge($cookie, self::$fresh_cookies); | |
| if($key === false) | |
| return $cookie; | |
| $gfc_key = self::$cookie_prefix . $key; | |
| return rgar($cookie, $gfc_key); | |
| } | |
| public static function save_get_data() { | |
| $reserved_words = array('attachment_id', 'author', 'author_name', 'calendar', 'cat', 'category', 'category__and', 'category__in', 'category__not_in', 'category_name', 'comments_per_page', 'comments_popup', 'cpage', 'day', 'debug', 'error', 'exact', 'feed', 'hour', 'link_category', 'm', 'minute', 'monthnum', 'more', 'name', 'nav_menu', 'nopaging', 'offset', 'order', 'orderby', 'p', 'page', 'page_id', 'paged', 'pagename', 'pb', 'perm', 'post', 'post__in', 'post__not_in', 'post_format', 'post_mime_type', 'post_status', 'post_tag', 'post_type', 'posts', 'posts_per_archive_page', 'posts_per_page', 'preview', 'robots', 's', 'search', 'second', 'sentence', 'showposts', 'static', 'subpost', 'subpost_id', 'tag', 'tag__and', 'tag__in', 'tag__not_in', 'tag_id', 'tag_slug__and', 'tag_slug__in', 'taxonomy', 'tb', 'term', 'type', 'w', 'withcomments', 'withoutcomments', 'year', 'DBGSESSID'); | |
| foreach($_GET as $key => $value) { | |
| if(!in_array($key, $reserved_words)) { | |
| self::save_data($key, $value); | |
| } | |
| } | |
| } | |
| public static function save_server_data() { | |
| $server_keys = array('HTTP_REFERER'); | |
| foreach($_SERVER as $key => $value) { | |
| if(in_array($key, $server_keys)) | |
| self::save_data($key, $value); | |
| } | |
| } | |
| public static function save_data($key, $value) { | |
| $gfc_key = self::$cookie_prefix . $key; | |
| if(self::cookies_enabled()) { | |
| if(!rgar($_COOKIE, $gfc_key)) { | |
| setcookie($gfc_key, $value, time() + 60*60*24*60, '/'); | |
| self::$fresh_cookies[$gfc_key] = $value; | |
| } | |
| } else { | |
| if(!rgar($_SESSION, $gfc_key)) { | |
| $_SESSION[$gfc_key] = $value; | |
| self::$fresh_cookies[$gfc_key] = $value; | |
| } | |
| } | |
| } | |
| /** | |
| * WP uses cookies by default so if $_COOKIES global is empty, cookies are likely not enabled | |
| * | |
| */ | |
| public static function cookies_enabled() { | |
| return !empty($_COOKIE); | |
| } | |
| public static function delete_cookies() { | |
| foreach($_COOKIE as $key => $value) { | |
| if(strpos($key, self::$cookie_prefix) !== false) { | |
| self::delete_cookie($key); | |
| } | |
| } | |
| } | |
| public static function delete_cookie($key) { | |
| setcookie($key, null, time() - 3600, '/'); | |
| } | |
| public static function cookied_link_shortcode($atts) { | |
| extract( shortcode_atts( array( | |
| 'url' => false | |
| ), $atts ) ); | |
| return !$url ? '' : gf_get_cookied_link($url); | |
| } | |
| } | |
| GFCookie::init(); | |
| if(!function_exists('gf_get_cookied_link')) { | |
| function gf_get_cookied_link($url) { | |
| $cookies = GFCookie::get_cookie_data(); | |
| $gfc_cookies = array(); | |
| foreach($cookies as $key => $value) { | |
| if(strpos($key, GFCookie::$cookie_prefix) !== false) { | |
| $key = str_replace('gfc_', '', $key); | |
| $gfc_cookies[$key] = str_replace(array('http://', 'https://'), '', $value); | |
| } | |
| } | |
| return add_query_arg($gfc_cookies, $url); | |
| } | |
| } |
@adonnan Does WP Engine support exempting any cookie with a prefix? If so, exempting any cookie with the "gfc_" prefix should do the trick.
@spivurno That did the trick, thanks! I've been trying to figure that one out for a while.
Glad to help, @adonnan!
@taylor-onfido My pleasure!
Wow David, 10 years ago and still found useful your creations, like this one. One thing: how can implement a way to update the cookies created by query string when a new query string is created? I saw the part //GFCookie::delete_cookies(); exit; at beginning but how to use this function to clear the cokies created? Kind regards
@amar8105alva Glad you're still finding this useful!
You can call GFCookie::delete_cookies() anytime before content is being rendered to the screen to delete all cookies created by GFCookie. For example, you could do something like:
add_action( 'init', function() {
GFCookie::delete_cookies();
}, 9 );
What type of cache exclusion do you recommend for implementing this on a wpengine hosted website? This seems to only work when you're logged during my testing.