if ( ! defined( 'ABSPATH' ) ) {
* About WPForms admin page class.
const SLUG = 'wpforms-about';
* Default view for a page.
const DEFAULT_TAB = 'about';
* Array of license types, that are considered being top level and has no features difference.
public static $licenses_top = [ 'pro', 'agency', 'ultimate', 'elite' ];
* List of features that licenses are different with.
public static $licenses_features = [];
* The current active tab.
* Primary class constructor.
public function __construct() {
private function hooks() {
// Maybe load tools page.
add_action( 'admin_init', [ $this, 'init' ] );
* Determining if the user is viewing our page, if so, party on.
// Check what page we are on.
// phpcs:ignore WordPress.Security.NonceVerification.Recommended
$page = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '';
// Only load if we are actually on the settings page.
if ( $page !== self::SLUG ) {
* Define the core views for our tab.
$this->views = apply_filters(
'wpforms_admin_about_views',
esc_html__( 'About Us', 'wpforms-lite' ) => [ 'about' ],
esc_html__( 'Getting Started', 'wpforms-lite' ) => [ 'getting-started' ],
$license = $this->get_license_type();
! in_array( $license, self::$licenses_top, true )
$vs_tab_name = sprintf( /* translators: %1$s - current license type, %2$s - suggested license type. */
esc_html__( '%1$s vs %2$s', 'wpforms-lite' ),
$this->get_next_license( $license )
$this->views[ $vs_tab_name ] = [ 'versus' ];
// Determine the current active settings tab.
// phpcs:ignore WordPress.Security.NonceVerification.Recommended
$this->view = ! empty( $_GET['view'] ) ? sanitize_text_field( wp_unslash( $_GET['view'] ) ) : self::DEFAULT_TAB;
// If the user tries to load an invalid view - fallback to About Us.
! in_array( $this->view, call_user_func_array( 'array_merge', array_values( $this->views ) ), true ) &&
! has_action( 'wpforms_admin_about_display_tab_' . sanitize_key( $this->view ) )
$this->view = self::DEFAULT_TAB;
add_action( 'wpforms_admin_page', [ $this, 'output' ] );
do_action( 'wpforms_admin_about_init' );
* Output the basic page structure.
public function output() {
foreach ( $this->views as $view ) {
if ( in_array( $this->view, (array) $view, true ) ) {
<div id="wpforms-admin-about" class="wrap wpforms-admin-wrap">
$license = $this->get_license_type();
$next_license = $this->get_next_license( $license );
echo '<ul class="wpforms-admin-tabs">';
foreach ( $this->views as $label => $view ) {
$class = in_array( $this->view, $view, true ) ? 'active' : '';
'<a href="%s" class="%s">%s</a>',
esc_url( admin_url( 'admin.php?page=' . self::SLUG . '&view=' . sanitize_key( $view[0] ) ) ),
<h1 class="wpforms-h1-placeholder"></h1>
$this->output_getting_started();
do_action( 'wpforms_admin_about_display_tab_' . sanitize_key( $this->view ) );
* Display the About tab content.
protected function output_about() {
$this->output_about_info();
$this->output_about_addons();
* Display the General Info section of About tab.
protected function output_about_info() {
<div class="wpforms-admin-about-section wpforms-admin-columns">
<div class="wpforms-admin-column-60">
<?php esc_html_e( 'Hello and welcome to WPForms, the most beginner friendly drag & drop WordPress forms plugin. At WPForms, we build software that helps you create beautiful responsive online forms for your website in minutes.', 'wpforms-lite' ); ?>
<?php esc_html_e( 'Over the years, we found that most WordPress contact form plugins were bloated, buggy, slow, and very hard to use. So we started with a simple goal: build a WordPress forms plugin that’s both easy and powerful.', 'wpforms-lite' ); ?>
<?php esc_html_e( 'Our goal is to take the pain out of creating online forms and make it easy.', 'wpforms-lite' ); ?>
wp_kses( /* translators: %1$s - WPBeginner URL, %2$s - OptinMonster URL, %3$s - MonsterInsights URL. */
__( 'WPForms is brought to you by the same team that’s behind the largest WordPress resource site, <a href="%1$s" target="_blank" rel="noopener noreferrer">WPBeginner</a>, the most popular lead-generation software, <a href="%2$s" target="_blank" rel="noopener noreferrer">OptinMonster</a>, the best WordPress analytics plugin, <a href="%3$s" target="_blank" rel="noopener noreferrer">MonsterInsights</a>, and more!', 'wpforms-lite' ),
'https://www.wpbeginner.com/?utm_source=wpformsplugin&utm_medium=pluginaboutpage&utm_campaign=aboutwpforms',
'https://optinmonster.com/?utm_source=wpformsplugin&utm_medium=pluginaboutpage&utm_campaign=aboutwpforms',
'https://www.monsterinsights.com/?utm_source=wpformsplugin&utm_medium=pluginaboutpage&utm_campaign=aboutwpforms'
<?php esc_html_e( 'Yup, we know a thing or two about building awesome products that customers love.', 'wpforms-lite' ); ?>
<div class="wpforms-admin-column-40 wpforms-admin-column-last">
<img src="<?php echo esc_url( WPFORMS_PLUGIN_URL . 'assets/images/about/team.jpg' ); ?>" alt="<?php esc_attr_e( 'The WPForms Team photo', 'wpforms-lite' ); ?>">
<?php esc_html_e( 'The WPForms Team', 'wpforms-lite' ); ?><br>
* Display the Addons section of About tab.
protected function output_about_addons() {
if ( ! wpforms_current_user_can() ) {
$all_plugins = get_plugins();
$am_plugins = $this->get_am_plugins();
$can_install_plugins = wpforms_can_install( 'plugin' );
$can_activate_plugins = wpforms_can_activate( 'plugin' );
<div id="wpforms-admin-addons">
<div class="addons-container">
foreach ( $am_plugins as $plugin => $details ) :
$plugin_data = $this->get_plugin_data( $plugin, $details, $all_plugins );
$plugin_ready_to_activate = $can_activate_plugins
&& isset( $plugin_data['status_class'] )
&& $plugin_data['status_class'] === 'status-installed';
$plugin_not_activated = ! isset( $plugin_data['status_class'] )
|| $plugin_data['status_class'] !== 'status-active';
<div class="addon-container">
<div class="details wpforms-clear">
<img src="<?php echo esc_url( $plugin_data['details']['icon'] ); ?>" alt="<?php echo esc_attr( $plugin_data['details']['name'] ); ?>">
<?php echo esc_html( $plugin_data['details']['name'] ); ?>
<?php echo wp_kses_post( $plugin_data['details']['desc'] ); ?>
<div class="actions wpforms-clear">
printf( /* translators: %s - status label. */
esc_html__( 'Status: %s', 'wpforms-lite' ),
'<span class="status-label ' . esc_attr( $plugin_data['status_class'] ) . '">' . wp_kses_post( $plugin_data['status_text'] ) . '</span>'
<div class="action-button">
<?php if ( $can_install_plugins || $plugin_ready_to_activate || ! $details['wporg'] ) { ?>
<button class="<?php echo esc_attr( $plugin_data['action_class'] ); ?>" data-plugin="<?php echo esc_attr( $plugin_data['plugin_src'] ); ?>" data-type="plugin">
<?php echo wp_kses_post( $plugin_data['action_text'] ); ?>
<?php } elseif ( $plugin_not_activated ) { ?>
<a href="<?php echo esc_url( $details['wporg'] ); ?>" target="_blank" rel="noopener noreferrer">
<?php esc_html_e( 'WordPress.org', 'wpforms-lite' ); ?>
<span aria-hidden="true" class="dashicons dashicons-external"></span>
* Get AM plugin data to display in the Addons section of About tab.
* @param string $plugin Plugin slug.
* @param array $details Plugin details.
* @param array $all_plugins List of all plugins.
protected function get_plugin_data( $plugin, $details, $all_plugins ) {
$have_pro = ( ! empty( $details['pro'] ) && ! empty( $details['pro']['plug'] ) );
if ( array_key_exists( $plugin, $all_plugins ) ) {
if ( is_plugin_active( $plugin ) ) {
if ( array_key_exists( $details['pro']['plug'], $all_plugins ) ) {
$plugin = $details['pro']['plug'];
$details = $details['pro'];
if ( array_key_exists( $plugin, $all_plugins ) ) {
if ( is_plugin_active( $plugin ) ) {
$plugin_data['status_class'] = 'status-active';
$plugin_data['status_text'] = esc_html__( 'Active', 'wpforms-lite' );
$plugin_data['action_class'] = $plugin_data['status_class'] . ' button button-secondary disabled';
$plugin_data['action_text'] = esc_html__( 'Activated', 'wpforms-lite' );
$plugin_data['plugin_src'] = esc_attr( $plugin );
$plugin_data['status_class'] = 'status-installed';
$plugin_data['status_text'] = esc_html__( 'Inactive', 'wpforms-lite' );
$plugin_data['action_class'] = $plugin_data['status_class'] . ' button button-secondary';
$plugin_data['action_text'] = esc_html__( 'Activate', 'wpforms-lite' );
$plugin_data['plugin_src'] = esc_attr( $plugin );
// Doesn't exist, install.
$plugin_data['status_class'] = 'status-missing';
if ( isset( $details['act'] ) && 'go-to-url' === $details['act'] ) {
$plugin_data['status_class'] = 'status-go-to-url';
$plugin_data['status_text'] = esc_html__( 'Not Installed', 'wpforms-lite' );
$plugin_data['action_class'] = $plugin_data['status_class'] . ' button button-primary';
$plugin_data['action_text'] = esc_html__( 'Install Plugin', 'wpforms-lite' );
$plugin_data['plugin_src'] = esc_url( $details['url'] );
$plugin_data['details'] = $details;
* Display the Getting Started tab content.
protected function output_getting_started() {
$license = $this->get_license_type();
$utm_campaign = $license === 'lite' ? 'liteplugin' : 'plugin';
'add-new' => "https://wpforms.com/docs/creating-first-form/?utm_source=WordPress&utm_medium=wpforms-about-page&utm_campaign={$utm_campaign}&utm_content=How to Add a New Form#add-new",
'customize-fields' => "https://wpforms.com/docs/creating-first-form/?utm_source=WordPress&utm_medium=wpforms-about-page&utm_campaign={$utm_campaign}&utm_content=How to Customize Form Fields#customize-fields",
'display-form' => "https://wpforms.com/docs/creating-first-form/?utm_source=WordPress&utm_medium=wpforms-about-page&utm_campaign={$utm_campaign}&utm_content=How to Display Forms on Your Site#display-form",
'right-form-field' => "https://wpforms.com/docs/how-to-choose-the-right-form-field-for-your-forms/?utm_source=WordPress&utm_medium=wpforms-about-page&utm_campaign={$utm_campaign}&utm_content=How to Choose the Right Form Field",
'complete-guide' => "https://wpforms.com/docs/a-complete-guide-to-wpforms-settings/?utm_source=WordPress&utm_medium=wpforms-about-page&utm_campaign={$utm_campaign}&utm_content=A Complete Guide to WPForms Settings",
'gdpr-compliant' => "https://wpforms.com/docs/how-to-create-gdpr-compliant-forms/?utm_source=WordPress&utm_medium=wpforms-about-page&utm_campaign={$utm_campaign}&utm_content=How to Create GDPR Complaint Forms",
'install-activate-addons' => "https://wpforms.com/docs/install-activate-wpforms-addons/?utm_source=WordPress&utm_medium=wpforms-about-page&utm_campaign={$utm_campaign}&utm_content=How to Install and Activate WPForms Addons",
<div class="wpforms-admin-about-section wpforms-admin-about-section-first-form" style="display:flex;">
<div class="wpforms-admin-about-section-first-form-text">
<?php esc_html_e( 'Creating Your First Form', 'wpforms-lite' ); ?>
<?php esc_html_e( 'Want to get started creating your first form with WPForms? By following the step by step instructions in this walkthrough, you can easily publish your first form on your site.', 'wpforms-lite' ); ?>
<?php esc_html_e( 'To begin, you’ll need to be logged into the WordPress admin area. Once there, click on WPForms in the admin sidebar to go to the Forms Overview page.', 'wpforms-lite' ); ?>
<?php esc_html_e( 'In the Forms Overview page, the forms list will be empty because there are no forms yet. To create a new form, click on the Add New button, and this will launch the WPForms Form Builder.', 'wpforms-lite' ); ?>
<a href="<?php echo esc_url( $links['add-new'] ); ?>" target="_blank" rel="noopener noreferrer">
<?php esc_html_e( 'How to Add a New Form', 'wpforms-lite' ); ?>
<a href="<?php echo esc_url( $links['customize-fields'] ); ?>" target="_blank" rel="noopener noreferrer">
<?php esc_html_e( 'How to Customize Form Fields', 'wpforms-lite' ); ?>
<a href="<?php echo esc_url( $links['display-form'] ); ?>" target="_blank" rel="noopener noreferrer">
<?php esc_html_e( 'How to Display Forms on Your Site', 'wpforms-lite' ); ?>
<div class="wpforms-admin-about-section-first-form-video">
<iframe src="https://www.youtube-nocookie.com/embed/SQ9kV9SKz5k?rel=0" width="540" height="304" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
<?php if ( ! in_array( $license, self::$licenses_top, true ) ) { ?>
<div class="wpforms-admin-about-section wpforms-admin-about-section-hero">