• File: admin.php
  • Full Path: /home/slvgwrnz/public_html/wp-content/plugins/contact-form-7/admin/admin.php
  • Date Modified: 09/22/2026 4:00 AM
  • File size: 17.01 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php

if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly

require_once WPCF7_PLUGIN_DIR . '/admin/includes/admin-functions.php';
require_once WPCF7_PLUGIN_DIR . '/admin/includes/list-table.php';
require_once WPCF7_PLUGIN_DIR . '/admin/includes/help-tabs.php';
require_once WPCF7_PLUGIN_DIR . '/admin/includes/tag-generator.php';
require_once WPCF7_PLUGIN_DIR . '/admin/includes/config-validator.php';
require_once WPCF7_PLUGIN_DIR . '/admin/includes/ajax-actions.php';


add_action(
	'admin_init',
	static function () {
		do_action( 'wpcf7_admin_init' );
	},
	10, 0
);


add_action(
	'admin_menu',
	'wpcf7_admin_menu',
	9, 0
);

function wpcf7_admin_menu() {
	do_action( 'wpcf7_admin_menu' );

	add_menu_page(
		__( 'Contact Form 7 Dashboard', 'contact-form-7' ),
		__( 'Contact', 'contact-form-7' )
			. wpcf7_admin_menu_change_notice(),
		'wpcf7_read_contact_forms',
		'wpcf7-dashboard',
		'wpcf7_admin_dashboard_page',
		'dashicons-email',
		30
	);

	$dashboard = add_submenu_page(
		'wpcf7-dashboard',
		__( 'Contact Form 7 Dashboard', 'contact-form-7' ),
		__( 'Dashboard', 'contact-form-7' )
			. wpcf7_admin_menu_change_notice( 'wpcf7-dashboard' ),
		'wpcf7_read_contact_forms',
		'wpcf7-dashboard',
		'wpcf7_admin_dashboard_page'
	);

	add_action( 'load-' . $dashboard, 'wpcf7_load_dashboard_page', 10, 0 );

	$edit = add_submenu_page(
		'wpcf7-dashboard',
		wpcf7_get_current_contact_form()
			? __( 'Edit Contact Form', 'contact-form-7' )
			: __( 'Contact Forms', 'contact-form-7' ),
		__( 'Contact Forms', 'contact-form-7' )
			. wpcf7_admin_menu_change_notice( 'wpcf7' ),
		'wpcf7_read_contact_forms',
		'wpcf7',
		'wpcf7_admin_management_page'
	);

	add_action( 'load-' . $edit, 'wpcf7_load_contact_form_admin', 10, 0 );

	$addnew = add_submenu_page(
		'wpcf7-dashboard',
		__( 'Add Contact Form', 'contact-form-7' ),
		__( 'Add Contact Form', 'contact-form-7' )
			. wpcf7_admin_menu_change_notice( 'wpcf7-new' ),
		'wpcf7_edit_contact_forms',
		'wpcf7-new',
		'wpcf7_admin_add_new_page'
	);

	add_action( 'load-' . $addnew, 'wpcf7_load_contact_form_admin', 10, 0 );

	$integration = WPCF7_Integration::get_instance();

	if ( $integration->service_exists() ) {
		$integration = add_submenu_page(
			'wpcf7-dashboard',
			__( 'Integration with External API', 'contact-form-7' ),
			__( 'Integration', 'contact-form-7' )
				. wpcf7_admin_menu_change_notice( 'wpcf7-integration' ),
			'wpcf7_manage_integration',
			'wpcf7-integration',
			'wpcf7_admin_integration_page'
		);

		add_action( 'load-' . $integration, 'wpcf7_load_integration_page', 10, 0 );
	}
}


function wpcf7_admin_menu_change_notice( $menu_slug = '' ) {
	$counts = apply_filters( 'wpcf7_admin_menu_change_notice',
		array(
			'wpcf7' => 0,
			'wpcf7-new' => 0,
			'wpcf7-integration' => 0,
		)
	);

	if ( empty( $menu_slug ) ) {
		$count = absint( array_sum( $counts ) );
	} elseif ( isset( $counts[$menu_slug] ) ) {
		$count = absint( $counts[$menu_slug] );
	} else {
		$count = 0;
	}

	if ( $count ) {
		return sprintf(
			' <span class="update-plugins %1$d"><span class="plugin-count">%2$s</span></span>',
			$count,
			esc_html( number_format_i18n( $count ) )
		);
	}

	return '';
}


add_action(
	'admin_enqueue_scripts',
	'wpcf7_admin_enqueue_scripts',
	10, 1
);

function wpcf7_admin_enqueue_scripts( $hook_suffix ) {
	if ( ! str_contains( $hook_suffix, 'wpcf7' ) ) {
		return;
	}

	wp_enqueue_style( 'contact-form-7-admin',
		wpcf7_plugin_url( 'admin/includes/css/styles.css' ),
		array(), WPCF7_VERSION, 'all'
	);

	if ( wpcf7_is_rtl() ) {
		wp_enqueue_style( 'contact-form-7-admin-rtl',
			wpcf7_plugin_url( 'admin/includes/css/styles-rtl.css' ),
			array(), WPCF7_VERSION, 'all'
		);
	}

	$assets = include wpcf7_plugin_path( 'admin/includes/js/index.asset.php' );

	$assets = wp_parse_args( $assets, array(
		'dependencies' => array(),
		'version' => WPCF7_VERSION,
	) );

	wp_enqueue_script( 'wpcf7-admin',
		wpcf7_plugin_url( 'admin/includes/js/index.js' ),
		$assets['dependencies'],
		$assets['version'],
		array( 'in_footer' => true )
	);

	wp_set_script_translations( 'wpcf7-admin', 'contact-form-7' );

	$wpcf7_obj = array(
		'apiSettings' => array(
			'root' => sanitize_url( rest_url( 'contact-form-7/v1' ) ),
			'namespace' => 'contact-form-7/v1',
		),
	);

	$post = wpcf7_get_current_contact_form();

	if ( $post ) {
		$wpcf7_obj = array_merge( $wpcf7_obj, array(
			'nonce' => array(
				'save' => wp_create_nonce(
					sprintf(
						'wpcf7-save-contact-form_%s',
						$post->initial() ? -1 : $post->id()
					)
				),
				'copy' => wp_create_nonce(
					sprintf(
						'wpcf7-copy-contact-form_%s',
						$post->initial() ? -1 : $post->id()
					)
				),
				'delete' => wp_create_nonce(
					sprintf(
						'wpcf7-delete-contact-form_%s',
						$post->initial() ? -1 : $post->id()
					)
				),
			),
			'configValidator' => array(
				'errors' => array(),
				'docUrl' => WPCF7_ConfigValidator::get_doc_link(),
			),
		) );

		if (
			current_user_can( 'wpcf7_edit_contact_form', $post->id() ) and
			wpcf7_validate_configuration()
		) {
			$config_validator = new WPCF7_ConfigValidator( $post );
			$config_validator->restore();

			$wpcf7_obj['configValidator'] = array_merge(
				$wpcf7_obj['configValidator'],
				array(
					'errors' => $config_validator->collect_error_messages(
						array( 'decodes_html_entities' => true )
					),
				)
			);
		}
	}

	wp_add_inline_script( 'wpcf7-admin',
		sprintf(
			'var wpcf7 = %s;',
			wp_json_encode( $wpcf7_obj, JSON_PRETTY_PRINT )
		),
		'before'
	);
}


add_filter(
	'set_screen_option_wpcf7_contact_forms_per_page',
	static function ( $result, $option, $value ) {
		$wpcf7_screens = array(
			'wpcf7_contact_forms_per_page',
		);

		if ( in_array( $option, $wpcf7_screens, true ) ) {
			$result = $value;
		}

		return $result;
	},
	10, 3
);


function wpcf7_load_dashboard_page() {
	do_action( 'wpcf7_admin_load',
		wpcf7_superglobal_get( 'page' ),
		wpcf7_current_action()
	);

	require_once WPCF7_PLUGIN_DIR . '/admin/includes/dashboard.php';

	wpcf7_dashboard_setup();

	wp_enqueue_script( 'dashboard' );
}


function wpcf7_admin_dashboard_page() {
	global $wp_meta_boxes;

	$screen = get_current_screen();
	$page = $screen->id;
	$core_widget_ids = array_keys( wpcf7_dashboard_widgets() );

	foreach ( $wp_meta_boxes[$page] as $context => $priorities ) {
		foreach ( $priorities as $priority => $boxes ) {
			if ( ! in_array( $priority, array( 'high', 'core' ), true ) ) {
				continue;
			}

			foreach ( $boxes as $box_id => $box ) {
				if ( in_array( $box_id, $core_widget_ids, true ) ) {
					continue;
				}

				if ( ! isset( $priorities['default'][$box_id] ) ) {
					$wp_meta_boxes[$page][$context]['default'][$box_id] = $box;
				} elseif ( ! isset( $priorities['low'][$box_id] ) ) {
					$wp_meta_boxes[$page][$context]['low'][$box_id] = $box;
				}

				unset( $wp_meta_boxes[$page][$context][$priority][$box_id] );
			}
		}
	}

	require_once WPCF7_PLUGIN_DIR . '/admin/dashboard.php';
}


function wpcf7_load_contact_form_admin() {
	global $plugin_page;

	$action = wpcf7_current_action();

	do_action( 'wpcf7_admin_load',
		wpcf7_superglobal_get( 'page' ),
		$action
	);

	if ( 'save' === $action ) {
		$id = wpcf7_superglobal_post( 'post_ID', '-1' );

		check_admin_referer( 'wpcf7-save-contact-form_' . $id );

		if ( ! current_user_can( 'wpcf7_edit_contact_form', $id ) ) {
			wp_die(
				esc_html( __( 'You are not allowed to edit this item.', 'contact-form-7' ) )
			);
		}

		$contact_form = wpcf7_save_contact_form(
			array_merge(
				wp_unslash( $_REQUEST ),
				array(
					'id' => $id,
					'title' => wpcf7_superglobal_post( 'post_title', null ),
					'locale' => wpcf7_superglobal_post( 'wpcf7-locale', null ),
					'form' => wpcf7_superglobal_post( 'wpcf7-form', '' ),
					'mail' => wpcf7_superglobal_post( 'wpcf7-mail', array() ),
					'mail_2' => wpcf7_superglobal_post( 'wpcf7-mail-2', array() ),
					'messages' => wpcf7_superglobal_post( 'wpcf7-messages', array() ),
					'additional_settings' => wpcf7_superglobal_post( 'wpcf7-additional-settings', '' ),
				)
			)
		);

		if ( $contact_form and wpcf7_validate_configuration() ) {
			$config_validator = new WPCF7_ConfigValidator( $contact_form );
			$config_validator->validate();
			$config_validator->save();
		}

		$query = array(
			'post' => $contact_form ? $contact_form->id() : 0,
			'active-tab' => wpcf7_canonicalize_name(
				wpcf7_superglobal_post( 'active-tab' )
			),
		);

		if ( ! $contact_form ) {
			$query['message'] = 'failed';
		} elseif ( -1 === (int) $id ) {
			$query['message'] = 'created';
		} else {
			$query['message'] = 'saved';
		}

		$redirect_to = add_query_arg( $query, menu_page_url( 'wpcf7', false ) );
		wp_safe_redirect( $redirect_to );
		exit();
	}

	if ( 'copy' === $action ) {
		$id = absint( $_POST['post_ID'] ?? $_REQUEST['post'] ?? '' );

		check_admin_referer( 'wpcf7-copy-contact-form_' . $id );

		if ( ! current_user_can( 'wpcf7_edit_contact_form', $id ) ) {
			wp_die(
				esc_html( __( 'You are not allowed to edit this item.', 'contact-form-7' ) )
			);
		}

		$query = array();

		if ( $contact_form = wpcf7_contact_form( $id ) ) {
			$new_contact_form = $contact_form->copy();
			$new_contact_form->save();

			$query['post'] = $new_contact_form->id();
			$query['message'] = 'created';
		}

		$redirect_to = add_query_arg( $query, menu_page_url( 'wpcf7', false ) );

		wp_safe_redirect( $redirect_to );
		exit();
	}

	if ( 'delete' === $action ) {
		$nonce_action = 'bulk-posts';

		if (
			$post_id = wpcf7_superglobal_post( 'post_ID' ) or
			! is_array( $post_id = wpcf7_superglobal_request( 'post', array() ) )
		) {
			$nonce_action = sprintf( 'wpcf7-delete-contact-form_%s', $post_id );
		}

		check_admin_referer( $nonce_action );

		$posts = array_filter( (array) $post_id );

		$deleted = 0;

		foreach ( $posts as $post ) {
			$post = WPCF7_ContactForm::get_instance( $post );

			if ( empty( $post ) ) {
				continue;
			}

			if ( ! current_user_can( 'wpcf7_delete_contact_form', $post->id() ) ) {
				wp_die(
					esc_html( __( 'You are not allowed to delete this item.', 'contact-form-7' ) )
				);
			}

			if ( ! $post->delete() ) {
				wp_die(
					esc_html( __( 'Error in deleting.', 'contact-form-7' ) )
				);
			}

			$deleted += 1;
		}

		$query = array();

		if ( ! empty( $deleted ) ) {
			$query['message'] = 'deleted';
		}

		$redirect_to = add_query_arg( $query, menu_page_url( 'wpcf7', false ) );

		wp_safe_redirect( $redirect_to );
		exit();
	}

	$post = null;

	if ( 'wpcf7-new' === $plugin_page ) {
		$post = WPCF7_ContactForm::get_template( array(
			'locale' => wpcf7_superglobal_get( 'locale', null ),
		) );
	} elseif ( $post_id = wpcf7_superglobal_get( 'post' ) ) {
		$post = WPCF7_ContactForm::get_instance( $post_id );
	}

	$current_screen = get_current_screen();

	$help_tabs = new WPCF7_Help_Tabs( $current_screen );

	if ( $post and current_user_can( 'wpcf7_edit_contact_form', $post->id() ) ) {
		$help_tabs->set_help_tabs( 'edit' );
	} else {
		// Construct a list table before get_column_headers() is called.
		WPCF7_List_Table::get_instance();

		add_screen_option( 'per_page', array(
			'default' => 20,
			'option' => 'wpcf7_contact_forms_per_page',
		) );

		$help_tabs->set_help_tabs( 'list' );
	}
}


function wpcf7_admin_management_page() {
	if ( $post = wpcf7_get_current_contact_form() ) {
		$post_id = $post->initial() ? -1 : $post->id();

		require_once WPCF7_PLUGIN_DIR . '/admin/includes/editor.php';
		require_once WPCF7_PLUGIN_DIR . '/admin/edit-contact-form.php';
		return;
	}

	if (
		'validate' === wpcf7_current_action() and
		wpcf7_validate_configuration() and
		current_user_can( 'wpcf7_edit_contact_forms' )
	) {
		wpcf7_admin_bulk_validate_page();
		return;
	}

	require_once WPCF7_PLUGIN_DIR . '/admin/contact-forms.php';
}


function wpcf7_admin_add_new_page() {
	$post = wpcf7_get_current_contact_form();

	if ( ! $post ) {
		$post = WPCF7_ContactForm::get_template();
	}

	$post_id = -1;

	require_once WPCF7_PLUGIN_DIR . '/admin/includes/editor.php';
	require_once WPCF7_PLUGIN_DIR . '/admin/edit-contact-form.php';
}


function wpcf7_load_integration_page() {
	do_action( 'wpcf7_admin_load',
		wpcf7_superglobal_get( 'page' ),
		wpcf7_current_action()
	);

	$integration = WPCF7_Integration::get_instance();

	if (
		$service_name = wpcf7_superglobal_request( 'service' ) and
		$integration->service_exists( $service_name )
	) {
		$service = $integration->get_service( $service_name );
		$service->load( wpcf7_current_action() );
	}

	$help_tabs = new WPCF7_Help_Tabs( get_current_screen() );
	$help_tabs->set_help_tabs( 'integration' );
}


function wpcf7_admin_integration_page() {
	require_once WPCF7_PLUGIN_DIR . '/admin/integration.php';
}


add_action( 'wpcf7_admin_notices', 'wpcf7_admin_updated_message', 10, 3 );

function wpcf7_admin_updated_message( $page, $action, $object ) {
	if ( ! in_array( $page, array( 'wpcf7', 'wpcf7-new' ), true ) ) {
		return;
	}

	$message_type = wpcf7_superglobal_request( 'message' );

	if ( ! $message_type ) {
		return;
	}

	$notice_type = 'success';

	if ( 'created' === $message_type ) {
		$message = __( 'Contact form created.', 'contact-form-7' );
	} elseif ( 'saved' === $message_type ) {
		$message = __( 'Contact form saved.', 'contact-form-7' );
	} elseif ( 'deleted' === $message_type ) {
		$message = __( 'Contact form deleted.', 'contact-form-7' );
	} elseif ( 'failed' === $message_type ) {
		$notice_type = 'error';
		$message = __( 'There was an error saving the contact form.', 'contact-form-7' );
	} elseif ( 'validated' === $message_type ) {
		$bulk_validate = WPCF7::get_option( 'bulk_validate', array() );
		$count_invalid = absint( $bulk_validate['count_invalid'] ?? 0 );

		if ( $count_invalid ) {
			$notice_type = 'warning';

			$message = sprintf(
				/* translators: %s: number of contact forms */
				_n(
					'Configuration validation completed. %s invalid contact form was found.',
					'Configuration validation completed. %s invalid contact forms were found.',
					$count_invalid, 'contact-form-7'
				),
				number_format_i18n( $count_invalid )
			);
		} else {
			$message = __( 'Configuration validation completed. No invalid contact form was found.', 'contact-form-7' );
		}
	}

	if ( ! empty( $message ) ) {
		wp_admin_notice(
			$message,
			array( 'type' => $notice_type )
		);
	}
}


add_filter( 'plugin_action_links', 'wpcf7_plugin_action_links', 10, 2 );

function wpcf7_plugin_action_links( $links, $file ) {
	if ( WPCF7_PLUGIN_BASENAME !== $file ) {
		return $links;
	}

	if ( ! current_user_can( 'wpcf7_read_contact_forms' ) ) {
		return $links;
	}

	$settings_link = wpcf7_link(
		menu_page_url( 'wpcf7-dashboard', false ),
		__( 'Settings', 'contact-form-7' )
	);

	array_unshift( $links, $settings_link );

	return $links;
}


add_action( 'wpcf7_admin_warnings', 'wpcf7_old_wp_version_error', 10, 3 );

function wpcf7_old_wp_version_error( $page, $action, $object ) {
	$wp_version = get_bloginfo( 'version' );

	if ( version_compare( $wp_version, WPCF7_REQUIRED_WP_VERSION, '<' ) ) {
		wp_admin_notice(
			sprintf(
				/* translators: 1: version of Contact Form 7, 2: version of WordPress, 3: URL */
				__( '<strong>Contact Form 7 %1$s requires WordPress %2$s or higher.</strong> Please <a href="%3$s">update WordPress</a> first.', 'contact-form-7' ),
				WPCF7_VERSION,
				WPCF7_REQUIRED_WP_VERSION,
				admin_url( 'update-core.php' )
			),
			array( 'type' => 'warning' )
		);
	}
}


add_action( 'wpcf7_admin_warnings', 'wpcf7_not_allowed_to_edit', 10, 3 );

function wpcf7_not_allowed_to_edit( $page, $action, $object ) {
	if ( $object instanceof WPCF7_ContactForm ) {
		$contact_form = $object;
	} else {
		return;
	}

	if ( ! current_user_can( 'wpcf7_edit_contact_form', $contact_form->id() ) ) {
		wp_admin_notice(
			__( 'You are not allowed to edit this contact form.', 'contact-form-7' ),
			array( 'type' => 'warning' )
		);
	}
}


add_action( 'wpcf7_admin_warnings', 'wpcf7_ctct_deprecated_warning', 10, 3 );

function wpcf7_ctct_deprecated_warning( $page, $action, $object ) {
	$service = WPCF7_ConstantContact::get_instance();

	if ( $service->is_active() ) {
		wp_admin_notice(
			sprintf(
				/* translators: 1: URL to announcement post, 2: URL to Brevo integration doc */
				__( 'Contact Form 7 has completed the <a href="%1$s">removal of the Constant Contact integration</a>. We recommend <a href="%2$s">Brevo</a> as an alternative.', 'contact-form-7' ),
				'https://contactform7.com/2025/01/08/complete-removal-of-constant-contact-integration/',
				'https://contactform7.com/sendinblue-integration/'
			),
			array( 'type' => 'warning' )
		);
	}
}


add_action( 'wpcf7_admin_warnings', 'wpcf7_captcha_future_warning', 10, 3 );

function wpcf7_captcha_future_warning( $page, $action, $object ) {
	$service = WPCF7_RECAPTCHA::get_instance();

	if ( $service->is_active() ) {
		wp_admin_notice(
			sprintf(
				/* translators: %s: URL to Turnstile integration doc */
				__( '<strong>Attention reCAPTCHA users:</strong> Google attempts to make all reCAPTCHA users migrate to reCAPTCHA Enterprise, meaning Google charges you for API calls exceeding the free tier. Contact Form 7 supports <a href="%s">Cloudflare Turnstile</a>, and we recommend it unless you have reasons to use reCAPTCHA.', 'contact-form-7' ),
				'https://contactform7.com/turnstile-integration/'
			),
			array( 'type' => 'warning' )
		);
	}
}