/
var
/
www
/
barefootlaw.org
/
wp-content
/
plugins
/
wpforms
/
src
/
Pro
/
Admin
/
Upload File
HOME
<?php namespace WPForms\Pro\Admin; /** * WPForms admin pages changes and enhancements to educate Basic/Plus users on what is * available in WPForms Pro. * * @since 1.5.6 */ class Education { /** * License level slug. * * @since 1.5.6 * * @var string */ public $license; /** * List of addons information. * * @since 1.6.3 * * @var array */ private $addons; /** * WPForms admin page slug. * * @since 1.5.6 * * @var string */ public $page; /** * Constructor. * * @since 1.5.6 */ public function __construct() { $this->hooks(); } /** * Hooks. * * @since 1.5.6 */ public function hooks() { // Only proceed for the forms overview or entries page. if ( ! \wpforms_is_admin_page() && ! \wp_doing_ajax() ) { return; } if ( ! \apply_filters( 'wpforms_pro_admin_education', true ) ) { return; } // Load license level. $this->license = \wpforms_get_license_type(); $this->addons = wpforms()->license ? (array) wpforms()->license->addons() : []; // Admin page slug. $this->page = str_replace( 'wpforms-', '', filter_input( INPUT_GET, 'page', FILTER_SANITIZE_STRING ) ); \add_action( 'admin_enqueue_scripts', [ $this, 'enqueues' ] ); \add_action( 'admin_init', [ $this, 'dyk_init' ] ); \add_action( 'wpforms_entry_details_content', [ $this, 'geolocation' ], 20 ); \add_action( 'wp_ajax_hide_education', [ $this, 'hide_education' ] ); } /** * "Did You Know?" Admin Product Education init. * * @since 1.5.6 */ public function dyk_init() { // Only proceed for the forms overview or entries pages. if ( ! in_array( $this->page, array( 'overview', 'entries' ), true ) ) { return; } // Init only for `basic` & `plus` licenses. if ( ! in_array( $this->license, array( 'basic', 'plus' ), true ) ) { return; } \add_action( 'wpforms_admin_' . $this->page . '_after_rows', [ $this, 'dyk_display' ] ); \add_action( 'wp_ajax_wpforms_dyk_dismiss', [ $this, 'dyk_ajax_dismiss' ] ); } /** * "Did You Know?" messages. * * @since 1.5.6 */ public function dyk_messages() { return array( array( 'desc' => esc_html__( 'You can capture email addresses from partial form entries to get more leads. Abandoned cart emails have an average open rate of 45%!', 'wpforms' ), 'more' => 'https://wpforms.com/addons/form-abandonment-addon/', 'item' => 1, ), array( 'desc' => esc_html__( 'You can easily integrate your forms with 1,500+ useful apps by using WPForms + Zapier.', 'wpforms' ), 'more' => 'https://wpforms.com/addons/zapier-addon/', 'item' => 2, ), array( 'desc' => esc_html__( 'You can integrate your forms to automatically send entries to your most used apps. Perfect for users of Salesforce, Slack, Trello, and 1,500+ others.', 'wpforms' ), 'more' => 'https://wpforms.com/addons/zapier-addon/', 'item' => 3, ), array( 'desc' => esc_html__( 'You can make distraction-free and custom landing pages in WPForms! Perfect for getting more leads.', 'wpforms' ), 'more' => 'https://wpforms.com/addons/form-pages-addon/', 'item' => 4, ), array( 'desc' => esc_html__( 'You can build and customize your own professional-looking landing page. A great alternative to Google Forms!', 'wpforms' ), 'more' => 'https://wpforms.com/how-to-create-a-dedicated-form-landing-page-in-wordpress/', 'item' => 5, ), array( 'desc' => esc_html__( 'You don’t have to build your forms from scratch. The Form Templates Pack addon gives you access to 150+ additional templates.', 'wpforms' ), 'more' => 'https://wpforms.com/demo/', 'item' => 6, ), array( 'desc' => esc_html__( 'You can password-protect your forms. Perfect for collecting reviews or success stories from customers!', 'wpforms' ), 'more' => 'https://wpforms.com/how-to-password-protect-wordpress-forms-step-by-step/', 'item' => 7, ), array( 'desc' => esc_html__( 'You can automatically close a form at a specific date and time. Great for applications!', 'wpforms' ), 'more' => 'https://wpforms.com/docs/how-to-install-and-use-the-form-locker-addon-in-wpforms/', 'item' => 8, ), array( 'desc' => esc_html__( 'You can generate more fresh content for your website for free by accepting guest blog posts.', 'wpforms' ), 'more' => 'https://wpforms.com/docs/how-to-install-and-use-the-post-submissions-addon-in-wpforms/', 'item' => 9, ), array( 'desc' => esc_html__( 'You can easily add a field to your forms that let users draw their signature then saves it as an image with their entry.', 'wpforms' ), 'more' => 'https://wpforms.com/docs/how-to-install-and-use-the-signature-addon-in-wpforms/', 'item' => 10, ), array( 'desc' => esc_html__( 'You can set up your forms to let your site visitors pick which payment method they want to use.', 'wpforms' ), 'more' => 'https://wpforms.com/docs/how-to-allow-users-to-choose-a-payment-method-on-your-form/', 'item' => 11, ), array( 'desc' => esc_html__( 'You can increase your revenue by accepting recurring payments on your forms.', 'wpforms' ), 'more' => 'https://wpforms.com/how-to-accept-recurring-payments-on-your-wordpress-forms/', 'item' => 12, ), array( 'desc' => esc_html__( 'For added insight into your customers, you can collect your user\'s city, state, and country behind-the-scenes with Geolocation!', 'wpforms' ), 'more' => 'https://wpforms.com/docs/how-to-install-and-use-the-geolocation-addon-with-wpforms/', 'item' => 13, ), array( 'desc' => esc_html__( 'You can let people automatically register as users on your WordPress site. Perfect for things like accepting guest blog posts!', 'wpforms' ), 'more' => 'https://wpforms.com/how-to-create-a-user-registration-form-in-wordpress/', 'item' => 14, ), array( 'desc' => esc_html__( 'You can limit one form submission per person to avoid duplicate entries. Perfect for applications and giveaway!', 'wpforms' ), 'more' => 'https://wpforms.com/how-to-limit-the-number-of-wordpress-form-entries/', 'item' => 15, ), array( 'desc' => esc_html__( 'You can use NPS Surveys to learn about your visitors. A tactic used by some of the biggest brands around!', 'wpforms' ), 'more' => 'https://wpforms.com/how-to-create-a-net-promoter-score-nps-survey-in-wordpress/', 'item' => 16, ), array( 'desc' => esc_html__( 'If you\'re planning an event, you can create an RSVP form to stay organized and get higher response rates!', 'wpforms' ), 'more' => 'https://wpforms.com/how-to-create-an-rsvp-form-in-wordpress/', 'item' => 17, ), array( 'desc' => esc_html__( 'With the Offline Forms addon, you can save data entered into your forms even if the user loses their internet connection.', 'wpforms' ), 'more' => 'https://wpforms.com/docs/how-to-install-and-set-up-the-offline-forms-addon/', 'item' => 18, ), array( 'desc' => esc_html__( 'You can accept PayPal on your website — a great way to increase your revenue.', 'wpforms' ), 'more' => 'https://wpforms.com/addons/paypal-standard-addon/', 'item' => 19, ), array( 'desc' => esc_html__( 'You can easily take payments by credit card on your website using the Stripe addon.', 'wpforms' ), 'more' => 'https://wpforms.com/addons/stripe-addon/', 'item' => 20, ), array( 'desc' => esc_html__( 'You can make money selling digital downloads on your site by using Stripe or PayPal.', 'wpforms' ), 'more' => 'https://wpforms.com/the-simplest-way-to-sell-digital-products-on-your-wordpress-site/', 'item' => 21, ), array( 'desc' => esc_html__( 'You can create a simple order form on your site to sell services or products online.', 'wpforms' ), 'more' => 'https://wpforms.com/how-to-create-a-simple-order-form-in-wordpress/', 'item' => 22, ), array( 'desc' => esc_html__( 'You can create surveys or polls and see interactive visual reports of your user\'s answers.', 'wpforms' ), 'more' => 'https://wpforms.com/addons/surveys-and-polls-addon/', 'item' => 23, ), array( 'desc' => esc_html__( 'You can add a customer feedback form to your site. Try automatically emailing it out after a sale!', 'wpforms' ), 'more' => 'https://wpforms.com/how-to-add-a-customer-feedback-form-to-your-wordpress-site/', 'item' => 24, ), array( 'desc' => esc_html__( 'You can add a Likert rating scale to your WordPress forms. Great for measuring your customer’s experience with your business!', 'wpforms' ), 'more' => 'https://wpforms.com/how-to-add-a-likert-scale-to-your-wordpress-forms-step-by-step/', 'item' => 25, ), array( 'desc' => esc_html__( 'You can easily add a poll to your site! Helpful for making business decisions based on your audience\'s needs.', 'wpforms' ), 'more' => 'https://wpforms.com/how-to-create-a-poll-form-in-wordpress-step-by-step/', 'item' => 26, ), array( 'desc' => esc_html__( 'You can create a customer cancellation survey to find out what you can do to improve.', 'wpforms' ), 'more' => 'https://wpforms.com/how-to-create-a-customer-cancellation-survey-in-wordpress/', 'item' => 27, ), array( 'desc' => esc_html__( 'WPForms is a great alternative to SurveyMonkey! You can create your first survey or poll today.', 'wpforms' ), 'more' => 'https://wpforms.com/surveymonkey-alternative-wpforms-vs-surveymonkey-compared-pros-and-cons/', 'item' => 28, ), array( 'desc' => esc_html__( 'You can make your forms interactive and easier to complete. A great way to get more leads!', 'wpforms' ), 'more' => 'https://wpforms.com/addons/conversational-forms-addon/', 'item' => 29, ), array( 'desc' => esc_html__( 'You can easily display survey results graphically. Great for presentations!', 'wpforms' ), 'more' => 'https://wpforms.com/display-survey-results/', 'item' => 30, ), array( 'desc' => esc_html__( 'You can make your forms feel like a one-on-one conversation and boost conversion rates.', 'wpforms' ), 'more' => 'https://wpforms.com/addons/conversational-forms-addon/', 'item' => 31, ), array( 'desc' => esc_html__( 'You can put a pre-built job application form on your website. Perfect if you’re looking for new employees!', 'wpforms' ), 'more' => 'https://wpforms.com/how-to-create-a-job-application-form-in-wordpress/', 'item' => 32, ), array( 'desc' => esc_html__( 'You can automatically send form entries to your Google Calendar. Perfect for appointments!', 'wpforms' ), 'more' => 'https://wpforms.com/how-to-send-wpforms-entries-to-google-calendar/', 'item' => 33, ), array( 'desc' => esc_html__( 'You can automatically send uploaded files from your form entries to Dropbox for safekeeping and organization!', 'wpforms' ), 'more' => 'https://wpforms.com/how-to-create-a-simple-dropbox-upload-form-in-wordpress/', 'item' => 34, ), array( 'desc' => esc_html__( 'When a user submits an uploaded file to your form, it can upload automatically to your Google Drive for better organization!', 'wpforms' ), 'more' => 'https://wpforms.com/how-to-create-a-wordpress-google-drive-upload-form/', 'item' => 35, ), array( 'desc' => esc_html__( 'You can get notified via text when someone completes your form! Great for closing deals faster.', 'wpforms' ), 'more' => 'https://wpforms.com/how-to-get-an-sms-text-message-from-your-wordpress-form/', 'item' => 36, ), array( 'desc' => esc_html__( 'Save time on invoicing! You can automatically add customers to Quickbooks after they complete a form.', 'wpforms' ), 'more' => 'https://wpforms.com/how-to-automatically-add-a-quickbooks-customer-from-your-wordpress-forms-2/', 'item' => 37, ), array( 'desc' => esc_html__( 'You can let users upload videos to your YouTube channel. Perfect for collecting testimonials!', 'wpforms' ), 'more' => 'https://wpforms.com/allow-users-to-upload-videos-to-youtube-from-wordpress/', 'item' => 38, ), array( 'desc' => esc_html__( 'You can automatically save submitted form info in a free Google Sheets spreadsheet. Great for keeping track of your entries!', 'wpforms' ), 'more' => 'https://wpforms.com/save-contacts-from-wordpress-form-to-google-sheet/', 'item' => 39, ), ); } /** * "Did You Know?" random message. * * @since 1.5.6 */ public function dyk_message_rnd() { $messages = $this->dyk_messages(); return $messages[ array_rand( $messages ) ]; } /** * "Did You Know?" display message. * * @since 1.5.6 * * @param \WP_List_Table $wp_list_table Instance of WP_List_Table. */ public function dyk_display( $wp_list_table ) { $dyk_message = $this->dyk_message_rnd(); $column_info = $wp_list_table->get_column_info(); $current_user = \wp_get_current_user(); $dismissed = \get_user_meta( $current_user->ID, 'wpforms_dismissed', true ); $learn_more = ''; // Check if not dismissed. if ( ! empty( $dismissed[ 'dyk-' . $this->page ] ) ) { return; } // Check if next page exists. if ( $wp_list_table->get_pagination_arg( 'total_pages' ) <= $wp_list_table->get_pagenum() ) { return; } $translations = array( 'upgrade_to_pro' => __( 'Upgrade to Pro', 'wpforms' ), 'dismiss_title' => __( 'Dismiss this message.', 'wpforms' ), 'did_you_know' => __( 'Did You Know?', 'wpforms' ), 'learn_more' => __( 'Learn More', 'wpforms' ), ); if ( ! empty( $dyk_message['more'] ) ) { $dyk_message['more'] = \add_query_arg( array( 'utm_source' => 'WordPress', 'utm_medium' => 'DYK ' . ucfirst( $this->page ), 'utm_campaign' => 'plugin', 'utm_content' => $dyk_message['item'], ), $dyk_message['more'] ); $learn_more = '<a href="' . \esc_url( $dyk_message['more'] ) . '" target="_blank" rel="noopener noreferrer" class="learn-more">' . \esc_html( $translations['learn_more'] ) . '</a>'; } printf( '<tr class="wpforms-dyk"> <td colspan="%d"> <div class="wpforms-dyk-fbox"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 352 512" class="wpforms-dyk-bulb" title="%s"><path d="M176 0C73.05 0-.12 83.54 0 176.24c.06 44.28 16.5 84.67 43.56 115.54C69.21 321.03 93.85 368.68 96 384l.06 75.18c0 3.15.94 6.22 2.68 8.84l24.51 36.84c2.97 4.46 7.97 7.14 13.32 7.14h78.85c5.36 0 10.36-2.68 13.32-7.14l24.51-36.84c1.74-2.62 2.67-5.7 2.68-8.84L256 384c2.26-15.72 26.99-63.19 52.44-92.22C335.55 260.85 352 220.37 352 176 352 78.8 273.2 0 176 0zm47.94 454.31L206.85 480h-61.71l-17.09-25.69-.01-6.31h95.9v6.31zm.04-38.31h-95.97l-.07-32h96.08l-.04 32zm60.4-145.32c-13.99 15.96-36.33 48.1-50.58 81.31H118.21c-14.26-33.22-36.59-65.35-50.58-81.31C44.5 244.3 32.13 210.85 32.05 176 31.87 99.01 92.43 32 176 32c79.4 0 144 64.6 144 144 0 34.85-12.65 68.48-35.62 94.68zM176 64c-61.75 0-112 50.25-112 112 0 8.84 7.16 16 16 16s16-7.16 16-16c0-44.11 35.88-80 80-80 8.84 0 16-7.16 16-16s-7.16-16-16-16z"/></svg> <div class="wpforms-dyk-message"><b>%s</b><br>%s</div> <div class="wpforms-dyk-buttons"> %s <a href="https://wpforms.com/pricing/?utm_source=WordPress&utm_medium=DYK%%20%s&utm_campaign=plugin&utm_content=%d" target="_blank" rel="noopener noreferrer" class="wpforms-btn wpforms-btn-md wpforms-btn-light-grey">%s</a> <button type="button" class="dismiss" title="%s" data-page="%s"/> </div> </div> </td> </tr>', count( $column_info[0] ), \esc_attr( $translations['did_you_know'] ), \esc_html( $translations['did_you_know'] ), \esc_html( $dyk_message['desc'] ), $learn_more, // phpcs:ignore esc_attr( ucfirst( $this->page ) ), (int) $dyk_message['item'], \esc_html( $translations['upgrade_to_pro'] ), \esc_attr( $translations['dismiss_title'] ), \esc_attr( $this->page ) ); } /** * Ajax handler for dissmissing DYK notices. * * @since 1.5.6 */ public function dyk_ajax_dismiss() { // Run a security check. \check_ajax_referer( 'wpforms-admin', 'nonce' ); // Check for permissions. if ( ! \wpforms_current_user_can() ) { \wp_send_json_error( array( 'error' => \esc_html__( 'You do not have permission to perform this action.', 'wpforms' ), ) ); } $current_user = \wp_get_current_user(); $dismissed = \get_user_meta( $current_user->ID, 'wpforms_dismissed', true ); if ( empty( $dismissed ) ) { $dismissed = array(); } $dismissed[ 'dyk-' . $this->page ] = time(); \update_user_meta( $current_user->ID, 'wpforms_dismissed', $dismissed ); \wp_send_json_success(); } /** * Load enqueues. * * @since 1.5.6 */ public function enqueues() { $min = \wpforms_get_min_suffix(); \wp_enqueue_script( 'wpforms-admin-education', \WPFORMS_PLUGIN_URL . "pro/assets/js/admin/education{$min}.js", array( 'jquery' ), \WPFORMS_VERSION, false ); } /** * Geolocation preview * * @since 1.6.3 */ public function geolocation() { $plugin_slug = 'wpforms-geolocation'; $plugin_file = sprintf( '%s/%s.php', $plugin_slug, $plugin_slug ); $dismissed = get_user_meta( get_current_user_id(), 'wpforms_dismissed', true ); if ( is_plugin_active( $plugin_file ) ) { return; } if ( ! empty( $dismissed['geolocation-education-metabox'] ) ) { return; } $plugins = get_plugins(); echo wpforms_render( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped 'education/geolocation', [ 'nonce_activate' => wp_create_nonce( 'wpforms-education-activate' ), 'nonce_hide' => wp_create_nonce( 'wpforms-education-hide' ), 'install' => ! empty( $plugins[ $plugin_file ] ), 'plugin_file' => $plugin_file, 'plugin_url' => $this->get_addon_download_url( $plugin_slug ), 'plugin_allow' => in_array( $this->license, [ 'pro', 'agency', 'ultimate', 'elite' ], true ), ], true ); } /** * Return a download URL for an addon. * * @since 1.6.3 * * @param string $slug Addon slug. * * @return string */ public function get_addon_download_url( $slug ) { if ( empty( $this->addons ) ) { return ''; } foreach ( $this->addons as $addon_data ) { if ( $addon_data->slug === $slug && ! empty( $addon_data->url ) ) { return $addon_data->url; } } return ''; } /** * Hide offer activation/purchase addon. * * @since 1.6.3 */ public function hide_education() { check_ajax_referer( 'wpforms-education-hide', 'nonce' ); $plugin = filter_input( INPUT_POST, 'plugin', FILTER_SANITIZE_STRING ); if ( empty( $plugin ) ) { wp_send_json( 0 ); } $current_user_id = get_current_user_id(); $dismissed = get_user_meta( $current_user_id, 'wpforms_dismissed', true ); $dismissed = is_array( $dismissed ) ? $dismissed : []; $dismissed['geolocation-education-metabox'] = time(); wp_send_json( update_user_meta( $current_user_id, 'wpforms_dismissed', $dismissed ) ); } }