JezK
Edit File: admin.php
<?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' ) ); } }