From fcf08ab9d4c4dbe79642bb18e8aaab8d904f3a89 Mon Sep 17 00:00:00 2001 From: Gennady Kovshenin Date: Sat, 1 Jul 2017 18:39:51 +0500 Subject: [PATCH 01/17] Fix oEmbed Add Media / From URL preview Since WordPress 4.8 the preview is generated via a REST API call to the oembed/proxy endpoint, which in turn does a remote request to a registered oEmbed provider. The default oEmbed provider fetches the content of a local URL, which, for a GravityView entry URL, ends up being the View instead of the Entry. Register the simplest provider for entry requests and serve the entry as needed. --- includes/class-oembed.php | 59 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/includes/class-oembed.php b/includes/class-oembed.php index 96fe73901b..f8b6c0b1cd 100644 --- a/includes/class-oembed.php +++ b/includes/class-oembed.php @@ -33,7 +33,11 @@ private function __construct() {} private function initialize() { add_action( 'init', array( $this, 'register_handler' ) ); + add_action( 'init', array( $this, 'add_provider' ) ); + if ( ! empty( $_GET['gv_oembed_provider'] ) && ! empty( $_GET['url'] ) ) { + add_action( 'template_redirect', array( $this, 'render_provider_request' ) ); + } } /** @@ -63,6 +67,61 @@ function register_handler() { } + /** + * Become an oEmbed provider for GravityView. + * + * @return void + */ + function add_provider() { + wp_oembed_add_provider( $this->get_handler_regex(), add_query_arg( 'gv_oembed_provider', '1', site_url() ), true ); + } + + /** + * Output a response as a provider for an entry oEmbed URL. + * + * For now we only output the JSON format and don't care about the size (width, height). + * Our only current use-case is for it to provide output to the Add Media / From URL box + * in WordPress 4.8. + * + * @return void + */ + function render_provider_request() { + if ( ! empty( $_GET['url'] ) ) { + $url = $_GET['url']; + } else { + header( 'HTTP/1.0 404 Not Found' ); + exit; + } + + preg_match( $this->get_handler_regex(), $url, $matches ); + + // If not using permalinks, re-assign values for matching groups + if ( ! empty( $matches['entry_slug2'] ) ) { + $matches['is_cpt'] = $matches['is_cpt2']; + $matches['slug'] = $matches['slug2']; + $matches['entry_slug'] = $matches['entry_slug2']; + unset( $matches['is_cpt2'], $matches['slug2'], $matches['entry_slug2'] ); + } + + // No Entry was found + if ( empty( $matches['entry_slug'] ) ) { + do_action('gravityview_log_error', 'GravityView_oEmbed[render_handler] $entry_slug not parsed by regex.', $matches ); + header( 'HTTP/1.0 404 Not Found' ); + exit; + } + + // Setup the data used + $this->set_vars( $matches, null, $url, null ); + + echo json_encode( array( + 'version' => '1.0', + 'provider_name' => 'gravityview', + 'provider_url' => add_query_arg( 'gv_oembed_provider', '1', site_url() ), + 'html' => $this->generate_preview_notice() . $this->render_frontend( null, null, null, null ), + ) ); + exit; + } + /** * Generate the Regular expression that matches embedded entries. * From 74ef74c55c173f4a8336ae167f31be3481a36d58 Mon Sep 17 00:00:00 2001 From: Zack Katz Date: Mon, 10 Jul 2017 11:27:51 -0600 Subject: [PATCH 02/17] Add support for passing renewal URL in response --- includes/class-gv-license-handler.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/includes/class-gv-license-handler.php b/includes/class-gv-license-handler.php index a724d7e251..31b7bebb56 100644 --- a/includes/class-gv-license-handler.php +++ b/includes/class-gv-license-handler.php @@ -695,8 +695,19 @@ private function license_call_update_settings( $license_data, $data ) { * @return string Renewal or account URL */ private function get_license_renewal_url( $license_data ) { + $license_data = is_array( $license_data ) ? (object)$license_data : $license_data; - $renew_license_url = ( ! empty( $license_data ) && !empty( $license_data->license_key ) ) ? sprintf( 'https://gravityview.co/checkout/?download_id=17&edd_license_key=%s&utm_source=admin_notice&utm_medium=admin&utm_content=expired&utm_campaign=Activation&force_login=1', $license_data->license_key ) : 'https://gravityview.co/account/'; + + if( ! empty( $license_data->renewal_url ) ) { + $renew_license_url = $license_data->renewal_url; + } elseif( ! empty( $license_data->license_key ) ) { + $renew_license_url = sprintf( 'https://gravityview.co/checkout/?download_id=17&edd_license_key=%s', $license_data->license_key ); + } else { + $renew_license_url = 'https://gravityview.co/account/'; + } + + $renew_license_url = add_query_arg( wp_parse_args( 'utm_source=admin_notice&utm_medium=admin&utm_content=expired&utm_campaign=Activation&force_login=1' ), $renew_license_url ); + return $renew_license_url; } From 36917a924b2838e82d040f4ba43e57d035302f94 Mon Sep 17 00:00:00 2001 From: Zack Katz Date: Mon, 10 Jul 2017 11:28:04 -0600 Subject: [PATCH 03/17] Add license check debug logging --- includes/class-gv-license-handler.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/includes/class-gv-license-handler.php b/includes/class-gv-license-handler.php index 31b7bebb56..414b72858f 100644 --- a/includes/class-gv-license-handler.php +++ b/includes/class-gv-license-handler.php @@ -413,6 +413,9 @@ private function _license_get_remote_response( $data, $license = '' ) { )); if ( is_wp_error( $response ) ) { + + do_action( 'gravityview_log_error', 'WP_Error response from license check. API params:', $api_params ); + return array(); } @@ -421,6 +424,8 @@ private function _license_get_remote_response( $data, $license = '' ) { // Not JSON if ( empty( $license_data ) ) { + do_action( 'gravityview_log_error', 'Empty license data response from license check', compact( 'response', 'url', 'api_params', 'data' ) ); + delete_transient( self::status_transient_key ); // Change status From a8015098807a82c244bc544a611b35fb7fbe8c91 Mon Sep 17 00:00:00 2001 From: Zack Katz Date: Mon, 10 Jul 2017 11:28:15 -0600 Subject: [PATCH 04/17] Pass `beta` setting to usage metrics --- includes/class-gv-license-handler.php | 1 + 1 file changed, 1 insertion(+) diff --git a/includes/class-gv-license-handler.php b/includes/class-gv-license-handler.php index 414b72858f..1dfd653ae0 100644 --- a/includes/class-gv-license-handler.php +++ b/includes/class-gv-license-handler.php @@ -197,6 +197,7 @@ public function get_site_data() { $data['theme'] = $theme; $data['url'] = home_url(); $data['license_key'] = GravityView_Settings::get_instance()->get_app_setting( 'license_key' ); + $data['beta'] = GravityView_Settings::get_instance()->get_app_setting( 'beta' ); // View Data $gravityview_posts = get_posts('numberposts=-1&post_type=gravityview&post_status=publish&order=ASC'); From 03ffef405b349abdd947925ad06abaeb7224abba Mon Sep 17 00:00:00 2001 From: Gennady Kovshenin Date: Tue, 11 Jul 2017 00:29:51 +0500 Subject: [PATCH 05/17] Fix fatal error on trashed forms If a form is trashed the view that connects to it will fatal. Fix this quickly. --- includes/class-frontend-views.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/includes/class-frontend-views.php b/includes/class-frontend-views.php index f4355ab492..800b054cf8 100644 --- a/includes/class-frontend-views.php +++ b/includes/class-frontend-views.php @@ -715,13 +715,20 @@ public function render_view( $passed_args ) { $view = gravityview()->views->get( $view_id ); if ( ! $view ) { - do_action( 'gravityview_log_debug', sprintf( 'GravityView_View_Data[add_view] Returning; View #%s does not exist.', $view_id ) ); + do_action( 'gravityview_log_debug', sprintf( 'GravityView_frontend[render_view] Returning; View #%s does not have a form tied to it.', $view_id ) ); return null; } + } /** Update the view settings with the requested arguments. */ $view->settings->update( $passed_args ); + + /** Form is not valid. */ + if ( ! $view->form ) { + do_action( 'gravityview_log_debug', sprintf( 'GravityView_frontend[render_view] Returning; View #%s does not exist.', $view_id ) ); + return null; + } } else { /** \GravityView_View_Data::get_view is deprecated. */ $view_data = $this->getGvOutputData()->get_view( $view_id, $passed_args ); From b851221e9eaca6b68c5e6e3903caa5b854066218 Mon Sep 17 00:00:00 2001 From: Zack Katz Date: Tue, 11 Jul 2017 10:30:01 -0600 Subject: [PATCH 06/17] Change how EDDSL plugin updater is loaded @jakejackson1 can you apply this and see if it works for your case? Not sure why it would, but this now uses the `admin_init` hook they show in the EDDSL sample. Related to #896 --- includes/class-gv-license-handler.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/includes/class-gv-license-handler.php b/includes/class-gv-license-handler.php index 1dfd653ae0..6b14c328be 100644 --- a/includes/class-gv-license-handler.php +++ b/includes/class-gv-license-handler.php @@ -57,12 +57,11 @@ private function __construct( GravityView_Settings $GFAddOn ) { $this->Addon = $GFAddOn; - $this->setup_edd(); - $this->add_hooks(); } private function add_hooks() { + add_action( 'admin_init', array( $this, 'setup_edd' ), 0 ); add_action( 'wp_ajax_gravityview_license', array( $this, 'license_call' ) ); add_action( 'admin_init', array( $this, 'refresh_license_status' ) ); add_action( 'admin_init', array( $this, 'check_license' ) ); @@ -345,10 +344,13 @@ function settings_edd_license_activation( $field, $echo ) { /** * Include the EDD plugin updater class, if not exists + * * @since 1.7.4 + * @since 1.21.5.3 Changed visibility of method to public + * * @return void */ - private function setup_edd() { + public function setup_edd() { if( !class_exists('EDD_SL_Plugin_Updater') ) { require_once( GRAVITYVIEW_DIR . 'includes/lib/EDD_SL_Plugin_Updater.php'); From a6f2a2f0464faab63ff1ba862b55414e7689a191 Mon Sep 17 00:00:00 2001 From: Zack Katz Date: Tue, 11 Jul 2017 10:38:06 -0600 Subject: [PATCH 07/17] Fix fatal error with older WPML For now, just log an error. Closes #905 --- .../class-gravityview-theme-hooks-wpml.php | 5 +++++ readme.txt | 2 ++ 2 files changed, 7 insertions(+) diff --git a/includes/plugin-and-theme-hooks/class-gravityview-theme-hooks-wpml.php b/includes/plugin-and-theme-hooks/class-gravityview-theme-hooks-wpml.php index 4b1fc98224..a9d07f4c9e 100644 --- a/includes/plugin-and-theme-hooks/class-gravityview-theme-hooks-wpml.php +++ b/includes/plugin-and-theme-hooks/class-gravityview-theme-hooks-wpml.php @@ -167,6 +167,11 @@ public function wpml_ls_filter( $languages ) { if ( $entry_slug = GravityView_frontend::getInstance()->getSingleEntry() ) { + if ( ! method_exists( $sitepress, 'get_setting' ) ) { + do_action( 'gravityview_log_error', __METHOD__ . ': This version of WPML is outdated and does not include the required method get_setting().' ); + return $languages; + } + $trid = $sitepress->get_element_trid( $post->ID ); $translations = $sitepress->get_element_translations( $trid ); $language_url_setting = $sitepress->get_setting( 'language_negotiation_type' ); diff --git a/readme.txt b/readme.txt index 374457c29d..72a26067ab 100644 --- a/readme.txt +++ b/readme.txt @@ -20,6 +20,8 @@ Beautifully display your Gravity Forms entries. Learn more on [gravityview.co](h == Changelog == +* Fixed: Fatal error when using older version of WPML + = 1.21.5.2 on June 26, 2017 = * Tweak: Improved plugin speed by reducing amount of information logged From fd99ffaea21b760f8a46ce36cd1bf14f52c6acd9 Mon Sep 17 00:00:00 2001 From: Zack Katz Date: Fri, 14 Jul 2017 16:25:57 -0600 Subject: [PATCH 08/17] Remove Gravity Forms-dependent functions These errors were an edge case, migrating the `{prefix}_options` table, but it's possible that others could have this affect them, too. Fixes #907 --- includes/class-admin-views.php | 6 ++++-- includes/class-gravityview-migrate.php | 5 +++++ .../entry-notes/class-gravityview-field-notes.php | 6 +++++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/includes/class-admin-views.php b/includes/class-admin-views.php index 2139c7d93a..aa8306dc13 100644 --- a/includes/class-admin-views.php +++ b/includes/class-admin-views.php @@ -70,7 +70,9 @@ public function filter_pre_get_posts_by_gravityview_form_id( &$query ) { return; } - if( 'edit.php' !== $pagenow || ! rgget( 'gravityview_form_id' ) || ! isset( $query->query_vars[ 'post_type' ] ) ) { + $form_id = isset( $_GET['gravityview_form_id'] ) ? (int) $_GET['gravityview_form_id'] : false; + + if( 'edit.php' !== $pagenow || ! $form_id || ! isset( $query->query_vars[ 'post_type' ] ) ) { return; } @@ -78,7 +80,7 @@ public function filter_pre_get_posts_by_gravityview_form_id( &$query ) { $query->set( 'meta_query', array( array( 'key' => '_gravityview_form_id', - 'value' => rgget( 'gravityview_form_id' ), + 'value' => $form_id, ) ) ); } diff --git a/includes/class-gravityview-migrate.php b/includes/class-gravityview-migrate.php index 8f41394254..6dc9b9d103 100644 --- a/includes/class-gravityview-migrate.php +++ b/includes/class-gravityview-migrate.php @@ -55,6 +55,11 @@ private function maybe_migrate_approved_meta() { private function update_approved_meta() { global $wpdb; + if ( ! class_exists( 'GFFormsModel' ) ) { + do_action( 'gravityview_log_error', __METHOD__ . ': GFFormsModel does not exist.' ); + return; + } + $table_name = GFFormsModel::get_lead_meta_table_name(); $sql = "UPDATE {$table_name} SET `meta_value` = %s WHERE `meta_key` = 'is_approved' AND `meta_value` = %s"; diff --git a/includes/extensions/entry-notes/class-gravityview-field-notes.php b/includes/extensions/entry-notes/class-gravityview-field-notes.php index c5f484cc63..1334ac9c5d 100644 --- a/includes/extensions/entry-notes/class-gravityview-field-notes.php +++ b/includes/extensions/entry-notes/class-gravityview-field-notes.php @@ -168,7 +168,11 @@ function maybe_add_note() { return; } - if( 'gv_note_add' === rgpost('action') ) { + if( ! isset( $_POST['action'] ) ) { + return; + } + + if( 'gv_note_add' === $_POST['action'] ) { $post = wp_unslash( $_POST ); From 154b175c8c9b7827c9fe9d098613e0fc2adf4374 Mon Sep 17 00:00:00 2001 From: Gennady Kovshenin Date: Thu, 20 Jul 2017 03:24:13 +0500 Subject: [PATCH 09/17] Fix issue with checkboxes in edit-entry When saving a custom field, our code will load the value of the saved field back into the entry. For later versions of GF the value for checkboxes is an array. So the `gform_field_values` would contain a really bad encoded string that fails to validate. Saving again kills at least custom field file uploads. This fix checks to see whether the value is an array to begin with and pulls out the needed subvalue. https://secure.helpscout.net/conversation/394406485/9835/?folderId=408730 --- includes/extensions/edit-entry/class-edit-entry-render.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/includes/extensions/edit-entry/class-edit-entry-render.php b/includes/extensions/edit-entry/class-edit-entry-render.php index 996c9a2c13..83e4f783c3 100644 --- a/includes/extensions/edit-entry/class-edit-entry-render.php +++ b/includes/extensions/edit-entry/class-edit-entry-render.php @@ -700,6 +700,10 @@ private function maybe_update_post_fields( $form ) { case 'post_category': break; case 'post_custom_field': + if ( is_array( $value ) && ( floatval( $field_id ) !== floatval( $field->id ) ) ) { + $value = $value[ $field_id ]; + } + if( ! empty( $field->customFieldTemplateEnabled ) ) { $value = $this->fill_post_template( $field->customFieldTemplate, $form, $entry_tmp, true ); } From 7825f412551455d4cd1daf3dd028827d66086636 Mon Sep 17 00:00:00 2001 From: Zack Katz Date: Thu, 20 Jul 2017 11:49:11 -0600 Subject: [PATCH 10/17] Fix issue where `No` is interpreted as false MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I don't recall why we added this to `gv_empty()` in the first place.…but it doesn't really make much sense. Thoughts, @soulseekah ? --- includes/class-gravityview-shortcode.php | 2 +- includes/widgets/search-widget/class-search-widget.php | 2 +- .../widgets/search-widget/templates/search-field-checkbox.php | 2 +- includes/widgets/search-widget/templates/search-field-date.php | 2 +- .../widgets/search-widget/templates/search-field-date_range.php | 2 +- .../widgets/search-widget/templates/search-field-entry_date.php | 2 +- .../widgets/search-widget/templates/search-field-entry_id.php | 2 +- .../widgets/search-widget/templates/search-field-input_text.php | 2 +- .../search-widget/templates/search-field-multiselect.php | 2 +- includes/widgets/search-widget/templates/search-field-radio.php | 2 +- .../widgets/search-widget/templates/search-field-search_all.php | 2 +- .../widgets/search-widget/templates/search-field-select.php | 2 +- .../search-widget/templates/search-field-single_checkbox.php | 2 +- templates/fields/quiz.php | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/includes/class-gravityview-shortcode.php b/includes/class-gravityview-shortcode.php index 92f3229e57..3ade316a9c 100644 --- a/includes/class-gravityview-shortcode.php +++ b/includes/class-gravityview-shortcode.php @@ -110,7 +110,7 @@ private function parse_and_sanitize_atts( $passed_atts ) { // Checkboxes should be 1 or 0 case 'checkbox': - $atts[ $key ] = gv_empty( $passed_value ) ? 0 : 1; + $atts[ $key ] = gv_empty( $passed_value, true, false ) ? 0 : 1; break; /** diff --git a/includes/widgets/search-widget/class-search-widget.php b/includes/widgets/search-widget/class-search-widget.php index dbd3733e8d..cc2ebe8400 100644 --- a/includes/widgets/search-widget/class-search-widget.php +++ b/includes/widgets/search-widget/class-search-widget.php @@ -551,7 +551,7 @@ public function filter_entries( $search_criteria ) { // get the other search filters foreach ( $get as $key => $value ) { - if ( 0 !== strpos( $key, 'filter_' ) || gv_empty( $value, false ) || ( is_array( $value ) && count( $value ) === 1 && gv_empty( $value[0], false ) ) ) { + if ( 0 !== strpos( $key, 'filter_' ) || gv_empty( $value, false, false ) || ( is_array( $value ) && count( $value ) === 1 && gv_empty( $value[0], false, false ) ) ) { continue; } diff --git a/includes/widgets/search-widget/templates/search-field-checkbox.php b/includes/widgets/search-widget/templates/search-field-checkbox.php index 9787b25fdb..0298683eff 100644 --- a/includes/widgets/search-widget/templates/search-field-checkbox.php +++ b/includes/widgets/search-widget/templates/search-field-checkbox.php @@ -17,7 +17,7 @@ ?>