Changed source root directory

This commit is contained in:
2026-03-05 16:30:11 +01:00
parent dc85447ee1
commit 538f85d7a2
5868 changed files with 749734 additions and 99 deletions

View File

@@ -0,0 +1,759 @@
<?php
require_once WPCF7_PLUGIN_DIR . '/admin/includes/admin-functions.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/welcome-panel.php';
require_once WPCF7_PLUGIN_DIR . '/admin/includes/config-validator.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', 'contact-form-7' ),
__( 'Contact', 'contact-form-7' )
. wpcf7_admin_menu_change_notice(),
'wpcf7_read_contact_forms',
'wpcf7',
'wpcf7_admin_management_page',
'dashicons-email',
30
);
$edit = add_submenu_page( 'wpcf7',
__( 'Edit Contact Form', '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',
__( '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',
__( '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 ( false === strpos( $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_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 {
$help_tabs->set_help_tabs( 'list' );
if ( ! class_exists( 'WPCF7_Contact_Form_List_Table' ) ) {
require_once WPCF7_PLUGIN_DIR . '/admin/includes/class-contact-forms-list-table.php';
}
add_filter(
'manage_' . $current_screen->id . '_columns',
array( 'WPCF7_Contact_Form_List_Table', 'define_columns' ),
10, 0
);
add_screen_option( 'per_page', array(
'default' => 20,
'option' => 'wpcf7_contact_forms_per_page',
) );
}
}
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;
}
$list_table = new WPCF7_Contact_Form_List_Table();
$list_table->prepare_items();
$formatter = new WPCF7_HTMLFormatter( array(
'allowed_html' => array_merge( wpcf7_kses_allowed_html(), array(
'form' => array(
'method' => true,
),
) ),
) );
$formatter->append_start_tag( 'div', array(
'class' => 'wrap',
'id' => 'wpcf7-contact-form-list-table',
) );
$formatter->append_start_tag( 'h1', array(
'class' => 'wp-heading-inline',
) );
$formatter->append_preformatted(
esc_html( __( 'Contact Forms', 'contact-form-7' ) )
);
$formatter->end_tag( 'h1' );
if ( current_user_can( 'wpcf7_edit_contact_forms' ) ) {
$formatter->append_preformatted(
wpcf7_link(
menu_page_url( 'wpcf7-new', false ),
__( 'Add Contact Form', 'contact-form-7' ),
array( 'class' => 'page-title-action' )
)
);
}
if ( $search_keyword = wpcf7_superglobal_request( 's' ) ) {
$formatter->append_start_tag( 'span', array(
'class' => 'subtitle',
) );
$formatter->append_preformatted(
sprintf(
/* translators: %s: Search query. */
__( 'Search results for: <strong>%s</strong>', 'contact-form-7' ),
esc_html( $search_keyword )
)
);
$formatter->end_tag( 'span' );
}
$formatter->append_start_tag( 'hr', array(
'class' => 'wp-header-end',
) );
$formatter->call_user_func( static function () {
do_action( 'wpcf7_admin_warnings',
'wpcf7', wpcf7_current_action(), null
);
wpcf7_welcome_panel();
do_action( 'wpcf7_admin_notices',
'wpcf7', wpcf7_current_action(), null
);
} );
$formatter->append_start_tag( 'form', array(
'method' => 'get',
) );
$formatter->append_start_tag( 'input', array(
'type' => 'hidden',
'name' => 'page',
'value' => wpcf7_superglobal_request( 'page' ),
) );
$formatter->call_user_func( static function () use ( $list_table ) {
$list_table->search_box(
__( 'Search Contact Forms', 'contact-form-7' ),
'wpcf7-contact'
);
$list_table->display();
} );
$formatter->print();
}
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() {
$integration = WPCF7_Integration::get_instance();
$service_name = wpcf7_superglobal_request( 'service' );
$service = null;
if ( $service_name and $integration->service_exists( $service_name ) ) {
$service = $integration->get_service( $service_name );
}
$formatter = new WPCF7_HTMLFormatter( array(
'allowed_html' => array_merge( wpcf7_kses_allowed_html(), array(
'form' => array(
'action' => true,
'method' => true,
),
) ),
) );
$formatter->append_start_tag( 'div', array(
'class' => 'wrap',
'id' => 'wpcf7-integration',
) );
$formatter->append_start_tag( 'h1' );
$formatter->append_preformatted(
esc_html( __( 'Integration with External API', 'contact-form-7' ) )
);
$formatter->end_tag( 'h1' );
$formatter->append_start_tag( 'p' );
$formatter->append_preformatted(
sprintf(
/* translators: %s: URL to support page about integration with external APIs */
__( 'You can expand the possibilities of your contact forms by integrating them with external services. For details, see <a href="%s">Integration with external APIs</a>.', 'contact-form-7' ),
__( 'https://contactform7.com/integration-with-external-apis/', 'contact-form-7' )
)
);
$formatter->end_tag( 'p' );
$formatter->call_user_func(
static function () use ( $integration, $service, $service_name ) {
do_action( 'wpcf7_admin_warnings',
'wpcf7-integration', wpcf7_current_action(), $service
);
do_action( 'wpcf7_admin_notices',
'wpcf7-integration', wpcf7_current_action(), $service
);
if ( $service ) {
$message = wpcf7_superglobal_request( 'message' );
$service->admin_notice( $message );
$integration->list_services( array(
'include' => $service_name,
) );
} else {
$integration->list_services();
}
}
);
$formatter->print();
}
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', 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(
__( 'Contact Form 7 has completed the <a href="https://contactform7.com/2025/01/08/complete-removal-of-constant-contact-integration/">removal of the Constant Contact integration</a>. We recommend <a href="https://contactform7.com/sendinblue-integration/">Brevo</a> as an alternative.', 'contact-form-7' ),
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(
__( '<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="https://contactform7.com/turnstile-integration/">Cloudflare Turnstile</a>, and we recommend it unless you have reasons to use reCAPTCHA.', 'contact-form-7' ),
array( 'type' => 'warning' )
);
}
}

View File

@@ -0,0 +1,484 @@
<?php
// don't load directly
if ( ! defined( 'ABSPATH' ) ) {
die( '-1' );
}
$save_button = sprintf(
'<input %s />',
wpcf7_format_atts( array(
'type' => 'submit',
'class' => 'button-primary',
'name' => 'wpcf7-save',
'value' => __( 'Save', 'contact-form-7' ),
) )
);
$formatter = new WPCF7_HTMLFormatter( array(
'allowed_html' => array_merge( wpcf7_kses_allowed_html(), array(
'form' => array(
'method' => true,
'action' => true,
'id' => true,
'class' => true,
'disabled' => true,
),
) ),
) );
$formatter->append_start_tag( 'div', array(
'class' => 'wrap',
'id' => 'wpcf7-contact-form-editor',
) );
$formatter->append_start_tag( 'h1', array(
'class' => 'wp-heading-inline',
) );
$formatter->append_preformatted(
esc_html( $post->initial()
? __( 'Add Contact Form', 'contact-form-7' )
: __( 'Edit Contact Form', 'contact-form-7' )
)
);
$formatter->end_tag( 'h1' );
if ( ! $post->initial() and current_user_can( 'wpcf7_edit_contact_forms' ) ) {
$formatter->append_whitespace();
$formatter->append_preformatted(
wpcf7_link(
menu_page_url( 'wpcf7-new', false ),
__( 'Add Contact Form', 'contact-form-7' ),
array( 'class' => 'page-title-action' )
)
);
}
$formatter->append_start_tag( 'hr', array(
'class' => 'wp-header-end',
) );
$formatter->call_user_func( static function () use ( $post ) {
do_action( 'wpcf7_admin_warnings',
$post->initial() ? 'wpcf7-new' : 'wpcf7',
wpcf7_current_action(),
$post
);
do_action( 'wpcf7_admin_notices',
$post->initial() ? 'wpcf7-new' : 'wpcf7',
wpcf7_current_action(),
$post
);
} );
if ( $post ) {
$formatter->append_start_tag( 'form', array(
'method' => 'post',
'action' => esc_url( add_query_arg(
array( 'post' => $post_id ),
menu_page_url( 'wpcf7', false )
) ),
'id' => 'wpcf7-admin-form-element',
'disabled' => ! current_user_can( 'wpcf7_edit_contact_form', $post_id ),
) );
if ( current_user_can( 'wpcf7_edit_contact_form', $post_id ) ) {
$formatter->call_user_func( static function () use ( $post_id ) {
wp_nonce_field( 'wpcf7-save-contact-form_' . $post_id );
} );
}
$formatter->append_start_tag( 'input', array(
'type' => 'hidden',
'id' => 'post_ID',
'name' => 'post_ID',
'value' => (int) $post_id,
) );
$formatter->append_start_tag( 'input', array(
'type' => 'hidden',
'id' => 'wpcf7-locale',
'name' => 'wpcf7-locale',
'value' => $post->locale(),
) );
$formatter->append_start_tag( 'input', array(
'type' => 'hidden',
'id' => 'hiddenaction',
'name' => 'action',
'value' => 'save',
) );
$formatter->append_start_tag( 'input', array(
'type' => 'hidden',
'id' => 'active-tab',
'name' => 'active-tab',
'value' => wpcf7_superglobal_get( 'active-tab' ),
) );
$formatter->append_start_tag( 'div', array(
'id' => 'poststuff',
) );
$formatter->append_start_tag( 'div', array(
'id' => 'post-body',
'class' => 'metabox-holder columns-2 wp-clearfix',
) );
$formatter->append_start_tag( 'div', array(
'id' => 'post-body-content',
) );
$formatter->append_start_tag( 'div', array(
'id' => 'titlediv',
) );
$formatter->append_start_tag( 'div', array(
'id' => 'titlewrap',
) );
$formatter->append_start_tag( 'input', array(
'type' => 'text',
'name' => 'post_title',
'value' => $post->initial() ? '' : $post->title(),
'id' => 'title',
'spellcheck' => 'true',
'autocomplete' => 'off',
'disabled' => ! current_user_can( 'wpcf7_edit_contact_form', $post_id ),
'placeholder' => __( 'Enter title here', 'contact-form-7' ),
'aria-label' => __( 'Enter title here', 'contact-form-7' ),
) );
$formatter->end_tag( 'div' ); // #titlewrap
$formatter->append_start_tag( 'div', array(
'class' => 'inside',
) );
if ( ! $post->initial() ) {
if ( $shortcode = $post->shortcode() ) {
$formatter->append_start_tag( 'p', array(
'class' => 'description',
) );
$formatter->append_start_tag( 'label', array(
'for' => 'wpcf7-shortcode',
) );
$formatter->append_preformatted(
esc_html( __( 'Copy this shortcode and paste it into your post, page, or text widget content:', 'contact-form-7' ) )
);
$formatter->end_tag( 'label' );
$formatter->append_whitespace();
$formatter->append_start_tag( 'span', array(
'class' => 'shortcode wp-ui-highlight',
) );
$formatter->append_start_tag( 'input', array(
'type' => 'text',
'id' => 'wpcf7-shortcode',
'readonly' => true,
'class' => 'large-text code selectable',
'value' => $shortcode,
) );
$formatter->end_tag( 'p' );
}
if ( $shortcode = $post->shortcode( array( 'use_old_format' => true ) ) ) {
$formatter->append_start_tag( 'p', array(
'class' => 'description',
) );
$formatter->append_start_tag( 'label', array(
'for' => 'wpcf7-shortcode-old',
) );
$formatter->append_preformatted(
esc_html( __( 'You can also use this old-style shortcode:', 'contact-form-7' ) )
);
$formatter->end_tag( 'label' );
$formatter->append_whitespace();
$formatter->append_start_tag( 'span', array(
'class' => 'shortcode old',
) );
$formatter->append_start_tag( 'input', array(
'type' => 'text',
'id' => 'wpcf7-shortcode-old',
'readonly' => true,
'class' => 'large-text code selectable',
'value' => $shortcode,
) );
$formatter->end_tag( 'p' );
}
}
$formatter->end_tag( 'div' ); // .inside
$formatter->end_tag( 'div' ); // #titlediv
$formatter->end_tag( 'div' ); // #post-body-content
$formatter->append_start_tag( 'div', array(
'id' => 'postbox-container-1',
'class' => 'postbox-container',
) );
if ( current_user_can( 'wpcf7_edit_contact_form', $post_id ) ) {
$formatter->append_start_tag( 'section', array(
'id' => 'submitdiv',
'class' => 'postbox',
) );
$formatter->append_start_tag( 'h2' );
$formatter->append_preformatted(
esc_html( __( 'Status', 'contact-form-7' ) )
);
$formatter->end_tag( 'h2' );
$formatter->append_start_tag( 'div', array(
'class' => 'inside',
) );
$formatter->append_start_tag( 'div', array(
'class' => 'submitbox',
'id' => 'submitpost',
) );
$formatter->append_start_tag( 'div', array(
'id' => 'minor-publishing-actions',
) );
$formatter->append_start_tag( 'div', array(
'class' => 'hidden',
) );
$formatter->append_start_tag( 'input', array(
'type' => 'submit',
'class' => 'button-primary',
'name' => 'wpcf7-save',
'value' => __( 'Save', 'contact-form-7' ),
) );
$formatter->end_tag( 'div' ); // .hidden
if ( ! $post->initial() ) {
$formatter->append_start_tag( 'input', array(
'type' => 'submit',
'name' => 'wpcf7-copy',
'class' => 'copy button',
'value' => __( 'Duplicate', 'contact-form-7' ),
) );
}
$formatter->end_tag( 'div' ); // #minor-publishing-actions
$formatter->append_start_tag( 'div', array(
'id' => 'misc-publishing-actions',
) );
$formatter->call_user_func( static function () use ( $post_id ) {
do_action( 'wpcf7_admin_misc_pub_section', $post_id );
} );
$formatter->end_tag( 'div' ); // #misc-publishing-actions
$formatter->append_start_tag( 'div', array(
'id' => 'major-publishing-actions',
) );
if ( ! $post->initial() ) {
$formatter->append_start_tag( 'div', array(
'id' => 'delete-action',
) );
$formatter->append_start_tag( 'input', array(
'type' => 'submit',
'name' => 'wpcf7-delete',
'class' => 'delete submitdelete',
'value' => __( 'Delete', 'contact-form-7' ),
) );
$formatter->end_tag( 'div' ); // #delete-action
}
$formatter->append_start_tag( 'div', array(
'id' => 'publishing-action',
) );
$formatter->append_preformatted( '<span class="spinner"></span>' );
$formatter->append_preformatted( $save_button );
$formatter->end_tag( 'div' ); // #publishing-action
$formatter->append_preformatted( '<div class="clear"></div>' );
$formatter->end_tag( 'div' ); // #major-publishing-actions
$formatter->end_tag( 'div' ); // #submitpost
$formatter->end_tag( 'div' ); // .inside
$formatter->end_tag( 'section' ); // #submitdiv
}
$formatter->append_start_tag( 'section', array(
'id' => 'informationdiv',
'class' => 'postbox',
) );
$formatter->append_start_tag( 'h2' );
$formatter->append_preformatted(
esc_html( __( 'Do you need help?', 'contact-form-7' ) )
);
$formatter->end_tag( 'h2' );
$formatter->append_start_tag( 'div', array(
'class' => 'inside',
) );
$formatter->append_start_tag( 'p' );
$formatter->append_preformatted(
esc_html( __( 'Here are some available options to help solve your problems.', 'contact-form-7' ) )
);
$formatter->end_tag( 'p' );
$formatter->append_start_tag( 'ol' );
$formatter->append_start_tag( 'li' );
$formatter->append_preformatted(
sprintf(
/* translators: 1: URL to FAQ, 2: URL to docs */
'<a href="%1$s">FAQ</a> and <a href="%2$s">docs</a>',
__( 'https://contactform7.com/faq/', 'contact-form-7' ),
__( 'https://contactform7.com/docs/', 'contact-form-7' )
)
);
$formatter->append_start_tag( 'li' );
$formatter->append_preformatted(
wpcf7_link(
__( 'https://wordpress.org/support/plugin/contact-form-7/', 'contact-form-7' ),
__( 'Support forums', 'contact-form-7' )
)
);
$formatter->append_start_tag( 'li' );
$formatter->append_preformatted(
wpcf7_link(
__( 'https://contactform7.com/custom-development/', 'contact-form-7' ),
__( 'Professional services', 'contact-form-7' )
)
);
$formatter->end_tag( 'ol' );
$formatter->end_tag( 'div' ); // .inside
$formatter->end_tag( 'section' ); // #informationdiv
$formatter->end_tag( 'div' ); // #postbox-container-1
$formatter->append_start_tag( 'div', array(
'id' => 'postbox-container-2',
'class' => 'postbox-container',
) );
$formatter->append_start_tag( 'div', array(
'id' => 'contact-form-editor',
) );
$formatter->call_user_func( static function () use ( $post, $post_id ) {
$editor = new WPCF7_Editor( $post );
$panels = array();
if ( current_user_can( 'wpcf7_edit_contact_form', $post_id ) ) {
$panels = array(
'form-panel' => array(
'title' => __( 'Form', 'contact-form-7' ),
'callback' => 'wpcf7_editor_panel_form',
),
'mail-panel' => array(
'title' => __( 'Mail', 'contact-form-7' ),
'callback' => 'wpcf7_editor_panel_mail',
),
'messages-panel' => array(
'title' => __( 'Messages', 'contact-form-7' ),
'callback' => 'wpcf7_editor_panel_messages',
),
);
$additional_settings = $post->prop( 'additional_settings' );
if ( ! is_scalar( $additional_settings ) ) {
$additional_settings = '';
}
$additional_settings = trim( $additional_settings );
$additional_settings = explode( "\n", $additional_settings );
$additional_settings = array_filter( $additional_settings );
$additional_settings = count( $additional_settings );
$panels['additional-settings-panel'] = array(
'title' => $additional_settings
? sprintf(
/* translators: %d: number of additional settings */
__( 'Additional Settings (%d)', 'contact-form-7' ),
$additional_settings
)
: __( 'Additional Settings', 'contact-form-7' ),
'callback' => 'wpcf7_editor_panel_additional_settings',
);
}
$panels = apply_filters( 'wpcf7_editor_panels', $panels );
foreach ( $panels as $id => $panel ) {
$editor->add_panel( $id, $panel['title'], $panel['callback'] );
}
$editor->display();
} );
$formatter->end_tag( 'div' ); // #contact-form-editor
if ( current_user_can( 'wpcf7_edit_contact_form', $post_id ) ) {
$formatter->append_start_tag( 'p', array(
'class' => 'submit',
) );
$formatter->append_preformatted( $save_button );
$formatter->end_tag( 'p' );
}
$formatter->end_tag( 'div' ); // #postbox-container-2
$formatter->end_tag( 'div' ); // #post-body
$formatter->append_preformatted( '<br class="clear" />' );
$formatter->end_tag( 'div' ); // #poststuff
$formatter->end_tag( 'form' );
}
$formatter->end_tag( 'div' ); // .wrap
$formatter->print();
$tag_generator = WPCF7_TagGenerator::get_instance();
$tag_generator->print_panels( $post );
do_action( 'wpcf7_admin_footer', $post );

View File

@@ -0,0 +1,22 @@
<?php
function wpcf7_current_action() {
foreach ( array( 'action', 'action2' ) as $var ) {
$action = wpcf7_superglobal_request( $var, null );
if ( isset( $action ) and -1 !== $action ) {
return $action;
}
}
return false;
}
function wpcf7_admin_has_edit_cap() {
return current_user_can( 'wpcf7_edit_contact_forms' );
}
function wpcf7_add_tag_generator( $name, $title, $elm_id, $callback, $options = array() ) {
$tag_generator = WPCF7_TagGenerator::get_instance();
return $tag_generator->add( $name, $title, $callback, $options );
}

View File

@@ -0,0 +1,241 @@
<?php
if ( ! class_exists( 'WP_List_Table' ) ) {
require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
}
class WPCF7_Contact_Form_List_Table extends WP_List_Table {
public static function define_columns() {
$columns = array(
'cb' => '<input type="checkbox" />',
'title' => __( 'Title', 'contact-form-7' ),
'shortcode' => __( 'Shortcode', 'contact-form-7' ),
'author' => __( 'Author', 'contact-form-7' ),
'date' => __( 'Date', 'contact-form-7' ),
);
return $columns;
}
public function __construct() {
parent::__construct( array(
'singular' => 'post',
'plural' => 'posts',
'ajax' => false,
) );
}
public function prepare_items() {
$current_screen = get_current_screen();
$per_page = $this->get_items_per_page( 'wpcf7_contact_forms_per_page' );
$args = array(
'posts_per_page' => $per_page,
'orderby' => 'title',
'order' => 'ASC',
'offset' => ( $this->get_pagenum() - 1 ) * $per_page,
);
if ( $search_keyword = wpcf7_superglobal_request( 's' ) ) {
$args['s'] = $search_keyword;
}
if ( $order_by = wpcf7_superglobal_request( 'orderby' ) ) {
$args['orderby'] = $order_by;
}
if (
$order = wpcf7_superglobal_request( 'order' ) and
'desc' === strtolower( $order )
) {
$args['order'] = 'DESC';
}
$this->items = WPCF7_ContactForm::find( $args );
$total_items = WPCF7_ContactForm::count();
$total_pages = ceil( $total_items / $per_page );
$this->set_pagination_args( array(
'total_items' => $total_items,
'total_pages' => $total_pages,
'per_page' => $per_page,
) );
}
public function get_columns() {
return get_column_headers( get_current_screen() );
}
protected function get_sortable_columns() {
$columns = array(
'title' => array( 'title', true ),
'author' => array( 'author', false ),
'date' => array( 'date', false ),
);
return $columns;
}
protected function get_bulk_actions() {
$actions = array(
'delete' => __( 'Delete', 'contact-form-7' ),
);
return $actions;
}
protected function column_default( $item, $column_name ) {
return '';
}
public function column_cb( $item ) {
return sprintf(
'<input type="checkbox" name="%1$s[]" value="%2$s" />',
$this->_args['singular'],
$item->id()
);
}
public function column_title( $item ) {
$edit_link = add_query_arg(
array(
'post' => absint( $item->id() ),
'action' => 'edit',
),
menu_page_url( 'wpcf7', false )
);
$output = sprintf(
'<a class="row-title" href="%1$s" aria-label="%2$s">%3$s</a>',
esc_url( $edit_link ),
esc_attr( sprintf(
/* translators: %s: title of contact form */
__( 'Edit &#8220;%s&#8221;', 'contact-form-7' ),
$item->title()
) ),
esc_html( $item->title() )
);
$output = sprintf( '<strong>%s</strong>', $output );
if ( wpcf7_validate_configuration()
and current_user_can( 'wpcf7_edit_contact_form', $item->id() ) ) {
$config_validator = new WPCF7_ConfigValidator( $item );
$config_validator->restore();
if ( $count_errors = $config_validator->count_errors() ) {
$error_notice = sprintf(
/* translators: %s: number of errors detected */
_n(
'%s configuration error detected',
'%s configuration errors detected',
$count_errors, 'contact-form-7' ),
number_format_i18n( $count_errors )
);
$output .= sprintf(
'<div class="config-error"><span class="icon-in-circle" aria-hidden="true">!</span> %s</div>',
$error_notice
);
}
}
return $output;
}
protected function handle_row_actions( $item, $column_name, $primary ) {
if ( $column_name !== $primary ) {
return '';
}
$edit_link = add_query_arg(
array(
'post' => absint( $item->id() ),
'action' => 'edit',
),
menu_page_url( 'wpcf7', false )
);
$actions = array(
'edit' => wpcf7_link( $edit_link, __( 'Edit', 'contact-form-7' ) ),
);
if ( current_user_can( 'wpcf7_edit_contact_form', $item->id() ) ) {
$copy_link = add_query_arg(
array(
'post' => absint( $item->id() ),
'action' => 'copy',
),
menu_page_url( 'wpcf7', false )
);
$copy_link = wp_nonce_url(
$copy_link,
'wpcf7-copy-contact-form_' . absint( $item->id() )
);
$actions = array_merge( $actions, array(
'copy' => wpcf7_link( $copy_link, __( 'Duplicate', 'contact-form-7' ) ),
) );
}
return $this->row_actions( $actions );
}
public function column_author( $item ) {
$post = get_post( $item->id() );
if ( ! $post ) {
return;
}
$author = get_userdata( $post->post_author );
if ( false === $author ) {
return;
}
return esc_html( $author->display_name );
}
public function column_shortcode( $item ) {
$shortcodes = array( $item->shortcode() );
$output = '';
foreach ( $shortcodes as $shortcode ) {
$output .= "\n" . sprintf(
'<span class="shortcode"><input %s /></span>',
wpcf7_format_atts( array(
'type' => 'text',
'readonly' => true,
'value' => $shortcode,
'class' => 'large-text code selectable',
) )
);
}
return trim( $output );
}
public function column_date( $item ) {
$datetime = get_post_datetime( $item->id() );
if ( false === $datetime ) {
return '';
}
$t_time = sprintf(
/* translators: 1: date, 2: time */
__( '%1$s at %2$s', 'contact-form-7' ),
/* translators: date format, see https://www.php.net/date */
$datetime->format( __( 'Y/m/d', 'contact-form-7' ) ),
/* translators: time format, see https://www.php.net/date */
$datetime->format( __( 'g:i a', 'contact-form-7' ) )
);
return $t_time;
}
}

View File

@@ -0,0 +1,180 @@
<?php
add_action( 'wpcf7_admin_menu', 'wpcf7_admin_init_bulk_cv', 10, 0 );
function wpcf7_admin_init_bulk_cv() {
if (
! wpcf7_validate_configuration() or
! current_user_can( 'wpcf7_edit_contact_forms' )
) {
return;
}
$result = WPCF7::get_option( 'bulk_validate' );
$last_important_update = WPCF7_ConfigValidator::last_important_update;
if (
! empty( $result['version'] ) and
version_compare( $last_important_update, $result['version'], '<=' )
) {
return;
}
add_filter( 'wpcf7_admin_menu_change_notice',
'wpcf7_admin_menu_change_notice_bulk_cv',
10, 1
);
add_action( 'wpcf7_admin_warnings',
'wpcf7_admin_warnings_bulk_cv',
5, 3
);
}
function wpcf7_admin_menu_change_notice_bulk_cv( $counts ) {
$counts['wpcf7'] += 1;
return $counts;
}
function wpcf7_admin_warnings_bulk_cv( $page, $action, $object ) {
if ( 'wpcf7' === $page and 'validate' === $action ) {
return;
}
wp_admin_notice(
sprintf(
'%1$s &raquo; %2$s',
__( 'Misconfiguration leads to mail delivery failure or other troubles. Validate your contact forms now.', 'contact-form-7' ),
wpcf7_link(
add_query_arg(
array( 'action' => 'validate' ),
menu_page_url( 'wpcf7', false )
),
__( 'Validate Contact Form 7 Configuration', 'contact-form-7' )
)
),
array( 'type' => 'warning' )
);
}
add_action( 'wpcf7_admin_load', 'wpcf7_load_bulk_validate_page', 10, 2 );
function wpcf7_load_bulk_validate_page( $page, $action ) {
if (
'wpcf7' !== $page or
'validate' !== $action or
! wpcf7_validate_configuration() or
'POST' !== wpcf7_superglobal_server( 'REQUEST_METHOD' )
) {
return;
}
check_admin_referer( 'wpcf7-bulk-validate' );
if ( ! current_user_can( 'wpcf7_edit_contact_forms' ) ) {
wp_die( wp_kses_data( __( 'You are not allowed to validate configuration.', 'contact-form-7' ) ) );
}
$contact_forms = WPCF7_ContactForm::find();
$result = array(
'timestamp' => time(),
'version' => WPCF7_VERSION,
'count_valid' => 0,
'count_invalid' => 0,
);
foreach ( $contact_forms as $contact_form ) {
$config_validator = new WPCF7_ConfigValidator( $contact_form );
$config_validator->validate();
$config_validator->save();
if ( $config_validator->is_valid() ) {
$result['count_valid'] += 1;
} else {
$result['count_invalid'] += 1;
}
}
WPCF7::update_option( 'bulk_validate', $result );
$redirect_to = add_query_arg(
array(
'message' => 'validated',
),
menu_page_url( 'wpcf7', false )
);
wp_safe_redirect( $redirect_to );
exit();
}
function wpcf7_admin_bulk_validate_page() {
$contact_forms = WPCF7_ContactForm::find();
$count = WPCF7_ContactForm::count();
$submit_text = sprintf(
/* translators: %s: number of contact forms */
_n(
'Validate %s contact form now',
'Validate %s contact forms now',
$count, 'contact-form-7'
),
number_format_i18n( $count )
);
$formatter = new WPCF7_HTMLFormatter( array(
'allowed_html' => array_merge( wpcf7_kses_allowed_html(), array(
'form' => array(
'action' => true,
'method' => true,
),
) ),
) );
$formatter->append_start_tag( 'div', array(
'class' => 'wrap',
) );
$formatter->append_start_tag( 'h1' );
$formatter->append_preformatted(
esc_html( __( 'Validate Configuration', 'contact-form-7' ) )
);
$formatter->end_tag( 'h1' );
$formatter->append_start_tag( 'form', array(
'method' => 'post',
'action' => '',
) );
$formatter->append_start_tag( 'p' );
$formatter->call_user_func( static function () {
wp_nonce_field( 'wpcf7-bulk-validate' );
} );
$formatter->append_start_tag( 'input', array(
'type' => 'hidden',
'name' => 'action',
'value' => 'validate',
) );
$formatter->append_start_tag( 'input', array(
'type' => 'submit',
'class' => 'button',
'value' => $submit_text,
) );
$formatter->end_tag( 'form' );
$formatter->append_preformatted(
wpcf7_link(
__( 'https://contactform7.com/configuration-validator-faq/', 'contact-form-7' ),
__( 'FAQ about Configuration Validator', 'contact-form-7' )
)
);
$formatter->print();
}

View File

@@ -0,0 +1,77 @@
/*
* Form Tab
*/
.tag-generator-panel {
text-align: right;
}
.tag-generator-dialog > .close-button {
right: auto;
left: 8px;
}
form.tag-generator-panel[data-version="1"] {
.control-box > fieldset > legend {
border: 1px solid #dfdfdf;
border-right: 4px solid #00a0d2;
}
.insert-box input.tag {
float: right;
}
.insert-box .submitbox input[type="button"] {
float: left;
}
}
/*
* Mail Tab
*/
.contact-form-editor-box-mail span.mailtag {
margin: 0 4px 0 0;
}
/*
* Welcome Panel
*/
.wpcf7-welcome-panel .welcome-panel-close {
left: 10px;
right: auto;
padding: 10px 21px 10px 15px;
}
.wpcf7-welcome-panel .welcome-panel-close::before {
right: 0;
left: auto;
}
.wpcf7-welcome-panel .welcome-panel-content {
margin-right: 13px;
}
.wpcf7-welcome-panel .welcome-panel-column {
float: right;
padding: 0 0 0 2%;
}
/*
* Integration
*/
.card {
border-left: 1px solid #e5e5e5;
border-right: 4px solid #e5e5e5;
}
.card img.icon {
float: right;
margin: 8px -8px 8px 8px;
}
.card h2.title {
float: right;
}
.card .infobox {
float: left;
}

View File

@@ -0,0 +1,614 @@
#titlediv .inside p.description {
margin: 8px 2px 0;
}
#titlediv .inside p.description label {
cursor: pointer;
}
span.shortcode {
display: block;
margin: 2px 0;
}
span.shortcode.old {
background: #777;
color: #fff;
}
span.shortcode input {
font-size: 12px;
border: none;
box-shadow: none;
padding: 4px 8px;
margin: 0;
}
#wpcf7-contact-form-list-table span.shortcode input,
#wpcf7-contact-form-editor span.shortcode input {
background: transparent;
}
#wpcf7-contact-form-list-table span.shortcode input {
color: #444;
}
#wpcf7-contact-form-editor span.shortcode input {
color: #fff;
width: 100%;
}
#submitpost input.copy {
margin-bottom: 10px;
}
#submitpost input.delete {
padding: 0;
margin: 0;
border: none;
cursor: pointer;
background: inherit;
color: #a00;
}
#submitpost input.delete:hover {
color: #dc3232; /* Red */
}
#submitpost input.delete:focus {
outline: thin dotted;
}
.postbox-container .postbox h3 {
border-bottom: 1px solid transparent;
}
div.config-error, span.config-error, ul.config-error {
color: #444;
font-style: normal;
font-size: 13px;
}
ul.config-error {
margin: 2px 0;
}
ul.config-error li {
list-style: none;
padding: 2px 2px;
margin: 0;
}
#misc-publishing-actions .config-error {
line-height: 2;
}
[data-config-field][aria-invalid="true"] {
border-color: #dc3232;
}
#contact-form-editor-tabs .icon-in-circle,
#contact-form-editor .config-error .icon-in-circle,
.wp-list-table .config-error .icon-in-circle,
.icon-in-circle {
display: inline-block;
vertical-align: baseline;
margin: 1px 6px 0;
padding: 0 5px;
min-width: 7px;
height: 17px;
border-radius: 11px;
background-color: #ca4a1f;
color: #fff;
font-size: 12px;
font-weight: bold;
line-height: 17px;
text-align: center;
z-index: 26;
}
/*
* Tabs
*/
#contact-form-editor-tabs {
border-bottom: 1px solid #aaa;
padding: 9px 10px 0;
margin: 0;
}
#contact-form-editor-tabs button {
display: inline-block;
border: 1px solid #ccc;
border-bottom: 1px solid #aaa;
padding: 6px 10px;
margin: 0 4px -1px;
color: #333;
background-color: #e4e4e4;
font-size: 14px;
font-weight: normal;
line-height: 20px;
}
#contact-form-editor-tabs button[aria-selected="true"] {
border-top: 1px solid #aaa;
border-right: 1px solid #aaa;
border-left: 1px solid #aaa;
border-bottom: 1px solid #f5f5f5;
color: #000;
background-color: #f5f5f5;
font-weight: bold;
}
#contact-form-editor-tabs button:hover {
color: #000;
}
#contact-form-editor .contact-form-editor-panel > div.config-error {
margin-bottom: 1.4em;
}
#contact-form-editor-tabs button[aria-selected="true"] .icon-in-circle {
display: none;
}
#contact-form-editor .contact-form-editor-panel h2 {
font-size: 18px;
font-weight: 400;
line-height: 24px;
margin: 8px 0;
padding: 0;
}
#contact-form-editor .contact-form-editor-panel {
background-color: #f5f5f5;
border: 1px solid #aaa;
border-top: none;
padding: 16px;
}
#contact-form-editor .form-table th {
width: 100px;
}
#contact-form-editor .contact-form-editor-panel fieldset legend {
line-height: 1.5;
margin: .6em 0 .4em;
}
/*
* Form Tab
*/
#tag-generator-list button {
font-size: 12px;
height: 26px;
line-height: 24px;
margin: 2px;
padding: 0 8px 1px;
}
.tag-generator-dialog {
padding: 12px;
border: 1px solid #c3c4c7;
box-shadow: 0 1px 1px rgba( 0, 0, 0, 0.04 );
height: 720px;
width: 720px;
overflow: auto;
}
.tag-generator-dialog::backdrop {
background: rgb( 0 0 0 / 50% );
}
.tag-generator-dialog > .close-button {
position: absolute;
top: 8px;
right: 8px;
}
form.tag-generator-panel {
display: flex;
flex-direction: column;
height: 720px;
width: 720px;
max-height: 100%;
max-width: 100%;
margin-block-end: 0;
}
form.tag-generator-panel[data-version="2"] {
&:invalid .mail-tag-tip {
display: none;
}
.description-box {
box-sizing: border-box;
flex: none;
margin-inline: -12px;
padding-inline: 12px;
border-bottom: 1px solid #dfdfdf;
}
.control-box {
box-sizing: border-box;
flex: auto;
display: flex;
flex-direction: column;
gap: 12px 0;
min-height: 120px;
overflow: auto;
}
.control-box > fieldset {
margin-block: 8px;
margin-inline-start: 10em;
line-height: 2.25;
}
.control-box > fieldset > legend {
font-weight: bolder;
margin-block: 8px;
margin-inline-start: -10em;
line-height: 1.25;
}
.control-box input[type="text"] {
width: 20rem;
max-width: 88%;
}
.control-box input[type="number"] {
width: 8rem;
max-width: 44%;
}
.control-box textarea {
height: 12ex;
width: 20rem;
max-width: 88%;
}
.control-box select {
width: 20rem;
max-width: 88%;
}
.control-box input:invalid,
.control-box textarea:invalid {
background-color: #ffe9de;
}
.insert-box {
box-sizing: border-box;
flex: none;
margin-block-end: -12px;
margin-inline: -12px;
padding-block: 24px 12px;
padding-inline: 12px;
background-color: #fcfcfc;
border-top: 1px solid #dfdfdf;
}
.insert-box .flex-container {
display: flex;
}
.insert-box .flex-container > [data-tag-part="tag"] {
flex: auto;
margin-inline-end: 8px;
}
.insert-box .mail-tag-tip::before {
font: 1.2rem dashicons;
content: "\f348" / '';
color: #646970;
padding-inline-end: 4px;
vertical-align: top;
}
}
form.tag-generator-panel[data-version="1"] {
.control-box {
padding: 0;
margin: 0;
overflow: auto;
flex-grow: 1;
}
.control-box > fieldset > legend {
border: 1px solid #dfdfdf;
border-left: 4px solid #00a0d2;
background: #f7fcfe;
padding: 4px 12px;
margin: 4px 0;
line-height: 1.4em;
width: 100%;
box-sizing: border-box;
}
table {
width: 100%;
}
table.form-table th {
width: 120px;
padding: 4px 10px 4px 0;
font-size: 13px;
}
table.form-table td {
padding: 4px 10px;
font-size: 13px;
}
.control-box input.oneline {
width: 200px;
}
.control-box input.large-text {
width: 400px;
}
.control-box textarea.values {
width: 200px;
height: 6em;
}
.control-box input[type="number"],
.control-box input[type="date"] {
width: 88px;
}
.control-box table caption {
text-align: left;
font-size: 110%;
font-weight: bold;
color: #777;
margin: 10px 0 5px;
}
.control-box table.form-table td label {
line-height: 1.1em;
}
.control-box table.form-table td label .description {
line-height: 1.4em;
}
.insert-box {
margin: 0 -15px -15px;
padding: 8px 16px;
background-color: #fcfcfc;
border-top: 1px solid #dfdfdf;
overflow: auto;
}
.insert-box input.tag {
width: 510px;
float: left;
background-color: transparent;
box-shadow: none;
}
.insert-box .submitbox {
padding: 0;
}
.insert-box .submitbox input[type="button"] {
float: right;
}
.insert-box .description label {
cursor: text;
}
}
/*
* Mail Tab
*/
.contact-form-editor-box-mail span.mailtag {
display: inline-block;
margin: 0 0 0 4px;
padding: 1px 2px;
cursor: pointer;
color: #000;
}
.contact-form-editor-box-mail span.mailtag.used {
color: #666;
}
.contact-form-editor-box-mail span.mailtag.unused {
font-weight: bold;
}
/*
* Messages Tab
*/
#messages-panel p.description {
margin: 5px 0 10px;
}
/*
* Tabs for integration modules
*/
#sendinblue-panel table tr.inactive ~ tr {
display: none;
}
#sendinblue-panel .dashicons {
text-decoration: none;
}
#sendinblue-panel td p {
margin-top: 12px;
}
/*
* List Table
*/
.fixed .column-title {
width: 38%;
}
.fixed .column-shortcode {
width: 38%;
}
/*
* Welcome Panel
*/
.wpcf7-welcome-panel {
position: relative;
overflow: auto;
margin: 16px 0;
padding: 23px 10px 0;
border: 1px solid #c3c4c7;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
background: #fff;
font-size: 13px;
line-height: 1.7;
}
.wpcf7-welcome-panel h3 {
font-size: 16px;
font-weight: 600;
line-height: 2.1em;
margin: 1em 0 1.2em;
}
.wpcf7-welcome-panel h3 .dashicons {
position: relative;
top: -2px;
display: inline-block;
width: 60px;
color: #575757;
font-size: 40px;
}
.wpcf7-welcome-panel p {
color: #646970;
}
.wpcf7-welcome-panel p a {
font-weight: bold;
}
.wpcf7-welcome-panel .welcome-panel-close {
position: absolute;
z-index: 2;
top: 10px;
right: 10px;
padding: 10px 15px 10px 21px;
font-size: 13px;
line-height: 1.23076923; /* Chrome rounding, needs to be 16px equivalent */
text-decoration: none;
}
.wpcf7-welcome-panel .welcome-panel-close::before {
background: 0 0;
color: #787c82;
content: "\f153" / '';
display: block;
font: normal 16px/20px dashicons;
speak: never;
height: 20px;
text-align: center;
width: 20px;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
position: absolute;
top: 8px;
left: 0;
transition: all .1s ease-in-out;
}
.wpcf7-welcome-panel .welcome-panel-content {
display: block;
margin-left: 13px;
max-width: 1500px;
min-height: auto;
}
.wpcf7-welcome-panel .welcome-panel-column-container {
clear: both;
position: relative;
}
.wpcf7-welcome-panel .welcome-panel-column {
display: block;
width: 48%;
min-width: 200px;
float: left;
padding: 0 2% 0 0;
margin: 0 0 1em 0;
}
@media screen and (max-width: 870px) {
.wpcf7-welcome-panel .welcome-panel-column {
display: block;
float: none;
width: 100%;
}
}
.wpcf7-welcome-panel .welcome-panel-column p {
margin-top: 7px;
color: #3c434a;
}
/*
* Integration
*/
.card {
background: #fff none repeat scroll 0 0;
border: 1px solid #e5e5e5;
border-left: 4px solid #e5e5e5;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
margin-top: 20px;
max-width: 520px;
min-width: 255px;
padding: 0.7em 2em 1em;
position: relative;
}
.card.active {
border-color: #00a0d2;
}
#constant_contact.card.active {
border-color: #dc3232;
}
.card img.icon {
float: left;
margin: 8px 8px 8px -8px;
}
.card h2.title {
float: left;
max-width: 240px;
font-size: 1.3em;
font-weight: 600;
}
.card .infobox {
float: right;
font-size: 13px;
color: #666;
margin: 1em;
line-height: 1.5;
max-width: 240px;
}
.card .inside .form-table th {
padding: 15px 10px 15px 0;
width: 160px;
}
.card .inside .form-table td {
padding: 10px 10px;
}
.card .checkboxes li {
margin: 0;
}

View File

@@ -0,0 +1,556 @@
<?php
class WPCF7_Editor {
private $contact_form;
private $panels = array();
public function __construct( WPCF7_ContactForm $contact_form ) {
$this->contact_form = $contact_form;
}
public function add_panel( $panel_id, $title, $callback ) {
if ( wpcf7_is_name( $panel_id ) ) {
$this->panels[$panel_id] = array(
'title' => $title,
'callback' => $callback,
);
}
}
public function display() {
if ( empty( $this->panels ) ) {
return;
}
$active_panel_id = wpcf7_superglobal_get( 'active-tab' );
if ( ! array_key_exists( $active_panel_id, $this->panels ) ) {
$active_panel_id = array_key_first( $this->panels );
}
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'nav', array(
'id' => 'contact-form-editor-tabs',
'role' => 'tablist',
'aria-label' => __( 'Contact form editor tabs', 'contact-form-7' ),
'data-active-tab' => absint( array_search(
$active_panel_id, array_keys( $this->panels ), true
) ),
) );
foreach ( $this->panels as $panel_id => $panel ) {
$active = $panel_id === $active_panel_id;
$formatter->append_start_tag( 'button', array(
'type' => 'button',
'role' => 'tab',
'aria-selected' => $active ? 'true' : 'false',
'aria-controls' => $panel_id,
'id' => sprintf( '%s-tab', $panel_id ),
'tabindex' => $active ? '0' : '-1',
) );
$formatter->append_preformatted( esc_html( $panel['title'] ) );
}
$formatter->end_tag( 'nav' );
foreach ( $this->panels as $panel_id => $panel ) {
$active = $panel_id === $active_panel_id;
$formatter->append_start_tag( 'section', array(
'role' => 'tabpanel',
'aria-labelledby' => sprintf( '%s-tab', $panel_id ),
'id' => $panel_id,
'class' => 'contact-form-editor-panel',
'tabindex' => '0',
'hidden' => ! $active,
) );
if ( is_callable( $panel['callback'] ) ) {
$formatter->call_user_func( $panel['callback'], $this->contact_form );
}
$formatter->end_tag( 'section' );
}
$formatter->print();
}
}
function wpcf7_editor_panel_form( $post ) {
$description = sprintf(
/* translators: %s: URL to support page about the form template */
__( 'You can edit the form template here. For details, see <a href="%s">Editing form template</a>.', 'contact-form-7' ),
__( 'https://contactform7.com/editing-form-template/', 'contact-form-7' )
);
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'h2' );
$formatter->append_preformatted( esc_html( __( 'Form', 'contact-form-7' ) ) );
$formatter->end_tag( 'h2' );
$formatter->append_start_tag( 'fieldset' );
$formatter->append_start_tag( 'legend' );
$formatter->append_preformatted( $description );
$formatter->end_tag( 'legend' );
$formatter->call_user_func( static function () {
$tag_generator = WPCF7_TagGenerator::get_instance();
$tag_generator->print_buttons();
} );
$formatter->append_start_tag( 'textarea', array(
'id' => 'wpcf7-form',
'name' => 'wpcf7-form',
'cols' => 100,
'rows' => 24,
'class' => 'large-text code',
'data-config-field' => 'form.body',
) );
$formatter->append_preformatted( esc_textarea( $post->prop( 'form' ) ) );
$formatter->end_tag( 'textarea' );
$formatter->print();
}
function wpcf7_editor_panel_mail( $post ) {
wpcf7_editor_box_mail( $post );
echo '<br class="clear" />';
wpcf7_editor_box_mail( $post, array(
'id' => 'wpcf7-mail-2',
'name' => 'mail_2',
'title' => __( 'Mail (2)', 'contact-form-7' ),
'use' => __( 'Use Mail (2)', 'contact-form-7' ),
) );
}
function wpcf7_editor_box_mail( $post, $options = '' ) {
$options = wp_parse_args( $options, array(
'id' => 'wpcf7-mail',
'name' => 'mail',
'title' => __( 'Mail', 'contact-form-7' ),
'use' => null,
) );
$id = esc_attr( $options['id'] );
$mail = wp_parse_args( $post->prop( $options['name'] ), array(
'active' => false,
'recipient' => '',
'sender' => '',
'subject' => '',
'body' => '',
'additional_headers' => '',
'attachments' => '',
'use_html' => false,
'exclude_blank' => false,
) );
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'div', array(
'class' => 'contact-form-editor-box-mail',
'id' => $id,
) );
$formatter->append_start_tag( 'h2' );
$formatter->append_preformatted( esc_html( $options['title'] ) );
$formatter->end_tag( 'h2' );
if ( ! empty( $options['use'] ) ) {
$formatter->append_start_tag( 'label', array(
'for' => sprintf( '%s-active', $id ),
) );
$formatter->append_start_tag( 'input', array(
'type' => 'checkbox',
'id' => sprintf( '%s-active', $id ),
'name' => sprintf( '%s[active]', $id ),
'data-config-field' => '',
'data-toggle' => sprintf( '%s-fieldset', $id ),
'value' => '1',
'checked' => $mail['active'],
) );
$formatter->append_whitespace();
$formatter->append_preformatted( esc_html( $options['use'] ) );
$formatter->end_tag( 'label' );
$formatter->append_start_tag( 'p', array(
'class' => 'description',
) );
$formatter->append_preformatted(
esc_html( __( 'Mail (2) is an additional mail template often used as an autoresponder.', 'contact-form-7' ) )
);
$formatter->end_tag( 'p' );
}
$formatter->append_start_tag( 'fieldset', array(
'id' => sprintf( '%s-fieldset', $id ),
) );
$formatter->append_start_tag( 'legend' );
$description = sprintf(
/* translators: %s: URL to support page about the email template */
__( 'You can edit the email template here. For details, see <a href="%s">Setting up mail</a>.', 'contact-form-7' ),
__( 'https://contactform7.com/setting-up-mail/', 'contact-form-7' )
);
$formatter->append_preformatted( $description );
$formatter->append_start_tag( 'br' );
$formatter->append_preformatted(
esc_html( __( 'In the following fields, you can use these mail-tags:', 'contact-form-7' ) )
);
$formatter->append_start_tag( 'br' );
$formatter->call_user_func( static function () use ( $post, $options ) {
$post->suggest_mail_tags( $options['name'] );
} );
$formatter->end_tag( 'legend' );
$formatter->append_start_tag( 'table', array(
'class' => 'form-table',
) );
$formatter->append_start_tag( 'tbody' );
$formatter->append_start_tag( 'tr' );
$formatter->append_start_tag( 'th', array(
'scope' => 'row',
) );
$formatter->append_start_tag( 'label', array(
'for' => sprintf( '%s-recipient', $id ),
) );
$formatter->append_preformatted(
esc_html( __( 'To', 'contact-form-7' ) )
);
$formatter->append_start_tag( 'td' );
$formatter->append_start_tag( 'input', array(
'type' => 'text',
'id' => sprintf( '%s-recipient', $id ),
'name' => sprintf( '%s[recipient]', $id ),
'class' => 'large-text code',
'size' => 70,
'value' => $mail['recipient'],
'data-config-field' => sprintf( '%s.recipient', $options['name'] ),
) );
$formatter->end_tag( 'tr' );
$formatter->append_start_tag( 'tr' );
$formatter->append_start_tag( 'th', array(
'scope' => 'row',
) );
$formatter->append_start_tag( 'label', array(
'for' => sprintf( '%s-sender', $id ),
) );
$formatter->append_preformatted(
esc_html( __( 'From', 'contact-form-7' ) )
);
$formatter->append_start_tag( 'td' );
$formatter->append_start_tag( 'input', array(
'type' => 'text',
'id' => sprintf( '%s-sender', $id ),
'name' => sprintf( '%s[sender]', $id ),
'class' => 'large-text code',
'size' => 70,
'value' => $mail['sender'],
'data-config-field' => sprintf( '%s.sender', $options['name'] ),
) );
$formatter->end_tag( 'tr' );
$formatter->append_start_tag( 'tr' );
$formatter->append_start_tag( 'th', array(
'scope' => 'row',
) );
$formatter->append_start_tag( 'label', array(
'for' => sprintf( '%s-subject', $id ),
) );
$formatter->append_preformatted(
esc_html( __( 'Subject', 'contact-form-7' ) )
);
$formatter->append_start_tag( 'td' );
$formatter->append_start_tag( 'input', array(
'type' => 'text',
'id' => sprintf( '%s-subject', $id ),
'name' => sprintf( '%s[subject]', $id ),
'class' => 'large-text code',
'size' => 70,
'value' => $mail['subject'],
'data-config-field' => sprintf( '%s.subject', $options['name'] ),
) );
$formatter->end_tag( 'tr' );
$formatter->append_start_tag( 'tr' );
$formatter->append_start_tag( 'th', array(
'scope' => 'row',
) );
$formatter->append_start_tag( 'label', array(
'for' => sprintf( '%s-additional-headers', $id ),
) );
$formatter->append_preformatted(
esc_html( __( 'Additional headers', 'contact-form-7' ) )
);
$formatter->append_start_tag( 'td' );
$formatter->append_start_tag( 'textarea', array(
'id' => sprintf( '%s-additional-headers', $id ),
'name' => sprintf( '%s[additional_headers]', $id ),
'cols' => 100,
'rows' => 4,
'class' => 'large-text code',
'data-config-field' => sprintf( '%s.additional_headers', $options['name'] ),
) );
$formatter->append_preformatted(
esc_textarea( $mail['additional_headers'] )
);
$formatter->end_tag( 'tr' );
$formatter->append_start_tag( 'tr' );
$formatter->append_start_tag( 'th', array(
'scope' => 'row',
) );
$formatter->append_start_tag( 'label', array(
'for' => sprintf( '%s-body', $id ),
) );
$formatter->append_preformatted(
esc_html( __( 'Message body', 'contact-form-7' ) )
);
$formatter->append_start_tag( 'td' );
$formatter->append_start_tag( 'textarea', array(
'id' => sprintf( '%s-body', $id ),
'name' => sprintf( '%s[body]', $id ),
'cols' => 100,
'rows' => 18,
'class' => 'large-text code',
'data-config-field' => sprintf( '%s.body', $options['name'] ),
) );
$formatter->append_preformatted(
esc_textarea( $mail['body'] )
);
$formatter->end_tag( 'textarea' );
$formatter->append_start_tag( 'p' );
$formatter->append_start_tag( 'label', array(
'for' => sprintf( '%s-exclude-blank', $id ),
) );
$formatter->append_start_tag( 'input', array(
'type' => 'checkbox',
'id' => sprintf( '%s-exclude-blank', $id ),
'name' => sprintf( '%s[exclude_blank]', $id ),
'value' => '1',
'checked' => $mail['exclude_blank'],
) );
$formatter->append_whitespace();
$formatter->append_preformatted(
esc_html( __( 'Exclude a line from output if all of its mail-tags are blank', 'contact-form-7' ) )
);
$formatter->append_start_tag( 'p' );
$formatter->append_start_tag( 'label', array(
'for' => sprintf( '%s-use-html', $id ),
) );
$formatter->append_start_tag( 'input', array(
'type' => 'checkbox',
'id' => sprintf( '%s-use-html', $id ),
'name' => sprintf( '%s[use_html]', $id ),
'value' => '1',
'checked' => $mail['use_html'],
) );
$formatter->append_whitespace();
$formatter->append_preformatted(
esc_html( __( 'Use HTML content type', 'contact-form-7' ) )
);
$formatter->end_tag( 'tr' );
$formatter->append_start_tag( 'tr' );
$formatter->append_start_tag( 'th', array(
'scope' => 'row',
) );
$formatter->append_start_tag( 'label', array(
'for' => sprintf( '%s-attachments', $id ),
) );
$formatter->append_preformatted(
esc_html( __( 'File attachments', 'contact-form-7' ) )
);
$formatter->append_start_tag( 'td' );
$formatter->append_start_tag( 'textarea', array(
'id' => sprintf( '%s-attachments', $id ),
'name' => sprintf( '%s[attachments]', $id ),
'cols' => 100,
'rows' => 4,
'class' => 'large-text code',
'data-config-field' => sprintf( '%s.attachments', $options['name'] ),
) );
$formatter->append_preformatted(
esc_textarea( $mail['attachments'] )
);
$formatter->end_tag( 'textarea' );
$formatter->end_tag( 'tr' );
$formatter->print();
}
function wpcf7_editor_panel_messages( $post ) {
$description = sprintf(
/* translators: %s: URL to support page about the messages editor */
__( 'You can edit messages used in various situations here. For details, see <a href="%s">Editing messages</a>.', 'contact-form-7' ),
__( 'https://contactform7.com/editing-messages/', 'contact-form-7' )
);
$messages = wpcf7_messages();
if (
isset( $messages['captcha_not_match'] ) and
! wpcf7_use_really_simple_captcha()
) {
unset( $messages['captcha_not_match'] );
}
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'h2' );
$formatter->append_preformatted(
esc_html( __( 'Messages', 'contact-form-7' ) )
);
$formatter->end_tag( 'h2' );
$formatter->append_start_tag( 'fieldset' );
$formatter->append_start_tag( 'legend' );
$formatter->append_preformatted( $description );
$formatter->end_tag( 'legend' );
foreach ( $messages as $key => $arr ) {
$field_id = sprintf( 'wpcf7-message-%s', strtr( $key, '_', '-' ) );
$field_name = sprintf( 'wpcf7-messages[%s]', $key );
$formatter->append_start_tag( 'p', array(
'class' => 'description',
) );
$formatter->append_start_tag( 'label', array(
'for' => $field_id,
) );
$formatter->append_preformatted( esc_html( $arr['description'] ) );
$formatter->append_start_tag( 'br' );
$formatter->append_start_tag( 'input', array(
'type' => 'text',
'id' => $field_id,
'name' => $field_name,
'class' => 'large-text',
'size' => 70,
'value' => $post->message( $key, false ),
'data-config-field' => sprintf( 'messages.%s', $key ),
) );
}
$formatter->print();
}
function wpcf7_editor_panel_additional_settings( $post ) {
$description = sprintf(
/* translators: %s: URL to support page about the additional settings editor */
__( 'You can add customization code snippets here. For details, see <a href="%s">Additional settings</a>.', 'contact-form-7' ),
__( 'https://contactform7.com/additional-settings/', 'contact-form-7' )
);
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'h2' );
$formatter->append_preformatted(
esc_html( __( 'Additional Settings', 'contact-form-7' ) )
);
$formatter->end_tag( 'h2' );
$formatter->append_start_tag( 'fieldset' );
$formatter->append_start_tag( 'legend' );
$formatter->append_preformatted( $description );
$formatter->end_tag( 'legend' );
$formatter->append_start_tag( 'textarea', array(
'id' => 'wpcf7-additional-settings',
'name' => 'wpcf7-additional-settings',
'cols' => 100,
'rows' => 24,
'class' => 'large-text',
'data-config-field' => 'additional_settings.body',
) );
$formatter->append_preformatted(
esc_textarea( $post->prop( 'additional_settings' ) )
);
$formatter->end_tag( 'textarea' );
$formatter->print();
}

View File

@@ -0,0 +1,104 @@
<?php
class WPCF7_Help_Tabs {
private $screen;
public function __construct( WP_Screen $screen ) {
$this->screen = $screen;
}
public function set_help_tabs( $screen_type ) {
switch ( $screen_type ) {
case 'list':
$this->screen->add_help_tab( array(
'id' => 'list_overview',
'title' => __( 'Overview', 'contact-form-7' ),
'content' => $this->content( 'list_overview' ),
) );
$this->screen->add_help_tab( array(
'id' => 'list_available_actions',
'title' => __( 'Available Actions', 'contact-form-7' ),
'content' => $this->content( 'list_available_actions' ),
) );
$this->sidebar();
return;
case 'edit':
$this->screen->add_help_tab( array(
'id' => 'edit_overview',
'title' => __( 'Overview', 'contact-form-7' ),
'content' => $this->content( 'edit_overview' ),
) );
$this->screen->add_help_tab( array(
'id' => 'edit_form_tags',
'title' => __( 'Form-tags', 'contact-form-7' ),
'content' => $this->content( 'edit_form_tags' ),
) );
$this->screen->add_help_tab( array(
'id' => 'edit_mail_tags',
'title' => __( 'Mail-tags', 'contact-form-7' ),
'content' => $this->content( 'edit_mail_tags' ),
) );
$this->sidebar();
return;
case 'integration':
$this->screen->add_help_tab( array(
'id' => 'integration_overview',
'title' => __( 'Overview', 'contact-form-7' ),
'content' => $this->content( 'integration_overview' ),
) );
$this->sidebar();
return;
}
}
private function content( $name ) {
$content = array();
$content['list_overview'] = '<p>' . __( 'On this screen, you can manage contact forms provided by Contact Form 7. You can manage an unlimited number of contact forms. Each contact form has a unique ID and Contact Form 7 shortcode ([contact-form-7 ...]). To insert a contact form into a post or a text widget, insert the shortcode into the target.', 'contact-form-7' ) . '</p>';
$content['list_available_actions'] = '<p>' . __( 'Hovering over a row in the contact forms list will display action links that allow you to manage your contact form. You can perform the following actions:', 'contact-form-7' ) . '</p>';
$content['list_available_actions'] .= '<p>' . __( '<strong>Edit</strong> - Navigates to the editing screen for that contact form. You can also reach that screen by clicking on the contact form title.', 'contact-form-7' ) . '</p>';
$content['list_available_actions'] .= '<p>' . __( '<strong>Duplicate</strong> - Clones that contact form. A cloned contact form inherits all content from the original, but has a different ID.', 'contact-form-7' ) . '</p>';
$content['edit_overview'] = '<p>' . __( 'On this screen, you can edit a contact form. A contact form is comprised of the following components:', 'contact-form-7' ) . '</p>';
$content['edit_overview'] .= '<p>' . __( '<strong>Title</strong> is the title of a contact form. This title is only used for labeling a contact form, and can be edited.', 'contact-form-7' ) . '</p>';
$content['edit_overview'] .= '<p>' . __( '<strong>Form</strong> is a content of HTML form. You can use arbitrary HTML, which is allowed inside a form element. You can also use Contact Form 7&#8217;s form-tags here.', 'contact-form-7' ) . '</p>';
$content['edit_overview'] .= '<p>' . __( '<strong>Mail</strong> manages a mail template (headers and message body) that this contact form will send when users submit it. You can use Contact Form 7&#8217;s mail-tags here.', 'contact-form-7' ) . '</p>';
$content['edit_overview'] .= '<p>' . __( '<strong>Mail (2)</strong> is an additional mail template that works similar to Mail. Mail (2) is different in that it is sent only when Mail has been sent successfully.', 'contact-form-7' ) . '</p>';
$content['edit_overview'] .= '<p>' . __( 'In <strong>Messages</strong>, you can edit various types of messages used for this contact form. These messages are relatively short messages, like a validation error message you see when you leave a required field blank.', 'contact-form-7' ) . '</p>';
$content['edit_overview'] .= '<p>' . __( '<strong>Additional Settings</strong> provides a place where you can customize the behavior of this contact form by adding code snippets.', 'contact-form-7' ) . '</p>';
$content['edit_form_tags'] = '<p>' . __( 'A form-tag is a short code enclosed in square brackets used in a form content. A form-tag generally represents an input field, and its components can be separated into four parts: type, name, options, and values. Contact Form 7 supports several types of form-tags including text fields, number fields, date fields, checkboxes, radio buttons, menus, file-uploading fields, CAPTCHAs, and quiz fields.', 'contact-form-7' ) . '</p>';
$content['edit_form_tags'] .= '<p>' . __( 'While form-tags have a comparatively complex syntax, you do not need to know the syntax to add form-tags because you can use the straightforward tag generator (<strong>Generate Tag</strong> button on this screen).', 'contact-form-7' ) . '</p>';
$content['edit_mail_tags'] = '<p>' . __( 'A mail-tag is also a short code enclosed in square brackets that you can use in every Mail and Mail (2) field. A mail-tag represents a user input value through an input field of a corresponding form-tag.', 'contact-form-7' ) . '</p>';
$content['edit_mail_tags'] .= '<p>' . __( 'There are also special mail-tags that have specific names, but do not have corresponding form-tags. They are used to represent meta information of form submissions like the submitter&#8217;s IP address or the URL of the page.', 'contact-form-7' ) . '</p>';
$content['integration_overview'] = '<p>' . __( 'On this screen, you can manage services that are available through Contact Form 7. Using API will allow you to collaborate with any services that are available.', 'contact-form-7' ) . '</p>';
$content['integration_overview'] .= '<p>' . __( 'You may need to first sign up for an account with the service that you plan to use. When you do so, you would need to authorize Contact Form 7 to access the service with your account.', 'contact-form-7' ) . '</p>';
$content['integration_overview'] .= '<p>' . __( 'Any information you provide will not be shared with service providers without your authorization.', 'contact-form-7' ) . '</p>';
if ( ! empty( $content[$name] ) ) {
return $content[$name];
}
}
public function sidebar() {
$content = '<p><strong>' . __( 'For more information:', 'contact-form-7' ) . '</strong></p>';
$content .= '<p>' . wpcf7_link( __( 'https://contactform7.com/docs/', 'contact-form-7' ), __( 'Docs', 'contact-form-7' ) ) . '</p>';
$content .= '<p>' . wpcf7_link( __( 'https://contactform7.com/faq/', 'contact-form-7' ), __( 'FAQ', 'contact-form-7' ) ) . '</p>';
$content .= '<p>' . wpcf7_link( __( 'https://contactform7.com/support/', 'contact-form-7' ), __( 'Support', 'contact-form-7' ) ) . '</p>';
$this->screen->set_help_sidebar( $content );
}
}

View File

@@ -0,0 +1,9 @@
<?php
return array(
'dependencies' => array(
'wp-api-fetch',
'wp-i18n',
),
'version' => WPCF7_VERSION,
);

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,627 @@
<?php
/**
* The base class for form-tag generators management.
*/
class WPCF7_TagGenerator {
private static $instance;
private $panels = array();
private function __construct() {}
/**
* Returns the singleton instance of this class.
*/
public static function get_instance() {
if ( empty( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Adds a form-tag generator instance.
*/
public function add( $id, $title, $callback, $options = '' ) {
$id = trim( $id );
if (
'' === $id or
! wpcf7_is_name( $id ) or
! is_callable( $callback )
) {
return false;
}
$options = wp_parse_args( $options, array(
'version' => '1',
) );
$this->panels[$id] = array(
'title' => $title,
'content' => 'tag-generator-panel-' . $id,
'options' => $options,
'callback' => $callback,
);
if ( version_compare( $options['version'], '2', '<' ) ) {
$message = sprintf(
/* translators: 1: version, 2: tag generator title */
__( 'Use of tag generator instances older than version 2 is deprecated. Version %1$s instance (%2$s) detected.', 'contact-form-7' ),
$options['version'],
$title
);
wp_trigger_error( __METHOD__, $message, E_USER_DEPRECATED );
}
return true;
}
/**
* Renders form-tag generator calling buttons.
*/
public function print_buttons() {
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'span', array(
'id' => 'tag-generator-list',
'class' => 'hide-if-no-js',
) );
foreach ( (array) $this->panels as $panel ) {
$formatter->append_start_tag( 'button', array(
'type' => 'button',
'data-taggen' => 'open-dialog',
'data-target' => $panel['content'],
'title' => sprintf(
/* translators: %s: title of form-tag */
__( 'Form-tag Generator: %s', 'contact-form-7' ),
$panel['title']
),
) );
$formatter->append_preformatted( esc_html( $panel['title'] ) );
}
$formatter->print();
}
/**
* Renders form-tag generator dialog panels (hidden until called).
*/
public function print_panels( WPCF7_ContactForm $contact_form ) {
$formatter = new WPCF7_HTMLFormatter( array(
'allowed_html' => array_merge( wpcf7_kses_allowed_html(), array(
'dialog' => array(
'id' => true,
'class' => true,
),
'form' => array(
'method' => true,
'class' => true,
'data-*' => true,
),
) ),
) );
foreach ( (array) $this->panels as $id => $panel ) {
$callback = $panel['callback'];
$options = array_merge( $panel['options'], array(
'id' => $id,
'title' => $panel['title'],
'content' => $panel['content'],
) );
if ( is_callable( $callback ) ) {
$formatter->append_start_tag( 'dialog', array(
'id' => $options['content'],
'class' => 'tag-generator-dialog',
) );
$formatter->append_start_tag( 'button', array(
'class' => 'close-button',
'title' => __( 'Close this dialog box', 'contact-form-7' ),
'data-taggen' => 'close-dialog',
) );
$formatter->append_preformatted(
esc_html( __( 'Close', 'contact-form-7' ) )
);
$formatter->end_tag( 'button' );
$formatter->append_start_tag( 'form', array(
'method' => 'dialog',
'class' => 'tag-generator-panel',
'data-id' => $options['id'],
'data-version' => $options['version'],
) );
$formatter->call_user_func( $callback, $contact_form, $options );
$formatter->close_all_tags();
}
}
$formatter->print();
}
}
/**
* Class helps to implement a form-tag generator content.
*/
class WPCF7_TagGeneratorGenerator {
private $key = '';
/**
* The constructor.
*/
public function __construct( $key ) {
$this->key = $key;
}
/**
* Returns a unique reference ID.
*/
public function ref( $suffix = '' ) {
$ref = sprintf( '%s-%s', $this->key, $suffix );
$ref = strtolower( $ref );
$ref = preg_replace( '/[^0-9a-z-]/', '', $ref );
$ref = preg_replace( '/[-]+/', '-', $ref );
$ref = trim( $ref, '-' );
return $ref;
}
/**
* Calls one of the template methods.
*/
public function print( $part, $options = '' ) {
if ( is_callable( array( $this, $part ) ) ) {
call_user_func( array( $this, $part ), $options );
}
}
/**
* Template method for field type field.
*/
private function field_type( $options = '' ) {
$options = wp_parse_args( $options, array(
'with_required' => false,
'with_optional' => false,
'select_options' => array(),
) );
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'fieldset' );
$formatter->append_start_tag( 'legend', array(
'id' => $this->ref( 'type-legend' ),
) );
$formatter->append_preformatted(
esc_html( __( 'Field type', 'contact-form-7' ) )
);
$formatter->end_tag( 'legend' );
$formatter->append_start_tag( 'select', array(
'data-tag-part' => 'basetype',
'aria-labelledby' => $this->ref( 'type-legend' ),
) );
foreach ( (array) $options['select_options'] as $basetype => $title ) {
$formatter->append_start_tag( 'option', array(
'value' => $basetype,
) );
$formatter->append_preformatted( esc_html( $title ) );
}
$formatter->end_tag( 'select' );
if ( $options['with_required'] ) {
$formatter->append_start_tag( 'br' );
$formatter->append_start_tag( 'label' );
$formatter->append_start_tag( 'input', array(
'type' => 'checkbox',
'data-tag-part' => 'type-suffix',
'value' => '*',
) );
$formatter->append_whitespace();
$formatter->append_preformatted(
esc_html( __( 'This is a required field.', 'contact-form-7' ) )
);
}
if ( $options['with_optional'] ) {
$formatter->append_start_tag( 'br' );
$formatter->append_start_tag( 'label' );
$formatter->append_start_tag( 'input', array(
'type' => 'checkbox',
'data-tag-part' => 'option',
'data-tag-option' => 'optional',
'checked' => true,
) );
$formatter->append_whitespace();
$formatter->append_preformatted(
esc_html( __( 'This checkbox is optional.', 'contact-form-7' ) )
);
}
$formatter->print();
}
/**
* Template method for field name field.
*/
private function field_name( $options = '' ) {
$options = wp_parse_args( $options, array(
'ask_if' => '',
) );
?>
<fieldset>
<legend id="<?php echo esc_attr( $this->ref( 'name-legend' ) ); ?>"><?php
echo esc_html( __( 'Field name', 'contact-form-7' ) );
?></legend>
<input type="text" data-tag-part="name" pattern="[A-Za-z][A-Za-z0-9_\-]*" aria-labelledby="<?php echo esc_attr( $this->ref( 'name-legend' ) ); ?>" />
<?php
$tag_option = $label = '';
if ( 'author_name' === $options['ask_if'] ) {
$tag_option = 'autocomplete:name';
if ( wpcf7_akismet_is_available() ) {
$tag_option .= ' akismet:author';
}
$label = __( "This field expects the submitter name.", 'contact-form-7' );
} elseif ( 'author_email' === $options['ask_if'] ) {
$tag_option = 'autocomplete:email';
if ( wpcf7_akismet_is_available() ) {
$tag_option .= ' akismet:author_email';
}
$label = __( "This field expects the submitter email.", 'contact-form-7' );
} elseif ( 'author_url' === $options['ask_if'] ) {
$tag_option = 'autocomplete:url';
if ( wpcf7_akismet_is_available() ) {
$tag_option .= ' akismet:author_url';
}
$label = __( "This field expects the submitter URL.", 'contact-form-7' );
} elseif ( 'author_tel' === $options['ask_if'] ) {
$tag_option = 'autocomplete:tel';
$label = __( "This field expects the submitter telephone number.", 'contact-form-7' );
}
if ( $tag_option ) {
?>
<br />
<label>
<input type="checkbox" data-tag-part="option" data-tag-option="<?php echo esc_attr( $tag_option ); ?>" />
<?php echo esc_html( $label ); ?>
</label>
<?php
}
?>
</fieldset>
<?php
}
/**
* Template method for ID attribute option field.
*/
private function id_attr( $options = '' ) {
?>
<fieldset>
<legend id="<?php echo esc_attr( $this->ref( 'id-legend' ) ); ?>"><?php
echo esc_html( __( 'ID attribute', 'contact-form-7' ) );
?></legend>
<input type="text" data-tag-part="option" data-tag-option="id:" pattern="[A-Za-z][A-Za-z0-9_\-]*" aria-labelledby="<?php echo esc_attr( $this->ref( 'id-legend' ) ); ?>" />
</fieldset>
<?php
}
/**
* Template method for class attribute option field.
*/
private function class_attr( $options = '' ) {
?>
<fieldset>
<legend id="<?php echo esc_attr( $this->ref( 'class-legend' ) ); ?>"><?php
echo esc_html( __( 'Class attribute', 'contact-form-7' ) );
?></legend>
<input type="text" data-tag-part="option" data-tag-option="class:" pattern="[A-Za-z0-9_\-\s]*" aria-labelledby="<?php echo esc_attr( $this->ref( 'class-legend' ) ); ?>" />
</fieldset>
<?php
}
/**
* Template method for min/max options.
*/
private function min_max( $options = '' ) {
$options = wp_parse_args( $options, array(
'type' => 'number',
'title' => __( 'Length', 'contact-form-7' ),
'min_option' => 'minlength:',
'max_option' => 'maxlength:',
'accept_minus' => false,
) );
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'fieldset' );
$formatter->append_start_tag( 'legend' );
$formatter->append_preformatted( esc_html( $options['title'] ) );
$formatter->end_tag( 'legend' );
$formatter->append_start_tag( 'label' );
$formatter->append_preformatted(
esc_html( __( 'Min', 'contact-form-7' ) )
);
$formatter->append_whitespace();
$formatter->append_start_tag( 'input', array(
'type' => $options['type'],
'data-tag-part' => 'option',
'data-tag-option' => $options['min_option'],
'min' => $options['accept_minus'] ? null : 0,
) );
$formatter->end_tag( 'label' );
$formatter->append_preformatted( ' &#8660; ' );
$formatter->append_start_tag( 'label' );
$formatter->append_preformatted(
esc_html( __( 'Max', 'contact-form-7' ) )
);
$formatter->append_whitespace();
$formatter->append_start_tag( 'input', array(
'type' => $options['type'],
'data-tag-part' => 'option',
'data-tag-option' => $options['max_option'],
'min' => $options['accept_minus'] ? null : 0,
) );
$formatter->end_tag( 'label' );
$formatter->print();
}
/**
* Template method for default value field.
*/
private function default_value( $options = '' ) {
$options = wp_parse_args( $options, array(
'type' => 'text',
'title' => __( 'Default value', 'contact-form-7' ),
'with_placeholder' => false,
'use_content' => false,
) );
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'fieldset' );
$formatter->append_start_tag( 'legend', array(
'id' => $this->ref( 'value-legend' ),
) );
$formatter->append_preformatted( esc_html( $options['title'] ) );
$formatter->end_tag( 'legend' );
$formatter->append_start_tag( 'input', array(
'type' => $options['type'],
'data-tag-part' => $options['use_content'] ? 'content' : 'value',
'aria-labelledby' => $this->ref( 'value-legend' ),
) );
if ( $options['with_placeholder'] ) {
$formatter->append_start_tag( 'br' );
$formatter->append_start_tag( 'label' );
$formatter->append_start_tag( 'input', array(
'type' => 'checkbox',
'data-tag-part' => 'option',
'data-tag-option' => 'placeholder',
) );
$formatter->append_whitespace();
$formatter->append_preformatted(
esc_html( __( 'Use this text as the placeholder.', 'contact-form-7' ) )
);
}
$formatter->print();
}
/**
* Template method for selectable values useful for checkboxes or a menu.
*/
private function selectable_values( $options = '' ) {
$options = wp_parse_args( $options, array(
'first_as_label' => false,
'use_label_element' => false,
) );
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'fieldset' );
$formatter->append_start_tag( 'legend', array(
'id' => $this->ref( 'selectable-values-legend' ),
) );
$formatter->append_preformatted(
esc_html( __( 'Selectable values', 'contact-form-7' ) )
);
$formatter->end_tag( 'legend' );
$formatter->append_start_tag( 'span', array(
'id' => $this->ref( 'selectable-values-description' ),
) );
$formatter->append_preformatted(
esc_html( __( 'One item per line.', 'contact-form-7' ) )
);
$formatter->end_tag( 'span' );
$formatter->append_start_tag( 'br' );
$formatter->append_start_tag( 'textarea', array(
'required' => true,
'data-tag-part' => 'value',
'aria-labelledby' => $this->ref( 'selectable-values-legend' ),
'aria-describedby' => $this->ref( 'selectable-values-description' ),
) );
$formatter->append_preformatted(
esc_html( __( "Option 1\nOption 2\nOption 3", 'contact-form-7' ) )
);
$formatter->end_tag( 'textarea' );
if ( $options['first_as_label'] ) {
$formatter->append_start_tag( 'br' );
$formatter->append_start_tag( 'label' );
$formatter->append_start_tag( 'input', array(
'type' => 'checkbox',
'checked' => 'checked' === $options['first_as_label'],
'data-tag-part' => 'option',
'data-tag-option' => 'first_as_label',
) );
$formatter->append_whitespace();
$formatter->append_preformatted(
esc_html( __( 'Use the first item as a label.', 'contact-form-7' ) )
);
$formatter->end_tag( 'label' );
}
if ( $options['use_label_element'] ) {
$formatter->append_start_tag( 'br' );
$formatter->append_start_tag( 'label' );
$formatter->append_start_tag( 'input', array(
'type' => 'checkbox',
'checked' => 'checked' === $options['use_label_element'],
'data-tag-part' => 'option',
'data-tag-option' => 'use_label_element',
) );
$formatter->append_whitespace();
$formatter->append_preformatted(
esc_html( __( 'Wrap each item with a label element.', 'contact-form-7' ) )
);
$formatter->end_tag( 'label' );
}
$formatter->print();
}
/**
* Template method for insert-box content including the result form-tag.
*/
private function insert_box_content( $options = '' ) {
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'div', array(
'class' => 'flex-container',
) );
$formatter->append_start_tag( 'input', array(
'type' => 'text',
'class' => 'code selectable',
'readonly' => true,
'data-tag-part' => 'tag',
'aria-label' => __( 'The form-tag to be inserted into the form template', 'contact-form-7' ),
) );
$formatter->append_whitespace();
$formatter->append_start_tag( 'button', array(
'type' => 'button',
'class' => 'button button-primary',
'data-taggen' => 'insert-tag',
) );
$formatter->append_preformatted(
esc_html( __( 'Insert Tag', 'contact-form-7' ) )
);
$formatter->end_tag( 'button' );
$formatter->print();
}
/**
* Template method for a tip message about mail-tag.
*/
private function mail_tag_tip( $options = '' ) {
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'p', array(
'class' => 'mail-tag-tip',
) );
$formatter->append_preformatted( sprintf(
/* translators: %s: mail-tag corresponding to the form-tag */
esc_html( __( 'To use the user input in the email, insert the corresponding mail-tag %s into the email template.', 'contact-form-7' ) ),
'<strong data-tag-part="mail-tag"></strong>'
) );
$formatter->print();
}
}

View File

@@ -0,0 +1,280 @@
<?php
abstract class WPCF7_WelcomePanelColumn {
abstract protected function icon();
abstract protected function title();
abstract protected function content();
public function print_content() {
$content = $this->content();
if ( is_array( $content ) ) {
$content = implode( "\n\n", $content );
}
$content = wp_kses_post( $content );
$content = wptexturize( $content );
$content = convert_chars( $content );
$content = wpautop( $content );
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'div', array(
'class' => 'welcome-panel-column',
) );
$formatter->append_start_tag( 'h3' );
$formatter->append_start_tag( 'span', array(
'class' => sprintf( 'dashicons dashicons-%s', $this->icon() ),
'aria-hidden' => 'true',
) );
$formatter->end_tag( 'span' );
$formatter->append_whitespace();
$formatter->append_preformatted( $this->title() );
$formatter->end_tag( 'h3' );
$formatter->append_preformatted( $content );
$formatter->print();
}
}
class WPCF7_WelcomePanelColumn_AntiSpam extends WPCF7_WelcomePanelColumn {
protected function icon() {
return 'shield';
}
protected function title() {
return __( 'Getting spammed? You have protection.', 'contact-form-7' );
}
protected function content() {
return array(
__( 'Spammers target everything; your contact forms are not an exception. Before you get spammed, protect your contact forms with the powerful anti-spam features Contact Form 7 provides.', 'contact-form-7' ),
sprintf(
/* translators: 1: URL to support page about Akismet, 2: Cloudflare Turnstile, 3: Disallowed list */
__( 'Contact Form 7 supports spam-filtering with <a href="%1$s">Akismet</a>. <a href="%2$s">Cloudflare Turnstile</a> blocks annoying spambots. Plus, using <a href="%3$s">disallowed list</a>, you can block messages containing specified keywords or those sent from specified IP addresses.', 'contact-form-7' ),
__( 'https://contactform7.com/spam-filtering-with-akismet/', 'contact-form-7' ),
__( 'https://contactform7.com/turnstile-integration/', 'contact-form-7' ),
__( 'https://contactform7.com/comment-blacklist/', 'contact-form-7' )
),
);
}
}
class WPCF7_WelcomePanelColumn_Donation extends WPCF7_WelcomePanelColumn {
protected function icon() {
return 'megaphone';
}
protected function title() {
return __( 'Contact Form 7 needs your support.', 'contact-form-7' );
}
protected function content() {
return array(
__( 'It is hard to continue to maintain this plugin without support from users like you.', 'contact-form-7' ),
sprintf(
/* translators: %s: URL to support page about ways to contribute */
__( 'There are several ways for you to <a href="%s">contribute to the project</a>: testing, coding, translating it into your local languages, helping other users, financial donations, etc, etc. We equally welcome you regardless of the way you contribute.', 'contact-form-7' ),
__( 'https://contactform7.com/contributing/', 'contact-form-7' )
),
);
}
}
class WPCF7_WelcomePanelColumn_Flamingo extends WPCF7_WelcomePanelColumn {
protected function icon() {
return 'editor-help';
}
protected function title() {
return __( 'Before you cry over spilt mail&#8230;', 'contact-form-7' );
}
protected function content() {
return array(
__( 'Contact Form 7 does not store submitted messages anywhere. Therefore, you may lose important messages forever if your mail server has issues or you make a mistake in mail configuration.', 'contact-form-7' ),
sprintf(
/* translators: %s: URL to support page about the Flamingo plugin */
__( 'Install a message storage plugin before this happens to you. <a href="%s">Flamingo</a> saves all messages through contact forms into the database. Flamingo is a free WordPress plugin created by the same author as Contact Form 7.', 'contact-form-7' ),
__( 'https://contactform7.com/save-submitted-messages-with-flamingo/', 'contact-form-7' )
),
);
}
}
class WPCF7_WelcomePanelColumn_Integration extends WPCF7_WelcomePanelColumn {
protected function icon() {
return 'superhero-alt';
}
protected function title() {
return __( 'You have strong allies to back you up.', 'contact-form-7' );
}
protected function content() {
return array(
sprintf(
/* translators: %s: URL to support page about the Brevo integration */
__( 'Your contact forms will become more powerful and versatile by integrating them with external APIs. With CRM and email marketing services, you can build your own contact lists (<a href="%s">Brevo</a>).', 'contact-form-7' ),
__( 'https://contactform7.com/sendinblue-integration/', 'contact-form-7' )
),
sprintf(
/* translators: 1: URL to support page about Cloudflare Turnstile, 2: Stripe */
__( 'With help from cloud-based machine learning, anti-spam services will protect your forms (<a href="%1$s">Cloudflare Turnstile</a>). Even payment services are natively supported (<a href="%2$s">Stripe</a>).', 'contact-form-7' ),
__( 'https://contactform7.com/turnstile-integration/', 'contact-form-7' ),
__( 'https://contactform7.com/stripe-integration/', 'contact-form-7' )
),
);
}
}
function wpcf7_welcome_panel() {
$columns = array();
$flamingo_is_active = defined( 'FLAMINGO_VERSION' );
$sendinblue_is_active = false;
if (
class_exists( 'WPCF7_Sendinblue' ) and
$sendinblue = WPCF7_Sendinblue::get_instance()
) {
$sendinblue_is_active = $sendinblue->is_active();
}
if ( $flamingo_is_active and $sendinblue_is_active ) {
$columns[] = new WPCF7_WelcomePanelColumn_AntiSpam();
$columns[] = new WPCF7_WelcomePanelColumn_Donation();
} elseif ( $flamingo_is_active ) {
$columns[] = new WPCF7_WelcomePanelColumn_Integration();
$columns[] = new WPCF7_WelcomePanelColumn_AntiSpam();
} elseif ( $sendinblue_is_active ) {
$columns[] = new WPCF7_WelcomePanelColumn_Flamingo();
$columns[] = new WPCF7_WelcomePanelColumn_AntiSpam();
} else {
$columns[] = new WPCF7_WelcomePanelColumn_Flamingo();
$columns[] = new WPCF7_WelcomePanelColumn_Integration();
}
$classes = 'wpcf7-welcome-panel';
$vers = (array) get_user_meta( get_current_user_id(),
'wpcf7_hide_welcome_panel_on', true
);
if ( wpcf7_version_grep( wpcf7_version( 'only_major=1' ), $vers ) ) {
$classes .= ' hidden';
}
?>
<div id="wpcf7-welcome-panel" class="<?php echo esc_attr( $classes ); ?>">
<?php wp_nonce_field( 'wpcf7-welcome-panel-nonce', 'welcomepanelnonce', false ); ?>
<a class="welcome-panel-close" href="<?php echo esc_url( menu_page_url( 'wpcf7', false ) ); ?>"><?php echo esc_html( __( 'Dismiss', 'contact-form-7' ) ); ?></a>
<div class="welcome-panel-content">
<div class="welcome-panel-column-container">
<?php
foreach ( $columns as $column ) {
$column->print_content();
}
?>
</div>
</div>
</div>
<?php
}
add_action(
'wp_ajax_wpcf7-update-welcome-panel',
'wpcf7_admin_ajax_welcome_panel',
10, 0
);
function wpcf7_admin_ajax_welcome_panel() {
check_ajax_referer( 'wpcf7-welcome-panel-nonce', 'welcomepanelnonce' );
$vers = get_user_meta( get_current_user_id(),
'wpcf7_hide_welcome_panel_on', true
);
if ( empty( $vers ) or ! is_array( $vers ) ) {
$vers = array();
}
if ( empty( $_POST['visible'] ) ) {
$vers[] = wpcf7_version( 'only_major=1' );
} else {
$vers = array_diff( $vers, array( wpcf7_version( 'only_major=1' ) ) );
}
$vers = array_unique( $vers );
update_user_meta( get_current_user_id(),
'wpcf7_hide_welcome_panel_on', $vers
);
wp_die( 1 );
}
add_filter(
'screen_settings',
'wpcf7_welcome_panel_screen_settings',
10, 2
);
function wpcf7_welcome_panel_screen_settings( $screen_settings, $screen ) {
if ( 'toplevel_page_wpcf7' !== $screen->id ) {
return $screen_settings;
}
$vers = (array) get_user_meta( get_current_user_id(),
'wpcf7_hide_welcome_panel_on', true
);
$checkbox_id = 'wpcf7-welcome-panel-show';
$checked = ! in_array( wpcf7_version( 'only_major=1' ), $vers, true );
$checkbox = sprintf(
'<input %s />',
wpcf7_format_atts( array(
'id' => $checkbox_id,
'type' => 'checkbox',
'checked' => $checked,
) )
);
$screen_settings .= sprintf( '
<fieldset class="wpcf7-welcome-panel-options">
<legend>%1$s</legend>
<label for="%2$s">%3$s %4$s</label>
</fieldset>',
esc_html( __( 'Welcome panel', 'contact-form-7' ) ),
esc_attr( $checkbox_id ),
$checkbox,
esc_html( __( 'Show welcome panel', 'contact-form-7' ) )
);
return $screen_settings;
}