PDF rausgenommen

This commit is contained in:
aschwarz
2023-01-23 11:03:31 +01:00
parent 82d562a322
commit a6523903eb
28078 changed files with 4247552 additions and 2 deletions

View File

@ -0,0 +1,603 @@
<?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', 'wpcf7_admin_init', 10, 0 );
function wpcf7_admin_init() {
do_action( 'wpcf7_admin_init' );
}
add_action( 'admin_menu', 'wpcf7_admin_menu', 9, 0 );
function wpcf7_admin_menu() {
global $_wp_last_object_menu;
$_wp_last_object_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',
$_wp_last_object_menu );
$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 New Contact Form', 'contact-form-7' ),
__( 'Add New', '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 Other Services', '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/css/styles.css' ),
array(), WPCF7_VERSION, 'all'
);
if ( wpcf7_is_rtl() ) {
wp_enqueue_style( 'contact-form-7-admin-rtl',
wpcf7_plugin_url( 'admin/css/styles-rtl.css' ),
array(), WPCF7_VERSION, 'all'
);
}
wp_enqueue_script( 'wpcf7-admin',
wpcf7_plugin_url( 'admin/js/scripts.js' ),
array( 'jquery', 'jquery-ui-tabs' ),
WPCF7_VERSION, true
);
$args = array(
'apiSettings' => array(
'root' => esc_url_raw( rest_url( 'contact-form-7/v1' ) ),
'namespace' => 'contact-form-7/v1',
'nonce' => ( wp_installing() && ! is_multisite() )
? '' : wp_create_nonce( 'wp_rest' ),
),
'pluginUrl' => wpcf7_plugin_url(),
'saveAlert' => __(
"The changes you made will be lost if you navigate away from this page.",
'contact-form-7' ),
'activeTab' => isset( $_GET['active-tab'] )
? (int) $_GET['active-tab'] : 0,
'configValidator' => array(
'errors' => array(),
'howToCorrect' => __( "How to resolve?", 'contact-form-7' ),
'oneError' => __( '1 configuration error detected', 'contact-form-7' ),
'manyErrors' => __( '%d configuration errors detected', 'contact-form-7' ),
'oneErrorInTab' => __( '1 configuration error detected in this tab panel', 'contact-form-7' ),
'manyErrorsInTab' => __( '%d configuration errors detected in this tab panel', 'contact-form-7' ),
'docUrl' => WPCF7_ConfigValidator::get_doc_link(),
/* translators: screen reader text */
'iconAlt' => __( '(configuration error)', 'contact-form-7' ),
),
);
if ( $post = wpcf7_get_current_contact_form()
and current_user_can( 'wpcf7_edit_contact_form', $post->id() )
and wpcf7_validate_configuration() ) {
$config_validator = new WPCF7_ConfigValidator( $post );
$config_validator->restore();
$args['configValidator']['errors'] =
$config_validator->collect_error_messages();
}
wp_localize_script( 'wpcf7-admin', 'wpcf7', $args );
add_thickbox();
wp_enqueue_script( 'wpcf7-admin-taggenerator',
wpcf7_plugin_url( 'admin/js/tag-generator.js' ),
array( 'jquery', 'thickbox', 'wpcf7-admin' ), WPCF7_VERSION, true );
}
add_action( 'doing_dark_mode', 'wpcf7_dark_mode_support', 10, 1 );
function wpcf7_dark_mode_support( $user_id ) {
wp_enqueue_style( 'contact-form-7-admin-dark-mode',
wpcf7_plugin_url( 'admin/css/styles-dark-mode.css' ),
array( 'contact-form-7-admin' ), WPCF7_VERSION, 'screen' );
}
add_filter( 'set-screen-option', 'wpcf7_set_screen_options', 10, 3 );
function wpcf7_set_screen_options( $result, $option, $value ) {
$wpcf7_screens = array(
'cfseven_contact_forms_per_page',
);
if ( in_array( $option, $wpcf7_screens ) ) {
$result = $value;
}
return $result;
}
function wpcf7_load_contact_form_admin() {
global $plugin_page;
$action = wpcf7_current_action();
do_action( 'wpcf7_admin_load',
isset( $_GET['page'] ) ? trim( $_GET['page'] ) : '',
$action
);
if ( 'save' == $action ) {
$id = isset( $_POST['post_ID'] ) ? $_POST['post_ID'] : '-1';
check_admin_referer( 'wpcf7-save-contact-form_' . $id );
if ( ! current_user_can( 'wpcf7_edit_contact_form', $id ) ) {
wp_die( __( 'You are not allowed to edit this item.', 'contact-form-7' ) );
}
$args = $_REQUEST;
$args['id'] = $id;
$args['title'] = isset( $_POST['post_title'] )
? $_POST['post_title'] : null;
$args['locale'] = isset( $_POST['wpcf7-locale'] )
? $_POST['wpcf7-locale'] : null;
$args['form'] = isset( $_POST['wpcf7-form'] )
? $_POST['wpcf7-form'] : '';
$args['mail'] = isset( $_POST['wpcf7-mail'] )
? wpcf7_sanitize_mail( $_POST['wpcf7-mail'] )
: array();
$args['mail_2'] = isset( $_POST['wpcf7-mail-2'] )
? wpcf7_sanitize_mail( $_POST['wpcf7-mail-2'] )
: array();
$args['messages'] = isset( $_POST['wpcf7-messages'] )
? $_POST['wpcf7-messages'] : array();
$args['additional_settings'] = isset( $_POST['wpcf7-additional-settings'] )
? $_POST['wpcf7-additional-settings'] : '';
$contact_form = wpcf7_save_contact_form( $args );
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' => isset( $_POST['active-tab'] )
? (int) $_POST['active-tab'] : 0,
);
if ( ! $contact_form ) {
$query['message'] = 'failed';
} elseif ( -1 == $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 = empty( $_POST['post_ID'] )
? absint( $_REQUEST['post'] )
: absint( $_POST['post_ID'] );
check_admin_referer( 'wpcf7-copy-contact-form_' . $id );
if ( ! current_user_can( 'wpcf7_edit_contact_form', $id ) ) {
wp_die( __( '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 ) {
if ( ! empty( $_POST['post_ID'] ) ) {
check_admin_referer( 'wpcf7-delete-contact-form_' . $_POST['post_ID'] );
} elseif ( ! is_array( $_REQUEST['post'] ) ) {
check_admin_referer( 'wpcf7-delete-contact-form_' . $_REQUEST['post'] );
} else {
check_admin_referer( 'bulk-posts' );
}
$posts = empty( $_POST['post_ID'] )
? (array) $_REQUEST['post']
: (array) $_POST['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( __( 'You are not allowed to delete this item.', 'contact-form-7' ) );
}
if ( ! $post->delete() ) {
wp_die( __( '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();
}
$_GET['post'] = isset( $_GET['post'] ) ? $_GET['post'] : '';
$post = null;
if ( 'wpcf7-new' == $plugin_page ) {
$post = WPCF7_ContactForm::get_template( array(
'locale' => isset( $_GET['locale'] ) ? $_GET['locale'] : null,
) );
} elseif ( ! empty( $_GET['post'] ) ) {
$post = WPCF7_ContactForm::get_instance( $_GET['post'] );
}
$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' => 'cfseven_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();
?>
<div class="wrap" id="wpcf7-contact-form-list-table">
<h1 class="wp-heading-inline"><?php
echo esc_html( __( 'Contact Forms', 'contact-form-7' ) );
?></h1>
<?php
if ( current_user_can( 'wpcf7_edit_contact_forms' ) ) {
echo wpcf7_link(
menu_page_url( 'wpcf7-new', false ),
__( 'Add New', 'contact-form-7' ),
array( 'class' => 'page-title-action' )
);
}
if ( ! empty( $_REQUEST['s'] ) ) {
echo sprintf( '<span class="subtitle">'
/* translators: %s: search keywords */
. __( 'Search results for &#8220;%s&#8221;', 'contact-form-7' )
. '</span>', esc_html( $_REQUEST['s'] ) );
}
?>
<hr class="wp-header-end">
<?php
do_action( 'wpcf7_admin_warnings',
'wpcf7', wpcf7_current_action(), null );
wpcf7_welcome_panel();
do_action( 'wpcf7_admin_notices',
'wpcf7', wpcf7_current_action(), null );
?>
<form method="get" action="">
<input type="hidden" name="page" value="<?php echo esc_attr( $_REQUEST['page'] ); ?>" />
<?php $list_table->search_box( __( 'Search Contact Forms', 'contact-form-7' ), 'wpcf7-contact' ); ?>
<?php $list_table->display(); ?>
</form>
</div>
<?php
}
function wpcf7_admin_add_new_page() {
$post = wpcf7_get_current_contact_form();
if ( ! $post ) {
$post = WPCF7_ContactForm::get_template();
}
$post_id = -1;
require_once WPCF7_PLUGIN_DIR . '/admin/includes/editor.php';
require_once WPCF7_PLUGIN_DIR . '/admin/edit-contact-form.php';
}
function wpcf7_load_integration_page() {
do_action( 'wpcf7_admin_load',
isset( $_GET['page'] ) ? trim( $_GET['page'] ) : '',
wpcf7_current_action()
);
$integration = WPCF7_Integration::get_instance();
if ( isset( $_REQUEST['service'] )
and $integration->service_exists( $_REQUEST['service'] ) ) {
$service = $integration->get_service( $_REQUEST['service'] );
$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 = isset( $_REQUEST['service'] )
? $integration->get_service( $_REQUEST['service'] )
: null;
?>
<div class="wrap" id="wpcf7-integration">
<h1><?php echo esc_html( __( 'Integration with Other Services', 'contact-form-7' ) ); ?></h1>
<?php
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 = isset( $_REQUEST['message'] ) ? $_REQUEST['message'] : '';
$service->admin_notice( $message );
$integration->list_services( array( 'include' => $_REQUEST['service'] ) );
} else {
$integration->list_services();
}
?>
</div>
<?php
}
/* Misc */
add_action( 'wpcf7_admin_notices', 'wpcf7_admin_updated_message', 10, 3 );
function wpcf7_admin_updated_message( $page, $action, $object ) {
if ( empty( $_REQUEST['message'] ) ) {
return;
}
if ( 'created' == $_REQUEST['message'] ) {
$updated_message = __( "Contact form created.", 'contact-form-7' );
} elseif ( 'saved' == $_REQUEST['message'] ) {
$updated_message = __( "Contact form saved.", 'contact-form-7' );
} elseif ( 'deleted' == $_REQUEST['message'] ) {
$updated_message = __( "Contact form deleted.", 'contact-form-7' );
}
if ( ! empty( $updated_message ) ) {
echo sprintf( '<div id="message" class="notice notice-success is-dismissible"><p>%s</p></div>', esc_html( $updated_message ) );
return;
}
if ( 'failed' == $_REQUEST['message'] ) {
$updated_message = __( "There was an error saving the contact form.",
'contact-form-7' );
echo sprintf( '<div id="message" class="notice notice-error is-dismissible"><p>%s</p></div>', esc_html( $updated_message ) );
return;
}
if ( 'validated' == $_REQUEST['message'] ) {
$bulk_validate = WPCF7::get_option( 'bulk_validate', array() );
$count_invalid = isset( $bulk_validate['count_invalid'] )
? absint( $bulk_validate['count_invalid'] ) : 0;
if ( $count_invalid ) {
$updated_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 ) );
echo sprintf( '<div id="message" class="notice notice-warning is-dismissible"><p>%s</p></div>', esc_html( $updated_message ) );
} else {
$updated_message = __( "Configuration validation completed. No invalid contact form was found.", 'contact-form-7' );
echo sprintf( '<div id="message" class="notice notice-success is-dismissible"><p>%s</p></div>', esc_html( $updated_message ) );
}
return;
}
}
add_filter( 'plugin_action_links', 'wpcf7_plugin_action_links', 10, 2 );
function wpcf7_plugin_action_links( $links, $file ) {
if ( $file != WPCF7_PLUGIN_BASENAME ) {
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, '<' ) ) {
return;
}
?>
<div class="notice notice-warning">
<p><?php
/* translators: 1: version of Contact Form 7, 2: version of WordPress, 3: URL */
echo sprintf( __( '<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' ) );
?></p>
</div>
<?php
}
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() ) ) {
return;
}
$message = __( "You are not allowed to edit this contact form.",
'contact-form-7' );
echo sprintf(
'<div class="notice notice-warning"><p>%s</p></div>',
esc_html( $message ) );
}

View File

@ -0,0 +1,72 @@
#wpcf7-contact-form-list-table span.shortcode input,
#wpcf7-contact-form-editor span.shortcode input {
color: #fff;
}
div.config-error, span.config-error, ul.config-error {
color: #bbc8d4;
}
.keyboard-interaction {
color: #bbc8d4;
}
#contact-form-editor .contact-form-editor-panel {
background-color: #32373c;
}
#contact-form-editor-tabs {
border-bottom: 1px solid #aaa;
}
#contact-form-editor-tabs li {
border: 1px solid #ccc;
border-bottom: 1px solid #aaa;
background-color: #37444c;
}
#contact-form-editor-tabs li:hover {
background-color: #000;
}
#contact-form-editor-tabs li.ui-tabs-active,
#contact-form-editor-tabs li.ui-tabs-active:hover {
border-top: 1px solid #aaa;
border-right: 1px solid #aaa;
border-left: 1px solid #aaa;
border-bottom: 1px solid #32373c;
background-color: #32373c;
}
#contact-form-editor-tabs li a {
color: #bbc8d4;
}
#contact-form-editor-tabs li.ui-tabs-active a {
color: #fff;
}
#contact-form-editor-tabs li a:hover {
color: #fff;
}
.contact-form-editor-box-mail span.mailtag {
color: #ddd;
}
.contact-form-editor-box-mail span.mailtag.used {
color: #999;
}
#mail-panel .contact-form-editor-box-mail table.form-table tr th,
#mail-panel .contact-form-editor-box-mail table.form-table tr td {
background-color: #32373c;
}
div.wrap#wpcf7-integration .card.active {
border-color: #00a0d2;
}
div.wrap#wpcf7-integration .card .infobox {
color: #aaa;
}

View File

@ -0,0 +1,62 @@
/*
* Tabs
*/
#contact-form-editor-tabs {
padding: 9px 10px 0 15px;
}
/*
* Form Tab
*/
.tag-generator-panel {
text-align: right;
}
.tag-generator-panel .control-box > fieldset legend {
border: 1px solid #dfdfdf;
border-right: 4px solid #00a0d2;
}
.tag-generator-panel .insert-box input.tag {
float: right;
}
.tag-generator-panel .insert-box .submitbox input[type="button"] {
float: left;
}
/*
* Mail Tab
*/
.contact-form-editor-box-mail span.mailtag {
margin: 0 4px 0 0;
}
/*
* Welcome Panel
*/
.welcome-panel .welcome-panel-column,
.welcome-panel .welcome-panel-column:first-child {
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,435 @@
#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;
}
#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: #f00;
}
#submitpost input.delete:focus {
outline: thin dotted;
}
.postbox-container .postbox h3 {
border-bottom: 1px solid transparent;
}
.keyboard-interaction {
visibility: hidden;
color: #23282d;
}
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;
}
[data-config-field][aria-invalid="true"] {
border-color: #d00;
}
#contact-form-editor-tabs li a .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: text-top;
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 15px 0 10px;
margin: 0;
}
#contact-form-editor-tabs li {
display: inline-block;
list-style: none;
border: 1px solid #ccc;
border-bottom: 1px solid #aaa;
padding: 0;
margin: 0 4px -1px;
background-color: #e4e4e4;
}
#contact-form-editor-tabs li:hover {
background-color: #fff;
}
#contact-form-editor-tabs li.ui-tabs-active,
#contact-form-editor-tabs li.ui-tabs-active:hover {
border-top: 1px solid #aaa;
border-right: 1px solid #aaa;
border-left: 1px solid #aaa;
border-bottom: 1px solid #f5f5f5;
background-color: #f5f5f5;
}
#contact-form-editor-tabs li a {
padding: 6px 10px;
font-size: 14px;
font-weight: normal;
line-height: 30px;
color: #333;
text-decoration: none;
}
#contact-form-editor-tabs li.ui-tabs-active a {
color: #000;
font-size: 14px;
font-weight: bold;
}
#contact-form-editor-tabs li a:hover {
color: #000;
}
#contact-form-editor .contact-form-editor-panel > div.config-error {
margin-bottom: 1.4em;
}
#contact-form-editor-tabs li.ui-tabs-active a .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 a.button {
font-size: 12px;
height: 26px;
line-height: 24px;
margin: 2px;
padding: 0 8px 1px;
}
.tag-generator-panel {
position: relative;
height: 495px;
}
.tag-generator-panel .control-box {
padding: 0;
margin: 0;
height: 380px;
overflow: auto;
}
.tag-generator-panel .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: 95%;
}
.tag-generator-panel table {
width: 100%;
}
.tag-generator-panel table.form-table th {
width: 120px;
padding: 4px 10px 4px 0;
font-size: 13px;
}
.tag-generator-panel table.form-table td {
padding: 4px 10px;
font-size: 13px;
}
.tag-generator-panel .control-box input.oneline {
width: 200px;
}
.tag-generator-panel .control-box input.large-text {
width: 400px;
}
.tag-generator-panel .control-box textarea.values {
width: 200px;
height: 6em;
}
.tag-generator-panel .control-box input[type="number"],
.tag-generator-panel .control-box input[type="date"] {
width: 88px;
}
.tag-generator-panel .control-box table caption {
text-align: left;
font-size: 110%;
font-weight: bold;
color: #777;
margin: 10px 0 5px;
}
.tag-generator-panel .control-box table.form-table td label {
line-height: 1.1em;
}
.tag-generator-panel .control-box table.form-table td label .description {
line-height: 1.4em;
}
.tag-generator-panel .insert-box {
position: absolute;
left: -15px;
right: -15px;
bottom: -15px;
width: 100%;
height: 84px;
margin: 0;
padding: 8px 16px;
background-color: #fcfcfc;
border-top: 1px solid #dfdfdf;
overflow: auto;
}
.tag-generator-panel .insert-box input.tag {
width: 480px;
float: left;
background-color: transparent;
box-shadow: none;
}
.tag-generator-panel .insert-box .submitbox {
padding: 2px 4px;
}
.tag-generator-panel .insert-box .submitbox input[type="button"] {
float: right;
}
.tag-generator-panel .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;
}
/*
* List Table
*/
.fixed .column-title {
width: 38%;
}
.fixed .column-shortcode {
width: 38%;
}
/*
* Welcome Panel
*/
.welcome-panel .welcome-panel-column,
.welcome-panel .welcome-panel-column:first-child {
width: 48%;
padding: 0 2% 0 0;
margin: 0 0 1em 0;
}
@media screen and (max-width: 870px) {
.welcome-panel .welcome-panel-column,
.welcome-panel .welcome-panel-column:first-child {
display: block;
float: none;
width: 100%;
}
}
.welcome-panel h3 {
font-size: 16px;
font-weight: 600;
line-height: 2.1em;
margin: 1em 0 1.2em;
}
.welcome-panel h3 .dashicons {
position: relative;
top: -2px;
display: inline-block;
width: 60px;
color: #575757;
font-size: 40px;
}
.welcome-panel p a {
font-weight: bold;
}
.welcome-panel-close {
z-index: 2;
}
/*
* 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;
}
.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: 2px 0 5px;
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;
}

View File

@ -0,0 +1,296 @@
<?php
// don't load directly
if ( ! defined( 'ABSPATH' ) ) {
die( '-1' );
}
function wpcf7_admin_save_button( $post_id ) {
static $button = '';
if ( ! empty( $button ) ) {
echo $button;
return;
}
$nonce = wp_create_nonce( 'wpcf7-save-contact-form_' . $post_id );
$onclick = sprintf(
"this.form._wpnonce.value = '%s';"
. " this.form.action.value = 'save';"
. " return true;",
$nonce );
$button = sprintf(
'<input type="submit" class="button-primary" name="wpcf7-save" value="%1$s" onclick="%2$s" />',
esc_attr( __( 'Save', 'contact-form-7' ) ),
$onclick );
echo $button;
}
?><div class="wrap" id="wpcf7-contact-form-editor">
<h1 class="wp-heading-inline"><?php
if ( $post->initial() ) {
echo esc_html( __( 'Add New Contact Form', 'contact-form-7' ) );
} else {
echo esc_html( __( 'Edit Contact Form', 'contact-form-7' ) );
}
?></h1>
<?php
if ( ! $post->initial()
and current_user_can( 'wpcf7_edit_contact_forms' ) ) {
echo wpcf7_link(
menu_page_url( 'wpcf7-new', false ),
__( 'Add New', 'contact-form-7' ),
array( 'class' => 'page-title-action' )
);
}
?>
<hr class="wp-header-end">
<?php
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
);
?>
<?php
if ( $post ) :
if ( current_user_can( 'wpcf7_edit_contact_form', $post_id ) ) {
$disabled = '';
} else {
$disabled = ' disabled="disabled"';
}
?>
<form method="post" action="<?php echo esc_url( add_query_arg( array( 'post' => $post_id ), menu_page_url( 'wpcf7', false ) ) ); ?>" id="wpcf7-admin-form-element"<?php do_action( 'wpcf7_post_edit_form_tag' ); ?>>
<?php
if ( current_user_can( 'wpcf7_edit_contact_form', $post_id ) ) {
wp_nonce_field( 'wpcf7-save-contact-form_' . $post_id );
}
?>
<input type="hidden" id="post_ID" name="post_ID" value="<?php echo (int) $post_id; ?>" />
<input type="hidden" id="wpcf7-locale" name="wpcf7-locale" value="<?php echo esc_attr( $post->locale() ); ?>" />
<input type="hidden" id="hiddenaction" name="action" value="save" />
<input type="hidden" id="active-tab" name="active-tab" value="<?php echo isset( $_GET['active-tab'] ) ? (int) $_GET['active-tab'] : '0'; ?>" />
<div id="poststuff">
<div id="post-body" class="metabox-holder columns-2">
<div id="post-body-content">
<div id="titlediv">
<div id="titlewrap">
<label class="screen-reader-text" id="title-prompt-text" for="title"><?php echo esc_html( __( 'Enter title here', 'contact-form-7' ) ); ?></label>
<?php
$posttitle_atts = array(
'type' => 'text',
'name' => 'post_title',
'size' => 30,
'value' => $post->initial() ? '' : $post->title(),
'id' => 'title',
'spellcheck' => 'true',
'autocomplete' => 'off',
'disabled' =>
current_user_can( 'wpcf7_edit_contact_form', $post_id ) ? '' : 'disabled',
);
echo sprintf( '<input %s />', wpcf7_format_atts( $posttitle_atts ) );
?>
</div><!-- #titlewrap -->
<div class="inside">
<?php
if ( ! $post->initial() ) :
?>
<p class="description">
<label for="wpcf7-shortcode"><?php echo esc_html( __( "Copy this shortcode and paste it into your post, page, or text widget content:", 'contact-form-7' ) ); ?></label>
<span class="shortcode wp-ui-highlight"><input type="text" id="wpcf7-shortcode" onfocus="this.select();" readonly="readonly" class="large-text code" value="<?php echo esc_attr( $post->shortcode() ); ?>" /></span>
</p>
<?php
if ( $old_shortcode = $post->shortcode( array( 'use_old_format' => true ) ) ) :
?>
<p class="description">
<label for="wpcf7-shortcode-old"><?php echo esc_html( __( "You can also use this old-style shortcode:", 'contact-form-7' ) ); ?></label>
<span class="shortcode old"><input type="text" id="wpcf7-shortcode-old" onfocus="this.select();" readonly="readonly" class="large-text code" value="<?php echo esc_attr( $old_shortcode ); ?>" /></span>
</p>
<?php
endif;
endif;
?>
</div>
</div><!-- #titlediv -->
</div><!-- #post-body-content -->
<div id="postbox-container-1" class="postbox-container">
<?php if ( current_user_can( 'wpcf7_edit_contact_form', $post_id ) ) : ?>
<div id="submitdiv" class="postbox">
<h3><?php echo esc_html( __( 'Status', 'contact-form-7' ) ); ?></h3>
<div class="inside">
<div class="submitbox" id="submitpost">
<div id="minor-publishing-actions">
<div class="hidden">
<input type="submit" class="button-primary" name="wpcf7-save" value="<?php echo esc_attr( __( 'Save', 'contact-form-7' ) ); ?>" />
</div>
<?php
if ( ! $post->initial() ) :
$copy_nonce = wp_create_nonce( 'wpcf7-copy-contact-form_' . $post_id );
?>
<input type="submit" name="wpcf7-copy" class="copy button" value="<?php echo esc_attr( __( 'Duplicate', 'contact-form-7' ) ); ?>" <?php echo "onclick=\"this.form._wpnonce.value = '$copy_nonce'; this.form.action.value = 'copy'; return true;\""; ?> />
<?php endif; ?>
</div><!-- #minor-publishing-actions -->
<div id="misc-publishing-actions">
<?php do_action( 'wpcf7_admin_misc_pub_section', $post_id ); ?>
</div><!-- #misc-publishing-actions -->
<div id="major-publishing-actions">
<?php
if ( ! $post->initial() ) :
$delete_nonce = wp_create_nonce( 'wpcf7-delete-contact-form_' . $post_id );
?>
<div id="delete-action">
<input type="submit" name="wpcf7-delete" class="delete submitdelete" value="<?php echo esc_attr( __( 'Delete', 'contact-form-7' ) ); ?>" <?php echo "onclick=\"if (confirm('" . esc_js( __( "You are about to delete this contact form.\n 'Cancel' to stop, 'OK' to delete.", 'contact-form-7' ) ) . "')) {this.form._wpnonce.value = '$delete_nonce'; this.form.action.value = 'delete'; return true;} return false;\""; ?> />
</div><!-- #delete-action -->
<?php endif; ?>
<div id="publishing-action">
<span class="spinner"></span>
<?php wpcf7_admin_save_button( $post_id ); ?>
</div>
<div class="clear"></div>
</div><!-- #major-publishing-actions -->
</div><!-- #submitpost -->
</div>
</div><!-- #submitdiv -->
<?php endif; ?>
<div id="informationdiv" class="postbox">
<h3><?php echo esc_html( __( "Do you need help?", 'contact-form-7' ) ); ?></h3>
<div class="inside">
<p><?php echo esc_html( __( "Here are some available options to help solve your problems.", 'contact-form-7' ) ); ?></p>
<ol>
<li><?php echo sprintf(
/* translators: 1: FAQ, 2: Docs ("FAQ & Docs") */
__( '%1$s &#38; %2$s', 'contact-form-7' ),
wpcf7_link(
__( 'https://contactform7.com/faq/', 'contact-form-7' ),
__( 'FAQ', 'contact-form-7' )
),
wpcf7_link(
__( 'https://contactform7.com/docs/', 'contact-form-7' ),
__( 'Docs', 'contact-form-7' )
)
); ?></li>
<li><?php echo wpcf7_link(
__( 'https://wordpress.org/support/plugin/contact-form-7/', 'contact-form-7' ),
__( 'Support Forums', 'contact-form-7' )
); ?></li>
<li><?php echo wpcf7_link(
__( 'https://contactform7.com/custom-development/', 'contact-form-7' ),
__( 'Professional Services', 'contact-form-7' )
); ?></li>
</ol>
</div>
</div><!-- #informationdiv -->
</div><!-- #postbox-container-1 -->
<div id="postbox-container-2" class="postbox-container">
<div id="contact-form-editor">
<div class="keyboard-interaction"><?php
echo sprintf(
/* translators: 1: ◀ ▶ dashicon, 2: screen reader text for the dashicon */
esc_html( __( '%1$s %2$s keys switch panels', 'contact-form-7' ) ),
'<span class="dashicons dashicons-leftright" aria-hidden="true"></span>',
sprintf(
'<span class="screen-reader-text">%s</span>',
/* translators: screen reader text */
esc_html( __( '(left and right arrow)', 'contact-form-7' ) )
)
);
?></div>
<?php
$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 = trim( $post->prop( '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
/* translators: %d: number of additional settings */
? sprintf(
__( '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();
?>
</div><!-- #contact-form-editor -->
<?php if ( current_user_can( 'wpcf7_edit_contact_form', $post_id ) ) : ?>
<p class="submit"><?php wpcf7_admin_save_button( $post_id ); ?></p>
<?php endif; ?>
</div><!-- #postbox-container-2 -->
</div><!-- #post-body -->
<br class="clear" />
</div><!-- #poststuff -->
</form>
<?php endif; ?>
</div><!-- .wrap -->
<?php
$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() {
if ( isset( $_REQUEST['action'] ) and -1 != $_REQUEST['action'] ) {
return $_REQUEST['action'];
}
if ( isset( $_REQUEST['action2'] ) and -1 != $_REQUEST['action2'] ) {
return $_REQUEST['action2'];
}
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,253 @@
<?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( 'cfseven_contact_forms_per_page' );
$args = array(
'posts_per_page' => $per_page,
'orderby' => 'title',
'order' => 'ASC',
'offset' => ( $this->get_pagenum() - 1 ) * $per_page,
);
if ( ! empty( $_REQUEST['s'] ) ) {
$args['s'] = $_REQUEST['s'];
}
if ( ! empty( $_REQUEST['orderby'] ) ) {
if ( 'title' == $_REQUEST['orderby'] ) {
$args['orderby'] = 'title';
} elseif ( 'author' == $_REQUEST['orderby'] ) {
$args['orderby'] = 'author';
} elseif ( 'date' == $_REQUEST['orderby'] ) {
$args['orderby'] = 'date';
}
}
if ( ! empty( $_REQUEST['order'] ) ) {
if ( 'asc' == strtolower( $_REQUEST['order'] ) ) {
$args['order'] = 'ASC';
} elseif ( 'desc' == strtolower( $_REQUEST['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 ),
/* translators: %s: title of contact form */
esc_attr( sprintf( __( '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" . '<span class="shortcode"><input type="text"'
. ' onfocus="this.select();" readonly="readonly"'
. ' value="' . esc_attr( $shortcode ) . '"'
. ' class="large-text code" /></span>';
}
return trim( $output );
}
public function column_date( $item ) {
$post = get_post( $item->id() );
if ( ! $post ) {
return;
}
$t_time = mysql2date( __( 'Y/m/d g:i:s A', 'contact-form-7' ),
$post->post_date, true );
$m_time = $post->post_date;
$time = mysql2date( 'G', $post->post_date )
- get_option( 'gmt_offset' ) * 3600;
$time_diff = time() - $time;
if ( $time_diff > 0 and $time_diff < 24*60*60 ) {
$h_time = sprintf(
/* translators: %s: time since the creation of the contact form */
__( '%s ago', 'contact-form-7' ),
human_time_diff( $time )
);
} else {
$h_time = mysql2date( __( 'Y/m/d', 'contact-form-7' ), $m_time );
}
return sprintf( '<abbr title="%2$s">%1$s</abbr>',
esc_html( $h_time ),
esc_attr( $t_time )
);
}
}

View File

@ -0,0 +1,135 @@
<?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 = '5.0.4';
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;
}
$link = wpcf7_link(
add_query_arg(
array( 'action' => 'validate' ),
menu_page_url( 'wpcf7', false )
),
__( 'Validate Contact Form 7 Configuration', 'contact-form-7' )
);
$message = __( "Misconfiguration leads to mail delivery failure or other troubles. Validate your contact forms now.", 'contact-form-7' );
echo sprintf(
'<div class="notice notice-warning"><p>%1$s &raquo; %2$s</p></div>',
esc_html( $message ),
$link
);
}
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' != $_SERVER['REQUEST_METHOD'] ) {
return;
}
check_admin_referer( 'wpcf7-bulk-validate' );
if ( ! current_user_can( 'wpcf7_edit_contact_forms' ) ) {
wp_die( __( "You are not allowed to validate configuration.", 'contact-form-7' ) );
}
$contact_forms = WPCF7_ContactForm::find();
$result = array(
'timestamp' => current_time( 'timestamp' ),
'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 ) );
?>
<div class="wrap">
<h1><?php echo esc_html( __( 'Validate Configuration', 'contact-form-7' ) ); ?></h1>
<form method="post" action="">
<input type="hidden" name="action" value="validate" />
<?php wp_nonce_field( 'wpcf7-bulk-validate' ); ?>
<p><input type="submit" class="button" value="<?php echo esc_attr( $submit_text ); ?>" /></p>
</form>
<?php
echo wpcf7_link(
__( 'https://contactform7.com/configuration-validator-faq/', 'contact-form-7' ),
__( 'FAQ about Configuration Validator', 'contact-form-7' )
);
?>
</div>
<?php
}

View File

@ -0,0 +1,258 @@
<?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( $id, $title, $callback ) {
if ( wpcf7_is_name( $id ) ) {
$this->panels[$id] = array(
'title' => $title,
'callback' => $callback,
);
}
}
public function display() {
if ( empty( $this->panels ) ) {
return;
}
echo '<ul id="contact-form-editor-tabs">';
foreach ( $this->panels as $id => $panel ) {
echo sprintf( '<li id="%1$s-tab"><a href="#%1$s">%2$s</a></li>',
esc_attr( $id ), esc_html( $panel['title'] ) );
}
echo '</ul>';
foreach ( $this->panels as $id => $panel ) {
echo sprintf( '<div class="contact-form-editor-panel" id="%1$s">',
esc_attr( $id ) );
if ( is_callable( $panel['callback'] ) ) {
$this->notice( $id, $panel );
call_user_func( $panel['callback'], $this->contact_form );
}
echo '</div>';
}
}
public function notice( $id, $panel ) {
echo '<div class="config-error"></div>';
}
}
function wpcf7_editor_panel_form( $post ) {
$desc_link = wpcf7_link(
__( 'https://contactform7.com/editing-form-template/', 'contact-form-7' ),
__( 'Editing Form Template', 'contact-form-7' ) );
$description = __( "You can edit the form template here. For details, see %s.", 'contact-form-7' );
$description = sprintf( esc_html( $description ), $desc_link );
?>
<h2><?php echo esc_html( __( 'Form', 'contact-form-7' ) ); ?></h2>
<fieldset>
<legend><?php echo $description; ?></legend>
<?php
$tag_generator = WPCF7_TagGenerator::get_instance();
$tag_generator->print_buttons();
?>
<textarea id="wpcf7-form" name="wpcf7-form" cols="100" rows="24" class="large-text code" data-config-field="form.body"><?php echo esc_textarea( $post->prop( 'form' ) ); ?></textarea>
</fieldset>
<?php
}
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, $args = '' ) {
$args = wp_parse_args( $args, array(
'id' => 'wpcf7-mail',
'name' => 'mail',
'title' => __( 'Mail', 'contact-form-7' ),
'use' => null,
) );
$id = esc_attr( $args['id'] );
$mail = wp_parse_args( $post->prop( $args['name'] ), array(
'active' => false,
'recipient' => '',
'sender' => '',
'subject' => '',
'body' => '',
'additional_headers' => '',
'attachments' => '',
'use_html' => false,
'exclude_blank' => false,
) );
?>
<div class="contact-form-editor-box-mail" id="<?php echo $id; ?>">
<h2><?php echo esc_html( $args['title'] ); ?></h2>
<?php
if ( ! empty( $args['use'] ) ) :
?>
<label for="<?php echo $id; ?>-active"><input type="checkbox" id="<?php echo $id; ?>-active" name="<?php echo $id; ?>[active]" class="toggle-form-table" value="1"<?php echo ( $mail['active'] ) ? ' checked="checked"' : ''; ?> /> <?php echo esc_html( $args['use'] ); ?></label>
<p class="description"><?php echo esc_html( __( "Mail (2) is an additional mail template often used as an autoresponder.", 'contact-form-7' ) ); ?></p>
<?php
endif;
?>
<fieldset>
<legend>
<?php
$desc_link = wpcf7_link(
__( 'https://contactform7.com/setting-up-mail/', 'contact-form-7' ),
__( 'Setting Up Mail', 'contact-form-7' ) );
$description = __( "You can edit the mail template here. For details, see %s.", 'contact-form-7' );
$description = sprintf( esc_html( $description ), $desc_link );
echo $description;
echo '<br />';
echo esc_html( __( "In the following fields, you can use these mail-tags:",
'contact-form-7' ) );
echo '<br />';
$post->suggest_mail_tags( $args['name'] );
?>
</legend>
<table class="form-table">
<tbody>
<tr>
<th scope="row">
<label for="<?php echo $id; ?>-recipient"><?php echo esc_html( __( 'To', 'contact-form-7' ) ); ?></label>
</th>
<td>
<input type="text" id="<?php echo $id; ?>-recipient" name="<?php echo $id; ?>[recipient]" class="large-text code" size="70" value="<?php echo esc_attr( $mail['recipient'] ); ?>" data-config-field="<?php echo sprintf( '%s.recipient', esc_attr( $args['name'] ) ); ?>" />
</td>
</tr>
<tr>
<th scope="row">
<label for="<?php echo $id; ?>-sender"><?php echo esc_html( __( 'From', 'contact-form-7' ) ); ?></label>
</th>
<td>
<input type="text" id="<?php echo $id; ?>-sender" name="<?php echo $id; ?>[sender]" class="large-text code" size="70" value="<?php echo esc_attr( $mail['sender'] ); ?>" data-config-field="<?php echo sprintf( '%s.sender', esc_attr( $args['name'] ) ); ?>" />
</td>
</tr>
<tr>
<th scope="row">
<label for="<?php echo $id; ?>-subject"><?php echo esc_html( __( 'Subject', 'contact-form-7' ) ); ?></label>
</th>
<td>
<input type="text" id="<?php echo $id; ?>-subject" name="<?php echo $id; ?>[subject]" class="large-text code" size="70" value="<?php echo esc_attr( $mail['subject'] ); ?>" data-config-field="<?php echo sprintf( '%s.subject', esc_attr( $args['name'] ) ); ?>" />
</td>
</tr>
<tr>
<th scope="row">
<label for="<?php echo $id; ?>-additional-headers"><?php echo esc_html( __( 'Additional Headers', 'contact-form-7' ) ); ?></label>
</th>
<td>
<textarea id="<?php echo $id; ?>-additional-headers" name="<?php echo $id; ?>[additional_headers]" cols="100" rows="4" class="large-text code" data-config-field="<?php echo sprintf( '%s.additional_headers', esc_attr( $args['name'] ) ); ?>"><?php echo esc_textarea( $mail['additional_headers'] ); ?></textarea>
</td>
</tr>
<tr>
<th scope="row">
<label for="<?php echo $id; ?>-body"><?php echo esc_html( __( 'Message Body', 'contact-form-7' ) ); ?></label>
</th>
<td>
<textarea id="<?php echo $id; ?>-body" name="<?php echo $id; ?>[body]" cols="100" rows="18" class="large-text code" data-config-field="<?php echo sprintf( '%s.body', esc_attr( $args['name'] ) ); ?>"><?php echo esc_textarea( $mail['body'] ); ?></textarea>
<p><label for="<?php echo $id; ?>-exclude-blank"><input type="checkbox" id="<?php echo $id; ?>-exclude-blank" name="<?php echo $id; ?>[exclude_blank]" value="1"<?php echo ( ! empty( $mail['exclude_blank'] ) ) ? ' checked="checked"' : ''; ?> /> <?php echo esc_html( __( 'Exclude lines with blank mail-tags from output', 'contact-form-7' ) ); ?></label></p>
<p><label for="<?php echo $id; ?>-use-html"><input type="checkbox" id="<?php echo $id; ?>-use-html" name="<?php echo $id; ?>[use_html]" value="1"<?php echo ( $mail['use_html'] ) ? ' checked="checked"' : ''; ?> /> <?php echo esc_html( __( 'Use HTML content type', 'contact-form-7' ) ); ?></label></p>
</td>
</tr>
<tr>
<th scope="row">
<label for="<?php echo $id; ?>-attachments"><?php echo esc_html( __( 'File Attachments', 'contact-form-7' ) ); ?></label>
</th>
<td>
<textarea id="<?php echo $id; ?>-attachments" name="<?php echo $id; ?>[attachments]" cols="100" rows="4" class="large-text code" data-config-field="<?php echo sprintf( '%s.attachments', esc_attr( $args['name'] ) ); ?>"><?php echo esc_textarea( $mail['attachments'] ); ?></textarea>
</td>
</tr>
</tbody>
</table>
</fieldset>
</div>
<?php
}
function wpcf7_editor_panel_messages( $post ) {
$desc_link = wpcf7_link(
__( 'https://contactform7.com/editing-messages/', 'contact-form-7' ),
__( 'Editing Messages', 'contact-form-7' ) );
$description = __( "You can edit messages used in various situations here. For details, see %s.", 'contact-form-7' );
$description = sprintf( esc_html( $description ), $desc_link );
$messages = wpcf7_messages();
if ( isset( $messages['captcha_not_match'] )
and ! wpcf7_use_really_simple_captcha() ) {
unset( $messages['captcha_not_match'] );
}
?>
<h2><?php echo esc_html( __( 'Messages', 'contact-form-7' ) ); ?></h2>
<fieldset>
<legend><?php echo $description; ?></legend>
<?php
foreach ( $messages as $key => $arr ) {
$field_id = sprintf( 'wpcf7-message-%s', strtr( $key, '_', '-' ) );
$field_name = sprintf( 'wpcf7-messages[%s]', $key );
?>
<p class="description">
<label for="<?php echo $field_id; ?>"><?php echo esc_html( $arr['description'] ); ?><br />
<input type="text" id="<?php echo $field_id; ?>" name="<?php echo $field_name; ?>" class="large-text" size="70" value="<?php echo esc_attr( $post->message( $key, false ) ); ?>" data-config-field="<?php echo sprintf( 'messages.%s', esc_attr( $key ) ); ?>" />
</label>
</p>
<?php
}
?>
</fieldset>
<?php
}
function wpcf7_editor_panel_additional_settings( $post ) {
$desc_link = wpcf7_link(
__( 'https://contactform7.com/additional-settings/', 'contact-form-7' ),
__( 'Additional Settings', 'contact-form-7' ) );
$description = __( "You can add customization code snippets here. For details, see %s.", 'contact-form-7' );
$description = sprintf( esc_html( $description ), $desc_link );
?>
<h2><?php echo esc_html( __( 'Additional Settings', 'contact-form-7' ) ); ?></h2>
<fieldset>
<legend><?php echo $description; ?></legend>
<textarea id="wpcf7-additional-settings" name="wpcf7-additional-settings" cols="100" rows="8" class="large-text" data-config-field="additional_settings.body"><?php echo esc_textarea( $post->prop( 'additional_settings' ) ); ?></textarea>
</fieldset>
<?php
}

View File

@ -0,0 +1,98 @@
<?php
class WPCF7_Help_Tabs {
private $screen;
public function __construct( WP_Screen $screen ) {
$this->screen = $screen;
}
public function set_help_tabs( $type ) {
switch ( $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 don&#8217;t 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 don&#8217;t 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,80 @@
<?php
class WPCF7_TagGenerator {
private static $instance;
private $panels = array();
private function __construct() {}
public static function get_instance() {
if ( empty( self::$instance ) ) {
self::$instance = new self;
}
return self::$instance;
}
public function add( $id, $title, $callback, $options = array() ) {
$id = trim( $id );
if ( '' === $id
or ! wpcf7_is_name( $id ) ) {
return false;
}
$this->panels[$id] = array(
'title' => $title,
'content' => 'tag-generator-panel-' . $id,
'options' => $options,
'callback' => $callback,
);
return true;
}
public function print_buttons() {
echo '<span id="tag-generator-list">';
foreach ( (array) $this->panels as $panel ) {
echo sprintf(
'<a href="#TB_inline?width=900&height=500&inlineId=%1$s" class="thickbox button" title="%2$s">%3$s</a>',
esc_attr( $panel['content'] ),
/* translators: %s: title of form-tag like 'email' or 'checkboxes' */
esc_attr( sprintf(
__( 'Form-tag Generator: %s', 'contact-form-7' ),
$panel['title'] ) ),
esc_html( $panel['title'] )
);
}
echo '</span>';
}
public function print_panels( WPCF7_ContactForm $contact_form ) {
foreach ( (array) $this->panels as $id => $panel ) {
$callback = $panel['callback'];
$options = wp_parse_args( $panel['options'], array() );
$options = array_merge( $options, array(
'id' => $id,
'title' => $panel['title'],
'content' => $panel['content'],
) );
if ( is_callable( $callback ) ) {
echo sprintf( '<div id="%s" class="hidden">',
esc_attr( $options['content'] ) );
echo sprintf(
'<form action="" class="tag-generator-panel" data-id="%s">',
$options['id'] );
call_user_func( $callback, $contact_form, $options );
echo '</form></div>';
}
}
}
}

View File

@ -0,0 +1,78 @@
<?php
function wpcf7_welcome_panel() {
$classes = '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="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">
<div class="welcome-panel-column">
<h3><span class="dashicons dashicons-shield" aria-hidden="true"></span> <?php echo esc_html( __( "Getting spammed? You have protection.", 'contact-form-7' ) ); ?></h3>
<p><?php echo esc_html( __( "Spammers target everything; your contact forms aren&#8217;t an exception. Before you get spammed, protect your contact forms with the powerful anti-spam features Contact Form 7 provides.", 'contact-form-7' ) ); ?></p>
<p><?php /* translators: links labeled 1: 'Akismet', 2: 'reCAPTCHA', 3: 'comment blacklist' */ echo sprintf( esc_html( __( 'Contact Form 7 supports spam-filtering with %1$s. Intelligent %2$s blocks annoying spambots. Plus, using %3$s, you can block messages containing specified keywords or those sent from specified IP addresses.', 'contact-form-7' ) ), wpcf7_link( __( 'https://contactform7.com/spam-filtering-with-akismet/', 'contact-form-7' ), __( 'Akismet', 'contact-form-7' ) ), wpcf7_link( __( 'https://contactform7.com/recaptcha/', 'contact-form-7' ), __( 'reCAPTCHA', 'contact-form-7' ) ), wpcf7_link( __( 'https://contactform7.com/comment-blacklist/', 'contact-form-7' ), __( 'comment blacklist', 'contact-form-7' ) ) ); ?></p>
</div>
<?php if ( defined( 'FLAMINGO_VERSION' ) ) : ?>
<div class="welcome-panel-column">
<h3><span class="dashicons dashicons-megaphone" aria-hidden="true"></span> <?php echo esc_html( __( "Contact Form 7 needs your support.", 'contact-form-7' ) ); ?></h3>
<p><?php echo esc_html( __( "It is hard to continue development and support for this plugin without contributions from users like you.", 'contact-form-7' ) ); ?></p>
<p><?php /* translators: %s: link labeled 'making a donation' */ echo sprintf( esc_html( __( 'If you enjoy using Contact Form 7 and find it useful, please consider %s.', 'contact-form-7' ) ), wpcf7_link( __( 'https://contactform7.com/donate/', 'contact-form-7' ), __( 'making a donation', 'contact-form-7' ) ) ); ?></p>
<p><?php echo esc_html( __( "Your donation will help encourage and support the plugin&#8217;s continued development and better user support.", 'contact-form-7' ) ); ?></p>
</div>
<?php else: ?>
<div class="welcome-panel-column">
<h3><span class="dashicons dashicons-editor-help" aria-hidden="true"></span> <?php echo esc_html( __( "Before you cry over spilt mail&#8230;", 'contact-form-7' ) ); ?></h3>
<p><?php echo esc_html( __( "Contact Form 7 doesn&#8217;t 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' ) ); ?></p>
<p><?php /* translators: %s: link labeled 'Flamingo' */ echo sprintf( esc_html( __( 'Install a message storage plugin before this happens to you. %s 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' ) ), wpcf7_link( __( 'https://contactform7.com/save-submitted-messages-with-flamingo/', 'contact-form-7' ), __( 'Flamingo', 'contact-form-7' ) ) ); ?></p>
</div>
<?php endif; ?>
</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' );
}
$vers = array_unique( $vers );
update_user_meta( get_current_user_id(),
'wpcf7_hide_welcome_panel_on', $vers );
wp_die( 1 );
}

View File

@ -0,0 +1,291 @@
( function( $ ) {
'use strict';
if ( typeof wpcf7 === 'undefined' || wpcf7 === null ) {
return;
}
$( function() {
var welcomePanel = $( '#welcome-panel' );
var updateWelcomePanel;
updateWelcomePanel = function( visible ) {
$.post( ajaxurl, {
action: 'wpcf7-update-welcome-panel',
visible: visible,
welcomepanelnonce: $( '#welcomepanelnonce' ).val()
} );
};
$( 'a.welcome-panel-close', welcomePanel ).click( function( event ) {
event.preventDefault();
welcomePanel.addClass( 'hidden' );
updateWelcomePanel( 0 );
} );
$( '#contact-form-editor' ).tabs( {
active: wpcf7.activeTab,
activate: function( event, ui ) {
$( '#active-tab' ).val( ui.newTab.index() );
}
} );
$( '#contact-form-editor-tabs' ).focusin( function( event ) {
$( '#contact-form-editor .keyboard-interaction' ).css(
'visibility', 'visible' );
} ).focusout( function( event ) {
$( '#contact-form-editor .keyboard-interaction' ).css(
'visibility', 'hidden' );
} );
wpcf7.toggleMail2( 'input:checkbox.toggle-form-table' );
$( 'input:checkbox.toggle-form-table' ).click( function( event ) {
wpcf7.toggleMail2( this );
} );
if ( '' === $( '#title' ).val() ) {
$( '#title' ).focus();
}
wpcf7.titleHint();
$( '.contact-form-editor-box-mail span.mailtag' ).click( function( event ) {
var range = document.createRange();
range.selectNodeContents( this );
window.getSelection().addRange( range );
} );
wpcf7.updateConfigErrors();
$( '[data-config-field]' ).change( function() {
var postId = $( '#post_ID' ).val();
if ( ! postId || -1 == postId ) {
return;
}
var data = [];
$( this ).closest( 'form' ).find( '[data-config-field]' ).each( function() {
data.push( {
'name': $( this ).attr( 'name' ).replace( /^wpcf7-/, '' ).replace( /-/g, '_' ),
'value': $( this ).val()
} );
} );
data.push( { 'name': 'context', 'value': 'dry-run' } );
$.ajax( {
method: 'POST',
url: wpcf7.apiSettings.getRoute( '/contact-forms/' + postId ),
beforeSend: function( xhr ) {
xhr.setRequestHeader( 'X-WP-Nonce', wpcf7.apiSettings.nonce );
},
data: data
} ).done( function( response ) {
wpcf7.configValidator.errors = response.config_errors;
wpcf7.updateConfigErrors();
} );
} );
$( window ).on( 'beforeunload', function( event ) {
var changed = false;
$( '#wpcf7-admin-form-element :input[type!="hidden"]' ).each( function() {
if ( $( this ).is( ':checkbox, :radio' ) ) {
if ( this.defaultChecked != $( this ).is( ':checked' ) ) {
changed = true;
}
} else if ( $( this ).is( 'select' ) ) {
$( this ).find( 'option' ).each( function() {
if ( this.defaultSelected != $( this ).is( ':selected' ) ) {
changed = true;
}
} );
} else {
if ( this.defaultValue != $( this ).val() ) {
changed = true;
}
}
} );
if ( changed ) {
event.returnValue = wpcf7.saveAlert;
return wpcf7.saveAlert;
}
} );
$( '#wpcf7-admin-form-element' ).submit( function() {
if ( 'copy' != this.action.value ) {
$( window ).off( 'beforeunload' );
}
if ( 'save' == this.action.value ) {
$( '#publishing-action .spinner' ).addClass( 'is-active' );
}
} );
} );
wpcf7.toggleMail2 = function( checkbox ) {
var $checkbox = $( checkbox );
var $fieldset = $( 'fieldset',
$checkbox.closest( '.contact-form-editor-box-mail' ) );
if ( $checkbox.is( ':checked' ) ) {
$fieldset.removeClass( 'hidden' );
} else {
$fieldset.addClass( 'hidden' );
}
};
wpcf7.updateConfigErrors = function() {
var errors = wpcf7.configValidator.errors;
var errorCount = { total: 0 };
$( '[data-config-field]' ).each( function() {
$( this ).removeAttr( 'aria-invalid' );
$( this ).next( 'ul.config-error' ).remove();
var section = $( this ).attr( 'data-config-field' );
if ( errors[ section ] ) {
var $list = $( '<ul></ul>' ).attr( {
'role': 'alert',
'class': 'config-error'
} );
$.each( errors[ section ], function( i, val ) {
var $li = $( '<li></li>' ).append(
wpcf7.iconInCircle( '!' )
).append(
$( '<span class="screen-reader-text"></span>' ).text( wpcf7.configValidator.iconAlt )
).append( ' ' );
if ( val.link ) {
$li.append(
$( '<a></a>' ).attr( 'href', val.link ).text( val.message )
);
} else {
$li.text( val.message );
}
$li.appendTo( $list );
var tab = section
.replace( /^mail_\d+\./, 'mail.' ).replace( /\..*$/, '' );
if ( ! errorCount[ tab ] ) {
errorCount[ tab ] = 0;
}
errorCount[ tab ] += 1;
errorCount.total += 1;
} );
$( this ).after( $list ).attr( { 'aria-invalid': 'true' } );
}
} );
$( '#contact-form-editor-tabs > li' ).each( function() {
var $item = $( this );
$item.find( '.icon-in-circle' ).remove();
var tab = $item.attr( 'id' ).replace( /-panel-tab$/, '' );
$.each( errors, function( key, val ) {
key = key.replace( /^mail_\d+\./, 'mail.' );
if ( key.replace( /\..*$/, '' ) == tab.replace( '-', '_' ) ) {
var $mark = wpcf7.iconInCircle( '!' );
$item.find( 'a.ui-tabs-anchor' ).first().append( $mark );
return false;
}
} );
var $tabPanelError = $( '#' + tab + '-panel > div.config-error:first' );
$tabPanelError.empty();
if ( errorCount[ tab.replace( '-', '_' ) ] ) {
$tabPanelError.append( wpcf7.iconInCircle( '!' ) );
if ( 1 < errorCount[ tab.replace( '-', '_' ) ] ) {
var manyErrorsInTab = wpcf7.configValidator.manyErrorsInTab
.replace( '%d', errorCount[ tab.replace( '-', '_' ) ] );
$tabPanelError.append( manyErrorsInTab );
} else {
$tabPanelError.append( wpcf7.configValidator.oneErrorInTab );
}
}
} );
$( '#misc-publishing-actions .misc-pub-section.config-error' ).remove();
if ( errorCount.total ) {
var $warning = $( '<div></div>' )
.addClass( 'misc-pub-section config-error' )
.append( wpcf7.iconInCircle( '!' ) );
if ( 1 < errorCount.total ) {
$warning.append(
wpcf7.configValidator.manyErrors.replace( '%d', errorCount.total )
);
} else {
$warning.append( wpcf7.configValidator.oneError );
}
$warning.append( '<br />' ).append(
$( '<a></a>' )
.attr( 'href', wpcf7.configValidator.docUrl )
.text( wpcf7.configValidator.howToCorrect )
);
$( '#misc-publishing-actions' ).append( $warning );
}
};
/**
* Copied from wptitlehint() in wp-admin/js/post.js
*/
wpcf7.titleHint = function() {
var $title = $( '#title' );
var $titleprompt = $( '#title-prompt-text' );
if ( '' === $title.val() ) {
$titleprompt.removeClass( 'screen-reader-text' );
}
$titleprompt.click( function() {
$( this ).addClass( 'screen-reader-text' );
$title.focus();
} );
$title.blur( function() {
if ( '' === $(this).val() ) {
$titleprompt.removeClass( 'screen-reader-text' );
}
} ).focus( function() {
$titleprompt.addClass( 'screen-reader-text' );
} ).keydown( function( e ) {
$titleprompt.addClass( 'screen-reader-text' );
$( this ).unbind( e );
} );
};
wpcf7.iconInCircle = function( icon ) {
var $span = $( '<span class="icon-in-circle" aria-hidden="true"></span>' );
return $span.text( icon );
};
wpcf7.apiSettings.getRoute = function( path ) {
var url = wpcf7.apiSettings.root;
url = url.replace(
wpcf7.apiSettings.namespace,
wpcf7.apiSettings.namespace + path );
return url;
};
} )( jQuery );

View File

@ -0,0 +1,249 @@
( function( $ ) {
'use strict';
if ( typeof wpcf7 === 'undefined' || wpcf7 === null ) {
return;
}
wpcf7.taggen = {};
$( function() {
$( 'form.tag-generator-panel' ).each( function() {
wpcf7.taggen.update( $( this ) );
} );
} );
$( 'form.tag-generator-panel' ).submit( function() {
return false;
} );
$( 'form.tag-generator-panel .control-box :input' ).change( function() {
var $form = $( this ).closest( 'form.tag-generator-panel' );
wpcf7.taggen.normalize( $( this ) );
wpcf7.taggen.update( $form );
} );
$( 'input.insert-tag' ).click( function() {
var $form = $( this ).closest( 'form.tag-generator-panel' );
var tag = $form.find( 'input.tag' ).val();
wpcf7.taggen.insert( tag );
tb_remove(); // close thickbox
return false;
} );
wpcf7.taggen.update = function( $form ) {
var id = $form.attr( 'data-id' );
var name = '';
var name_fields = $form.find( 'input[name="name"]' );
if ( name_fields.length ) {
name = name_fields.val();
if ( '' === name ) {
name = id + '-' + Math.floor( Math.random() * 1000 );
name_fields.val( name );
}
}
if ( $.isFunction( wpcf7.taggen.update[ id ] ) ) {
return wpcf7.taggen.update[ id ].call( this, $form );
}
$form.find( 'input.tag' ).each( function() {
var tag_type = $( this ).attr( 'name' );
if ( $form.find( ':input[name="tagtype"]' ).length ) {
tag_type = $form.find( ':input[name="tagtype"]' ).val();
}
if ( $form.find( ':input[name="required"]' ).is( ':checked' ) ) {
tag_type += '*';
}
var components = wpcf7.taggen.compose( tag_type, $form );
$( this ).val( components );
} );
$form.find( 'span.mail-tag' ).text( '[' + name + ']' );
$form.find( 'input.mail-tag' ).each( function() {
$( this ).val( '[' + name + ']' );
} );
};
wpcf7.taggen.update.captcha = function( $form ) {
var captchac = wpcf7.taggen.compose( 'captchac', $form );
var captchar = wpcf7.taggen.compose( 'captchar', $form );
$form.find( 'input.tag' ).val( captchac + ' ' + captchar );
};
wpcf7.taggen.compose = function( tagType, $form ) {
var name = $form.find( 'input[name="name"]' ).val();
var scope = $form.find( '.scope.' + tagType );
if ( ! scope.length ) {
scope = $form;
}
var options = [];
scope.find( 'input.option' ).not( ':checkbox,:radio' ).each( function( i ) {
var val = $( this ).val();
if ( ! val ) {
return;
}
if ( $( this ).hasClass( 'filetype' ) ) {
val = val.split( /[,|\s]+/ ).join( '|' );
}
if ( $( this ).hasClass( 'color' ) ) {
val = '#' + val;
}
if ( 'class' == $( this ).attr( 'name' ) ) {
$.each( val.split( ' ' ), function( i, n ) {
options.push( 'class:' + n );
} );
} else {
options.push( $( this ).attr( 'name' ) + ':' + val );
}
} );
scope.find( 'input:checkbox.option' ).each( function( i ) {
if ( $( this ).is( ':checked' ) ) {
options.push( $( this ).attr( 'name' ) );
}
} );
scope.find( 'input:radio.option' ).each( function( i ) {
if ( $( this ).is( ':checked' ) && ! $( this ).hasClass( 'default' ) ) {
options.push( $( this ).attr( 'name' ) + ':' + $( this ).val() );
}
} );
if ( 'radio' == tagType ) {
options.push( 'default:1' );
}
options = ( options.length > 0 ) ? options.join( ' ' ) : '';
var value = '';
if ( scope.find( ':input[name="values"]' ).val() ) {
$.each(
scope.find( ':input[name="values"]' ).val().split( "\n" ),
function( i, n ) {
value += ' "' + n.replace( /["]/g, '&quot;' ) + '"';
}
);
}
var components = [];
$.each( [ tagType, name, options, value ], function( i, v ) {
v = $.trim( v );
if ( '' != v ) {
components.push( v );
}
} );
components = $.trim( components.join( ' ' ) );
components = '[' + components + ']';
var content = scope.find( ':input[name="content"]' ).val();
content = $.trim( content );
if ( content ) {
components += ' ' + content + ' [/' + tagType + ']';
}
return components;
};
wpcf7.taggen.normalize = function( $input ) {
var val = $input.val();
if ( $input.is( 'input[name="name"]' ) ) {
val = val.replace( /[^0-9a-zA-Z:._-]/g, '' ).replace( /^[^a-zA-Z]+/, '' );
}
if ( $input.is( '.numeric' ) ) {
val = val.replace( /[^0-9.-]/g, '' );
}
if ( $input.is( '.idvalue' ) ) {
val = val.replace( /[^-0-9a-zA-Z_]/g, '' );
}
if ( $input.is( '.classvalue' ) ) {
val = $.map( val.split( ' ' ), function( n ) {
return n.replace( /[^-0-9a-zA-Z_]/g, '' );
} ).join( ' ' );
val = $.trim( val.replace( /\s+/g, ' ' ) );
}
if ( $input.is( '.color' ) ) {
val = val.replace( /[^0-9a-fA-F]/g, '' );
}
if ( $input.is( '.filesize' ) ) {
val = val.replace( /[^0-9kKmMbB]/g, '' );
}
if ( $input.is( '.filetype' ) ) {
val = val.replace( /[^0-9a-zA-Z.,|\s]/g, '' );
}
if ( $input.is( '.date' ) ) {
// 'yyyy-mm-dd' ISO 8601 format
if ( ! val.match( /^\d{4}-\d{2}-\d{2}$/ ) ) {
val = '';
}
}
if ( $input.is( ':input[name="values"]' ) ) {
val = $.trim( val );
}
$input.val( val );
if ( $input.is( ':checkbox.exclusive' ) ) {
wpcf7.taggen.exclusiveCheckbox( $input );
}
};
wpcf7.taggen.exclusiveCheckbox = function( $cb ) {
if ( $cb.is( ':checked' ) ) {
$cb.siblings( ':checkbox.exclusive' ).prop( 'checked', false );
}
};
wpcf7.taggen.insert = function( content ) {
$( 'textarea#wpcf7-form' ).each( function() {
this.focus();
if ( document.selection ) { // IE
var selection = document.selection.createRange();
selection.text = content;
} else if ( this.selectionEnd || 0 === this.selectionEnd ) {
var val = $( this ).val();
var end = this.selectionEnd;
$( this ).val( val.substring( 0, end ) +
content + val.substring( end, val.length ) );
this.selectionStart = end + content.length;
this.selectionEnd = end + content.length;
} else {
$( this ).val( $( this ).val() + content );
}
this.focus();
} );
};
} )( jQuery );

Binary file not shown.

After

Width:  |  Height:  |  Size: 847 B

View File

@ -0,0 +1,26 @@
<?php
add_filter( 'map_meta_cap', 'wpcf7_map_meta_cap', 10, 4 );
function wpcf7_map_meta_cap( $caps, $cap, $user_id, $args ) {
$meta_caps = array(
'wpcf7_edit_contact_form' => WPCF7_ADMIN_READ_WRITE_CAPABILITY,
'wpcf7_edit_contact_forms' => WPCF7_ADMIN_READ_WRITE_CAPABILITY,
'wpcf7_read_contact_form' => WPCF7_ADMIN_READ_CAPABILITY,
'wpcf7_read_contact_forms' => WPCF7_ADMIN_READ_CAPABILITY,
'wpcf7_delete_contact_form' => WPCF7_ADMIN_READ_WRITE_CAPABILITY,
'wpcf7_delete_contact_forms' => WPCF7_ADMIN_READ_WRITE_CAPABILITY,
'wpcf7_manage_integration' => 'manage_options',
'wpcf7_submit' => 'read',
);
$meta_caps = apply_filters( 'wpcf7_map_meta_cap', $meta_caps );
$caps = array_diff( $caps, array_keys( $meta_caps ) );
if ( isset( $meta_caps[$cap] ) ) {
$caps[] = $meta_caps[$cap];
}
return $caps;
}

View File

@ -0,0 +1,643 @@
<?php
class WPCF7_ConfigValidator {
const error = 100;
const error_maybe_empty = 101;
const error_invalid_mailbox_syntax = 102;
const error_email_not_in_site_domain = 103;
const error_html_in_message = 104;
const error_multiple_controls_in_label = 105;
const error_file_not_found = 106;
const error_unavailable_names = 107;
const error_invalid_mail_header = 108;
const error_deprecated_settings = 109;
const error_file_not_in_content_dir = 110;
public static function get_doc_link( $error_code = '' ) {
$url = __( 'https://contactform7.com/configuration-errors/',
'contact-form-7' );
if ( '' !== $error_code ) {
$error_code = strtr( $error_code, '_', '-' );
$url = sprintf( '%s/%s', untrailingslashit( $url ), $error_code );
}
return esc_url( $url );
}
private $contact_form;
private $errors = array();
public function __construct( WPCF7_ContactForm $contact_form ) {
$this->contact_form = $contact_form;
}
public function contact_form() {
return $this->contact_form;
}
public function is_valid() {
return ! $this->count_errors();
}
public function count_errors( $args = '' ) {
$args = wp_parse_args( $args, array(
'section' => '',
'code' => '',
) );
$count = 0;
foreach ( $this->errors as $key => $errors ) {
if ( preg_match( '/^mail_[0-9]+\.(.*)$/', $key, $matches ) ) {
$key = sprintf( 'mail.%s', $matches[1] );
}
if ( $args['section']
and $key != $args['section']
and preg_replace( '/\..*$/', '', $key, 1 ) != $args['section'] ) {
continue;
}
foreach ( $errors as $error ) {
if ( empty( $error ) ) {
continue;
}
if ( $args['code'] and $error['code'] != $args['code'] ) {
continue;
}
$count += 1;
}
}
return $count;
}
public function collect_error_messages() {
$error_messages = array();
foreach ( $this->errors as $section => $errors ) {
$error_messages[$section] = array();
foreach ( $errors as $error ) {
if ( empty( $error['args']['message'] ) ) {
$message = $this->get_default_message( $error['code'] );
} elseif ( empty( $error['args']['params'] ) ) {
$message = $error['args']['message'];
} else {
$message = $this->build_message(
$error['args']['message'],
$error['args']['params'] );
}
$link = '';
if ( ! empty( $error['args']['link'] ) ) {
$link = $error['args']['link'];
}
$error_messages[$section][] = array(
'message' => $message,
'link' => esc_url( $link ),
);
}
}
return $error_messages;
}
public function build_message( $message, $params = '' ) {
$params = wp_parse_args( $params, array() );
foreach ( $params as $key => $val ) {
if ( ! preg_match( '/^[0-9A-Za-z_]+$/', $key ) ) { // invalid key
continue;
}
$placeholder = '%' . $key . '%';
if ( false !== stripos( $message, $placeholder ) ) {
$message = str_ireplace( $placeholder, $val, $message );
}
}
return $message;
}
public function get_default_message( $code ) {
switch ( $code ) {
case self::error_maybe_empty:
return __( "There is a possible empty field.", 'contact-form-7' );
case self::error_invalid_mailbox_syntax:
return __( "Invalid mailbox syntax is used.", 'contact-form-7' );
case self::error_email_not_in_site_domain:
return __( "Sender email address does not belong to the site domain.", 'contact-form-7' );
case self::error_html_in_message:
return __( "HTML tags are used in a message.", 'contact-form-7' );
case self::error_multiple_controls_in_label:
return __( "Multiple form controls are in a single label element.", 'contact-form-7' );
case self::error_invalid_mail_header:
return __( "There are invalid mail header fields.", 'contact-form-7' );
case self::error_deprecated_settings:
return __( "Deprecated settings are used.", 'contact-form-7' );
default:
return '';
}
}
public function add_error( $section, $code, $args = '' ) {
$args = wp_parse_args( $args, array(
'message' => '',
'params' => array(),
) );
if ( ! isset( $this->errors[$section] ) ) {
$this->errors[$section] = array();
}
$this->errors[$section][] = array( 'code' => $code, 'args' => $args );
return true;
}
public function remove_error( $section, $code ) {
if ( empty( $this->errors[$section] ) ) {
return;
}
foreach ( (array) $this->errors[$section] as $key => $error ) {
if ( isset( $error['code'] )
and $error['code'] == $code ) {
unset( $this->errors[$section][$key] );
}
}
}
public function validate() {
$this->errors = array();
$this->validate_form();
$this->validate_mail( 'mail' );
$this->validate_mail( 'mail_2' );
$this->validate_messages();
$this->validate_additional_settings();
do_action( 'wpcf7_config_validator_validate', $this );
return $this->is_valid();
}
public function save() {
if ( $this->contact_form->initial() ) {
return;
}
delete_post_meta( $this->contact_form->id(), '_config_errors' );
if ( $this->errors ) {
update_post_meta( $this->contact_form->id(), '_config_errors',
$this->errors );
}
}
public function restore() {
$config_errors = get_post_meta(
$this->contact_form->id(), '_config_errors', true );
foreach ( (array) $config_errors as $section => $errors ) {
if ( empty( $errors ) ) {
continue;
}
if ( ! is_array( $errors ) ) { // for back-compat
$code = $errors;
$this->add_error( $section, $code );
} else {
foreach ( (array) $errors as $error ) {
if ( ! empty( $error['code'] ) ) {
$code = $error['code'];
$args = isset( $error['args'] ) ? $error['args'] : '';
$this->add_error( $section, $code, $args );
}
}
}
}
}
public function replace_mail_tags_with_minimum_input( $matches ) {
// allow [[foo]] syntax for escaping a tag
if ( $matches[1] == '[' && $matches[4] == ']' ) {
return substr( $matches[0], 1, -1 );
}
$tag = $matches[0];
$tagname = $matches[2];
$values = $matches[3];
$mail_tag = new WPCF7_MailTag( $tag, $tagname, $values );
$field_name = $mail_tag->field_name();
$example_email = 'example@example.com';
$example_text = 'example';
$example_blank = '';
$form_tags = $this->contact_form->scan_form_tags(
array( 'name' => $field_name ) );
if ( $form_tags ) {
$form_tag = new WPCF7_FormTag( $form_tags[0] );
$is_required = ( $form_tag->is_required() || 'radio' == $form_tag->type );
if ( ! $is_required ) {
return $example_blank;
}
if ( wpcf7_form_tag_supports( $form_tag->type, 'selectable-values' ) ) {
if ( $form_tag->pipes instanceof WPCF7_Pipes ) {
if ( $mail_tag->get_option( 'do_not_heat' ) ) {
$before_pipes = $form_tag->pipes->collect_befores();
$last_item = array_pop( $before_pipes );
} else {
$after_pipes = $form_tag->pipes->collect_afters();
$last_item = array_pop( $after_pipes );
}
} else {
$last_item = array_pop( $form_tag->values );
}
if ( $last_item and wpcf7_is_mailbox_list( $last_item ) ) {
return $example_email;
} else {
return $example_text;
}
}
if ( 'email' == $form_tag->basetype ) {
return $example_email;
} else {
return $example_text;
}
} else { // maybe special mail tag
// for back-compat
$field_name = preg_replace( '/^wpcf7\./', '_', $field_name );
if ( '_site_admin_email' == $field_name ) {
return get_bloginfo( 'admin_email', 'raw' );
} elseif ( '_user_agent' == $field_name ) {
return $example_text;
} elseif ( '_user_email' == $field_name ) {
return $this->contact_form->is_true( 'subscribers_only' )
? $example_email
: $example_blank;
} elseif ( '_user_' == substr( $field_name, 0, 6 ) ) {
return $this->contact_form->is_true( 'subscribers_only' )
? $example_text
: $example_blank;
} elseif ( '_' == substr( $field_name, 0, 1 ) ) {
return '_email' == substr( $field_name, -6 )
? $example_email
: $example_text;
}
}
return $tag;
}
public function validate_form() {
$section = 'form.body';
$form = $this->contact_form->prop( 'form' );
$this->detect_multiple_controls_in_label( $section, $form );
$this->detect_unavailable_names( $section, $form );
}
public function detect_multiple_controls_in_label( $section, $content ) {
$pattern = '%<label(?:[ \t\n]+.*?)?>(.+?)</label>%s';
if ( preg_match_all( $pattern, $content, $matches ) ) {
$form_tags_manager = WPCF7_FormTagsManager::get_instance();
foreach ( $matches[1] as $insidelabel ) {
$tags = $form_tags_manager->scan( $insidelabel );
$fields_count = 0;
foreach ( $tags as $tag ) {
$is_multiple_controls_container = wpcf7_form_tag_supports(
$tag->type, 'multiple-controls-container' );
$is_zero_controls_container = wpcf7_form_tag_supports(
$tag->type, 'zero-controls-container' );
if ( $is_multiple_controls_container ) {
$fields_count += count( $tag->values );
if ( $tag->has_option( 'free_text' ) ) {
$fields_count += 1;
}
} elseif ( $is_zero_controls_container ) {
$fields_count += 0;
} elseif ( ! empty( $tag->name ) ) {
$fields_count += 1;
}
if ( 1 < $fields_count ) {
return $this->add_error( $section,
self::error_multiple_controls_in_label, array(
'link' => self::get_doc_link( 'multiple_controls_in_label' ),
)
);
}
}
}
}
return false;
}
public function detect_unavailable_names( $section, $content ) {
$public_query_vars = array( 'm', 'p', 'posts', 'w', 'cat',
'withcomments', 'withoutcomments', 's', 'search', 'exact', 'sentence',
'calendar', 'page', 'paged', 'more', 'tb', 'pb', 'author', 'order',
'orderby', 'year', 'monthnum', 'day', 'hour', 'minute', 'second',
'name', 'category_name', 'tag', 'feed', 'author_name', 'static',
'pagename', 'page_id', 'error', 'attachment', 'attachment_id',
'subpost', 'subpost_id', 'preview', 'robots', 'taxonomy', 'term',
'cpage', 'post_type', 'embed' );
$form_tags_manager = WPCF7_FormTagsManager::get_instance();
$ng_named_tags = $form_tags_manager->filter( $content,
array( 'name' => $public_query_vars ) );
$ng_names = array();
foreach ( $ng_named_tags as $tag ) {
$ng_names[] = sprintf( '"%s"', $tag->name );
}
if ( $ng_names ) {
$ng_names = array_unique( $ng_names );
return $this->add_error( $section,
self::error_unavailable_names,
array(
'message' =>
/* translators: %names%: a list of form control names */
__( "Unavailable names (%names%) are used for form controls.", 'contact-form-7' ),
'params' => array( 'names' => implode( ', ', $ng_names ) ),
'link' => self::get_doc_link( 'unavailable_names' ),
)
);
}
return false;
}
public function validate_mail( $template = 'mail' ) {
$components = (array) $this->contact_form->prop( $template );
if ( ! $components ) {
return;
}
if ( 'mail' != $template
and empty( $components['active'] ) ) {
return;
}
$components = wp_parse_args( $components, array(
'subject' => '',
'sender' => '',
'recipient' => '',
'additional_headers' => '',
'body' => '',
'attachments' => '',
) );
$callback = array( $this, 'replace_mail_tags_with_minimum_input' );
$subject = $components['subject'];
$subject = new WPCF7_MailTaggedText( $subject,
array( 'callback' => $callback ) );
$subject = $subject->replace_tags();
$subject = wpcf7_strip_newline( $subject );
$this->detect_maybe_empty( sprintf( '%s.subject', $template ), $subject );
$sender = $components['sender'];
$sender = new WPCF7_MailTaggedText( $sender,
array( 'callback' => $callback ) );
$sender = $sender->replace_tags();
$sender = wpcf7_strip_newline( $sender );
if ( ! $this->detect_invalid_mailbox_syntax( sprintf( '%s.sender', $template ), $sender )
and ! wpcf7_is_email_in_site_domain( $sender ) ) {
$this->add_error( sprintf( '%s.sender', $template ),
self::error_email_not_in_site_domain, array(
'link' => self::get_doc_link( 'email_not_in_site_domain' ),
)
);
}
$recipient = $components['recipient'];
$recipient = new WPCF7_MailTaggedText( $recipient,
array( 'callback' => $callback ) );
$recipient = $recipient->replace_tags();
$recipient = wpcf7_strip_newline( $recipient );
$this->detect_invalid_mailbox_syntax(
sprintf( '%s.recipient', $template ), $recipient );
$additional_headers = $components['additional_headers'];
$additional_headers = new WPCF7_MailTaggedText( $additional_headers,
array( 'callback' => $callback ) );
$additional_headers = $additional_headers->replace_tags();
$additional_headers = explode( "\n", $additional_headers );
$mailbox_header_types = array( 'reply-to', 'cc', 'bcc' );
$invalid_mail_header_exists = false;
foreach ( $additional_headers as $header ) {
$header = trim( $header );
if ( '' === $header ) {
continue;
}
if ( ! preg_match( '/^([0-9A-Za-z-]+):(.*)$/', $header, $matches ) ) {
$invalid_mail_header_exists = true;
} else {
$header_name = $matches[1];
$header_value = trim( $matches[2] );
if ( in_array( strtolower( $header_name ), $mailbox_header_types ) ) {
$this->detect_invalid_mailbox_syntax(
sprintf( '%s.additional_headers', $template ),
$header_value, array(
'message' =>
__( "Invalid mailbox syntax is used in the %name% field.", 'contact-form-7' ),
'params' => array( 'name' => $header_name ) ) );
} elseif ( empty( $header_value ) ) {
$invalid_mail_header_exists = true;
}
}
}
if ( $invalid_mail_header_exists ) {
$this->add_error( sprintf( '%s.additional_headers', $template ),
self::error_invalid_mail_header, array(
'link' => self::get_doc_link( 'invalid_mail_header' ),
)
);
}
$body = $components['body'];
$body = new WPCF7_MailTaggedText( $body,
array( 'callback' => $callback ) );
$body = $body->replace_tags();
$this->detect_maybe_empty( sprintf( '%s.body', $template ), $body );
if ( '' !== $components['attachments'] ) {
$has_file_not_found = false;
$has_file_not_in_content_dir = false;
foreach ( explode( "\n", $components['attachments'] ) as $line ) {
$line = trim( $line );
if ( '' === $line
or '[' == substr( $line, 0, 1 ) ) {
continue;
}
$has_file_not_found = $this->detect_file_not_found(
sprintf( '%s.attachments', $template ), $line
);
if ( ! $has_file_not_found
and ! $has_file_not_in_content_dir ) {
$has_file_not_in_content_dir = $this->detect_file_not_in_content_dir(
sprintf( '%s.attachments', $template ), $line
);
}
}
}
}
public function detect_invalid_mailbox_syntax( $section, $content, $args = '' ) {
$args = wp_parse_args( $args, array(
'link' => self::get_doc_link( 'invalid_mailbox_syntax' ),
'message' => '',
'params' => array(),
) );
if ( ! wpcf7_is_mailbox_list( $content ) ) {
return $this->add_error( $section,
self::error_invalid_mailbox_syntax, $args );
}
return false;
}
public function detect_maybe_empty( $section, $content ) {
if ( '' === $content ) {
return $this->add_error( $section,
self::error_maybe_empty, array(
'link' => self::get_doc_link( 'maybe_empty' ),
)
);
}
return false;
}
public function detect_file_not_found( $section, $content ) {
$path = path_join( WP_CONTENT_DIR, $content );
if ( ! is_readable( $path )
or ! is_file( $path ) ) {
return $this->add_error( $section,
self::error_file_not_found,
array(
'message' =>
__( "Attachment file does not exist at %path%.", 'contact-form-7' ),
'params' => array( 'path' => $content ),
'link' => self::get_doc_link( 'file_not_found' ),
)
);
}
return false;
}
public function detect_file_not_in_content_dir( $section, $content ) {
$path = path_join( WP_CONTENT_DIR, $content );
if ( ! wpcf7_is_file_path_in_content_dir( $path ) ) {
return $this->add_error( $section,
self::error_file_not_in_content_dir,
array(
'message' =>
__( "It is not allowed to use files outside the wp-content directory.", 'contact-form-7' ),
'link' => self::get_doc_link( 'file_not_in_content_dir' ),
)
);
}
return false;
}
public function validate_messages() {
$messages = (array) $this->contact_form->prop( 'messages' );
if ( ! $messages ) {
return;
}
if ( isset( $messages['captcha_not_match'] )
and ! wpcf7_use_really_simple_captcha() ) {
unset( $messages['captcha_not_match'] );
}
foreach ( $messages as $key => $message ) {
$section = sprintf( 'messages.%s', $key );
$this->detect_html_in_message( $section, $message );
}
}
public function detect_html_in_message( $section, $content ) {
$stripped = wp_strip_all_tags( $content );
if ( $stripped != $content ) {
return $this->add_error( $section,
self::error_html_in_message,
array(
'link' => self::get_doc_link( 'html_in_message' ),
)
);
}
return false;
}
public function validate_additional_settings() {
$deprecated_settings_used =
$this->contact_form->additional_setting( 'on_sent_ok' ) ||
$this->contact_form->additional_setting( 'on_submit' );
if ( $deprecated_settings_used ) {
return $this->add_error( 'additional_settings.body',
self::error_deprecated_settings,
array(
'link' => self::get_doc_link( 'deprecated_settings' ),
)
);
}
}
}

View File

@ -0,0 +1,268 @@
<?php
function wpcf7_contact_form( $id ) {
return WPCF7_ContactForm::get_instance( $id );
}
function wpcf7_get_contact_form_by_old_id( $old_id ) {
global $wpdb;
$q = "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_old_cf7_unit_id'"
. $wpdb->prepare( " AND meta_value = %d", $old_id );
if ( $new_id = $wpdb->get_var( $q ) ) {
return wpcf7_contact_form( $new_id );
}
}
function wpcf7_get_contact_form_by_title( $title ) {
$page = get_page_by_title( $title, OBJECT, WPCF7_ContactForm::post_type );
if ( $page ) {
return wpcf7_contact_form( $page->ID );
}
return null;
}
function wpcf7_get_current_contact_form() {
if ( $current = WPCF7_ContactForm::get_current() ) {
return $current;
}
}
function wpcf7_is_posted() {
if ( ! $contact_form = wpcf7_get_current_contact_form() ) {
return false;
}
return $contact_form->is_posted();
}
function wpcf7_get_hangover( $name, $default = null ) {
if ( ! wpcf7_is_posted() ) {
return $default;
}
$submission = WPCF7_Submission::get_instance();
if ( ! $submission
or $submission->is( 'mail_sent' ) ) {
return $default;
}
return isset( $_POST[$name] ) ? wp_unslash( $_POST[$name] ) : $default;
}
function wpcf7_get_validation_error( $name ) {
if ( ! $contact_form = wpcf7_get_current_contact_form() ) {
return '';
}
return $contact_form->validation_error( $name );
}
function wpcf7_get_message( $status ) {
if ( ! $contact_form = wpcf7_get_current_contact_form() ) {
return '';
}
return $contact_form->message( $status );
}
function wpcf7_form_controls_class( $type, $default = '' ) {
$type = trim( $type );
$default = array_filter( explode( ' ', $default ) );
$classes = array_merge( array( 'wpcf7-form-control' ), $default );
$typebase = rtrim( $type, '*' );
$required = ( '*' == substr( $type, -1 ) );
$classes[] = 'wpcf7-' . $typebase;
if ( $required ) {
$classes[] = 'wpcf7-validates-as-required';
}
$classes = array_unique( $classes );
return implode( ' ', $classes );
}
function wpcf7_contact_form_tag_func( $atts, $content = null, $code = '' ) {
if ( is_feed() ) {
return '[contact-form-7]';
}
if ( 'contact-form-7' == $code ) {
$atts = shortcode_atts(
array(
'id' => 0,
'title' => '',
'html_id' => '',
'html_name' => '',
'html_class' => '',
'output' => 'form',
),
$atts, 'wpcf7'
);
$id = (int) $atts['id'];
$title = trim( $atts['title'] );
if ( ! $contact_form = wpcf7_contact_form( $id ) ) {
$contact_form = wpcf7_get_contact_form_by_title( $title );
}
} else {
if ( is_string( $atts ) ) {
$atts = explode( ' ', $atts, 2 );
}
$id = (int) array_shift( $atts );
$contact_form = wpcf7_get_contact_form_by_old_id( $id );
}
if ( ! $contact_form ) {
return '[contact-form-7 404 "Not Found"]';
}
return $contact_form->form_html( $atts );
}
function wpcf7_save_contact_form( $args = '', $context = 'save' ) {
$args = wp_parse_args( $args, array(
'id' => -1,
'title' => null,
'locale' => null,
'form' => null,
'mail' => null,
'mail_2' => null,
'messages' => null,
'additional_settings' => null,
) );
$args['id'] = (int) $args['id'];
if ( -1 == $args['id'] ) {
$contact_form = WPCF7_ContactForm::get_template();
} else {
$contact_form = wpcf7_contact_form( $args['id'] );
}
if ( empty( $contact_form ) ) {
return false;
}
if ( null !== $args['title'] ) {
$contact_form->set_title( $args['title'] );
}
if ( null !== $args['locale'] ) {
$contact_form->set_locale( $args['locale'] );
}
$properties = $contact_form->get_properties();
$properties['form'] = wpcf7_sanitize_form(
$args['form'], $properties['form'] );
$properties['mail'] = wpcf7_sanitize_mail(
$args['mail'], $properties['mail'] );
$properties['mail']['active'] = true;
$properties['mail_2'] = wpcf7_sanitize_mail(
$args['mail_2'], $properties['mail_2'] );
$properties['messages'] = wpcf7_sanitize_messages(
$args['messages'], $properties['messages'] );
$properties['additional_settings'] = wpcf7_sanitize_additional_settings(
$args['additional_settings'], $properties['additional_settings'] );
$contact_form->set_properties( $properties );
do_action( 'wpcf7_save_contact_form', $contact_form, $args, $context );
if ( 'save' == $context ) {
$contact_form->save();
}
return $contact_form;
}
function wpcf7_sanitize_form( $input, $default = '' ) {
if ( null === $input ) {
return $default;
}
$output = trim( $input );
return $output;
}
function wpcf7_sanitize_mail( $input, $defaults = array() ) {
$defaults = wp_parse_args( $defaults, array(
'active' => false,
'subject' => '',
'sender' => '',
'recipient' => '',
'body' => '',
'additional_headers' => '',
'attachments' => '',
'use_html' => false,
'exclude_blank' => false,
) );
$input = wp_parse_args( $input, $defaults );
$output = array();
$output['active'] = (bool) $input['active'];
$output['subject'] = trim( $input['subject'] );
$output['sender'] = trim( $input['sender'] );
$output['recipient'] = trim( $input['recipient'] );
$output['body'] = trim( $input['body'] );
$output['additional_headers'] = '';
$headers = str_replace( "\r\n", "\n", $input['additional_headers'] );
$headers = explode( "\n", $headers );
foreach ( $headers as $header ) {
$header = trim( $header );
if ( '' !== $header ) {
$output['additional_headers'] .= $header . "\n";
}
}
$output['additional_headers'] = trim( $output['additional_headers'] );
$output['attachments'] = trim( $input['attachments'] );
$output['use_html'] = (bool) $input['use_html'];
$output['exclude_blank'] = (bool) $input['exclude_blank'];
return $output;
}
function wpcf7_sanitize_messages( $input, $defaults = array() ) {
$output = array();
foreach ( wpcf7_messages() as $key => $val ) {
if ( isset( $input[$key] ) ) {
$output[$key] = trim( $input[$key] );
} elseif ( isset( $defaults[$key] ) ) {
$output[$key] = $defaults[$key];
}
}
return $output;
}
function wpcf7_sanitize_additional_settings( $input, $default = '' ) {
if ( null === $input ) {
return $default;
}
$output = trim( $input );
return $output;
}

View File

@ -0,0 +1,201 @@
<?php
class WPCF7_ContactFormTemplate {
public static function get_default( $prop = 'form' ) {
if ( 'form' == $prop ) {
$template = self::form();
} elseif ( 'mail' == $prop ) {
$template = self::mail();
} elseif ( 'mail_2' == $prop ) {
$template = self::mail_2();
} elseif ( 'messages' == $prop ) {
$template = self::messages();
} else {
$template = null;
}
return apply_filters( 'wpcf7_default_template', $template, $prop );
}
public static function form() {
$template = sprintf(
'
<label> %2$s %1$s
[text* your-name] </label>
<label> %3$s %1$s
[email* your-email] </label>
<label> %4$s
[text your-subject] </label>
<label> %5$s
[textarea your-message] </label>
[submit "%6$s"]',
__( '(required)', 'contact-form-7' ),
__( 'Your Name', 'contact-form-7' ),
__( 'Your Email', 'contact-form-7' ),
__( 'Subject', 'contact-form-7' ),
__( 'Your Message', 'contact-form-7' ),
__( 'Send', 'contact-form-7' ) );
return trim( $template );
}
public static function mail() {
$template = array(
'subject' =>
/* translators: 1: blog name, 2: [your-subject] */
sprintf(
_x( '%1$s "%2$s"', 'mail subject', 'contact-form-7' ),
get_bloginfo( 'name' ), '[your-subject]' ),
'sender' => sprintf( '%s <%s>',
get_bloginfo( 'name' ), self::from_email() ),
'body' =>
/* translators: %s: [your-name] <[your-email]> */
sprintf( __( 'From: %s', 'contact-form-7' ),
'[your-name] <[your-email]>' ) . "\n"
/* translators: %s: [your-subject] */
. sprintf( __( 'Subject: %s', 'contact-form-7' ),
'[your-subject]' ) . "\n\n"
. __( 'Message Body:', 'contact-form-7' )
. "\n" . '[your-message]' . "\n\n"
. '-- ' . "\n"
/* translators: 1: blog name, 2: blog URL */
. sprintf(
__( 'This e-mail was sent from a contact form on %1$s (%2$s)', 'contact-form-7' ),
get_bloginfo( 'name' ),
get_bloginfo( 'url' ) ),
'recipient' => get_option( 'admin_email' ),
'additional_headers' => 'Reply-To: [your-email]',
'attachments' => '',
'use_html' => 0,
'exclude_blank' => 0,
);
return $template;
}
public static function mail_2() {
$template = array(
'active' => false,
'subject' =>
/* translators: 1: blog name, 2: [your-subject] */
sprintf(
_x( '%1$s "%2$s"', 'mail subject', 'contact-form-7' ),
get_bloginfo( 'name' ), '[your-subject]' ),
'sender' => sprintf( '%s <%s>',
get_bloginfo( 'name' ), self::from_email() ),
'body' =>
__( 'Message Body:', 'contact-form-7' )
. "\n" . '[your-message]' . "\n\n"
. '-- ' . "\n"
/* translators: 1: blog name, 2: blog URL */
. sprintf(
__( 'This e-mail was sent from a contact form on %1$s (%2$s)', 'contact-form-7' ),
get_bloginfo( 'name' ),
get_bloginfo( 'url' ) ),
'recipient' => '[your-email]',
'additional_headers' => sprintf( 'Reply-To: %s',
get_option( 'admin_email' ) ),
'attachments' => '',
'use_html' => 0,
'exclude_blank' => 0,
);
return $template;
}
public static function from_email() {
$admin_email = get_option( 'admin_email' );
$sitename = strtolower( $_SERVER['SERVER_NAME'] );
if ( wpcf7_is_localhost() ) {
return $admin_email;
}
if ( substr( $sitename, 0, 4 ) == 'www.' ) {
$sitename = substr( $sitename, 4 );
}
if ( strpbrk( $admin_email, '@' ) == '@' . $sitename ) {
return $admin_email;
}
return 'wordpress@' . $sitename;
}
public static function messages() {
$messages = array();
foreach ( wpcf7_messages() as $key => $arr ) {
$messages[$key] = $arr['default'];
}
return $messages;
}
}
function wpcf7_messages() {
$messages = array(
'mail_sent_ok' => array(
'description'
=> __( "Sender's message was sent successfully", 'contact-form-7' ),
'default'
=> __( "Thank you for your message. It has been sent.", 'contact-form-7' ),
),
'mail_sent_ng' => array(
'description'
=> __( "Sender's message failed to send", 'contact-form-7' ),
'default'
=> __( "There was an error trying to send your message. Please try again later.", 'contact-form-7' ),
),
'validation_error' => array(
'description'
=> __( "Validation errors occurred", 'contact-form-7' ),
'default'
=> __( "One or more fields have an error. Please check and try again.", 'contact-form-7' ),
),
'spam' => array(
'description'
=> __( "Submission was referred to as spam", 'contact-form-7' ),
'default'
=> __( "There was an error trying to send your message. Please try again later.", 'contact-form-7' ),
),
'accept_terms' => array(
'description'
=> __( "There are terms that the sender must accept", 'contact-form-7' ),
'default'
=> __( "You must accept the terms and conditions before sending your message.", 'contact-form-7' ),
),
'invalid_required' => array(
'description'
=> __( "There is a field that the sender must fill in", 'contact-form-7' ),
'default'
=> __( "The field is required.", 'contact-form-7' ),
),
'invalid_too_long' => array(
'description'
=> __( "There is a field with input that is longer than the maximum allowed length", 'contact-form-7' ),
'default'
=> __( "The field is too long.", 'contact-form-7' ),
),
'invalid_too_short' => array(
'description'
=> __( "There is a field with input that is shorter than the minimum allowed length", 'contact-form-7' ),
'default'
=> __( "The field is too short.", 'contact-form-7' ),
)
);
return apply_filters( 'wpcf7_messages', $messages );
}

View File

@ -0,0 +1,935 @@
<?php
class WPCF7_ContactForm {
const post_type = 'wpcf7_contact_form';
private static $found_items = 0;
private static $current = null;
private $id;
private $name;
private $title;
private $locale;
private $properties = array();
private $unit_tag;
private $responses_count = 0;
private $scanned_form_tags;
private $shortcode_atts = array();
public static function count() {
return self::$found_items;
}
public static function get_current() {
return self::$current;
}
public static function register_post_type() {
register_post_type( self::post_type, array(
'labels' => array(
'name' => __( 'Contact Forms', 'contact-form-7' ),
'singular_name' => __( 'Contact Form', 'contact-form-7' ),
),
'rewrite' => false,
'query_var' => false,
'public' => false,
'capability_type' => 'page',
'capabilities' => array(
'edit_post' => 'wpcf7_edit_contact_form',
'read_post' => 'wpcf7_read_contact_form',
'delete_post' => 'wpcf7_delete_contact_form',
'edit_posts' => 'wpcf7_edit_contact_forms',
'edit_others_posts' => 'wpcf7_edit_contact_forms',
'publish_posts' => 'wpcf7_edit_contact_forms',
'read_private_posts' => 'wpcf7_edit_contact_forms',
),
) );
}
public static function find( $args = '' ) {
$defaults = array(
'post_status' => 'any',
'posts_per_page' => -1,
'offset' => 0,
'orderby' => 'ID',
'order' => 'ASC',
);
$args = wp_parse_args( $args, $defaults );
$args['post_type'] = self::post_type;
$q = new WP_Query();
$posts = $q->query( $args );
self::$found_items = $q->found_posts;
$objs = array();
foreach ( (array) $posts as $post ) {
$objs[] = new self( $post );
}
return $objs;
}
public static function get_template( $args = '' ) {
global $l10n;
$defaults = array( 'locale' => null, 'title' => '' );
$args = wp_parse_args( $args, $defaults );
$locale = $args['locale'];
$title = $args['title'];
if ( $locale ) {
$mo_orig = $l10n['contact-form-7'];
wpcf7_load_textdomain( $locale );
}
self::$current = $contact_form = new self;
$contact_form->title =
( $title ? $title : __( 'Untitled', 'contact-form-7' ) );
$contact_form->locale = ( $locale ? $locale : get_user_locale() );
$properties = $contact_form->get_properties();
foreach ( $properties as $key => $value ) {
$properties[$key] = WPCF7_ContactFormTemplate::get_default( $key );
}
$contact_form->properties = $properties;
$contact_form = apply_filters( 'wpcf7_contact_form_default_pack',
$contact_form, $args );
if ( isset( $mo_orig ) ) {
$l10n['contact-form-7'] = $mo_orig;
}
return $contact_form;
}
public static function get_instance( $post ) {
$post = get_post( $post );
if ( ! $post
or self::post_type != get_post_type( $post ) ) {
return false;
}
return self::$current = new self( $post );
}
private static function get_unit_tag( $id = 0 ) {
static $global_count = 0;
$global_count += 1;
if ( in_the_loop() ) {
$unit_tag = sprintf( 'wpcf7-f%1$d-p%2$d-o%3$d',
absint( $id ), get_the_ID(), $global_count );
} else {
$unit_tag = sprintf( 'wpcf7-f%1$d-o%2$d',
absint( $id ), $global_count );
}
return $unit_tag;
}
private function __construct( $post = null ) {
$post = get_post( $post );
if ( $post
and self::post_type == get_post_type( $post ) ) {
$this->id = $post->ID;
$this->name = $post->post_name;
$this->title = $post->post_title;
$this->locale = get_post_meta( $post->ID, '_locale', true );
$properties = $this->get_properties();
foreach ( $properties as $key => $value ) {
if ( metadata_exists( 'post', $post->ID, '_' . $key ) ) {
$properties[$key] = get_post_meta( $post->ID, '_' . $key, true );
} elseif ( metadata_exists( 'post', $post->ID, $key ) ) {
$properties[$key] = get_post_meta( $post->ID, $key, true );
}
}
$this->properties = $properties;
$this->upgrade();
}
do_action( 'wpcf7_contact_form', $this );
}
public function __get( $name ) {
$message = __( '<code>%1$s</code> property of a <code>WPCF7_ContactForm</code> object is <strong>no longer accessible</strong>. Use <code>%2$s</code> method instead.', 'contact-form-7' );
if ( 'id' == $name ) {
if ( WP_DEBUG ) {
trigger_error( sprintf( $message, 'id', 'id()' ) );
}
return $this->id;
} elseif ( 'title' == $name ) {
if ( WP_DEBUG ) {
trigger_error( sprintf( $message, 'title', 'title()' ) );
}
return $this->title;
} elseif ( $prop = $this->prop( $name ) ) {
if ( WP_DEBUG ) {
trigger_error(
sprintf( $message, $name, 'prop(\'' . $name . '\')' ) );
}
return $prop;
}
}
public function initial() {
return empty( $this->id );
}
public function prop( $name ) {
$props = $this->get_properties();
return isset( $props[$name] ) ? $props[$name] : null;
}
public function get_properties() {
$properties = (array) $this->properties;
$properties = wp_parse_args( $properties, array(
'form' => '',
'mail' => array(),
'mail_2' => array(),
'messages' => array(),
'additional_settings' => '',
) );
$properties = (array) apply_filters( 'wpcf7_contact_form_properties',
$properties, $this );
return $properties;
}
public function set_properties( $properties ) {
$defaults = $this->get_properties();
$properties = wp_parse_args( $properties, $defaults );
$properties = array_intersect_key( $properties, $defaults );
$this->properties = $properties;
}
public function id() {
return $this->id;
}
public function name() {
return $this->name;
}
public function title() {
return $this->title;
}
public function set_title( $title ) {
$title = strip_tags( $title );
$title = trim( $title );
if ( '' === $title ) {
$title = __( 'Untitled', 'contact-form-7' );
}
$this->title = $title;
}
public function locale() {
if ( wpcf7_is_valid_locale( $this->locale ) ) {
return $this->locale;
} else {
return '';
}
}
public function set_locale( $locale ) {
$locale = trim( $locale );
if ( wpcf7_is_valid_locale( $locale ) ) {
$this->locale = $locale;
} else {
$this->locale = 'en_US';
}
}
public function shortcode_attr( $name ) {
if ( isset( $this->shortcode_atts[$name] ) ) {
return (string) $this->shortcode_atts[$name];
}
}
// Return true if this form is the same one as currently POSTed.
public function is_posted() {
if ( ! WPCF7_Submission::get_instance() ) {
return false;
}
if ( empty( $_POST['_wpcf7_unit_tag'] ) ) {
return false;
}
return $this->unit_tag == $_POST['_wpcf7_unit_tag'];
}
/* Generating Form HTML */
public function form_html( $args = '' ) {
$args = wp_parse_args( $args, array(
'html_id' => '',
'html_name' => '',
'html_class' => '',
'output' => 'form',
) );
$this->shortcode_atts = $args;
if ( 'raw_form' == $args['output'] ) {
return '<pre class="wpcf7-raw-form"><code>'
. esc_html( $this->prop( 'form' ) ) . '</code></pre>';
}
if ( $this->is_true( 'subscribers_only' )
and ! current_user_can( 'wpcf7_submit', $this->id() ) ) {
$notice = __(
"This contact form is available only for logged in users.",
'contact-form-7' );
$notice = sprintf(
'<p class="wpcf7-subscribers-only">%s</p>',
esc_html( $notice ) );
return apply_filters( 'wpcf7_subscribers_only_notice', $notice, $this );
}
$this->unit_tag = self::get_unit_tag( $this->id );
$lang_tag = str_replace( '_', '-', $this->locale );
if ( preg_match( '/^([a-z]+-[a-z]+)-/i', $lang_tag, $matches ) ) {
$lang_tag = $matches[1];
}
$html = sprintf( '<div %s>',
wpcf7_format_atts( array(
'role' => 'form',
'class' => 'wpcf7',
'id' => $this->unit_tag,
( get_option( 'html_type' ) == 'text/html' ) ? 'lang' : 'xml:lang'
=> $lang_tag,
'dir' => wpcf7_is_rtl( $this->locale ) ? 'rtl' : 'ltr',
) )
);
$html .= "\n" . $this->screen_reader_response() . "\n";
$url = wpcf7_get_request_uri();
if ( $frag = strstr( $url, '#' ) ) {
$url = substr( $url, 0, -strlen( $frag ) );
}
$url .= '#' . $this->unit_tag;
$url = apply_filters( 'wpcf7_form_action_url', $url );
$id_attr = apply_filters( 'wpcf7_form_id_attr',
preg_replace( '/[^A-Za-z0-9:._-]/', '', $args['html_id'] ) );
$name_attr = apply_filters( 'wpcf7_form_name_attr',
preg_replace( '/[^A-Za-z0-9:._-]/', '', $args['html_name'] ) );
$class = 'wpcf7-form';
if ( $this->is_posted() ) {
$submission = WPCF7_Submission::get_instance();
switch ( $submission->get_status() ) {
case 'validation_failed':
$class .= ' invalid';
break;
case 'acceptance_missing':
$class .= ' unaccepted';
break;
case 'spam':
$class .= ' spam';
break;
case 'aborted':
$class .= ' aborted';
break;
case 'mail_sent':
$class .= ' sent';
break;
case 'mail_failed':
$class .= ' failed';
break;
default:
$class .= sprintf( ' custom-%s',
preg_replace( '/[^0-9a-z]+/i', '-', $submission->get_status() )
);
}
}
if ( $args['html_class'] ) {
$class .= ' ' . $args['html_class'];
}
if ( $this->in_demo_mode() ) {
$class .= ' demo';
}
$class = explode( ' ', $class );
$class = array_map( 'sanitize_html_class', $class );
$class = array_filter( $class );
$class = array_unique( $class );
$class = implode( ' ', $class );
$class = apply_filters( 'wpcf7_form_class_attr', $class );
$enctype = apply_filters( 'wpcf7_form_enctype', '' );
$autocomplete = apply_filters( 'wpcf7_form_autocomplete', '' );
$novalidate = apply_filters( 'wpcf7_form_novalidate',
wpcf7_support_html5() );
$atts = array(
'action' => esc_url( $url ),
'method' => 'post',
'class' => $class,
'enctype' => wpcf7_enctype_value( $enctype ),
'autocomplete' => $autocomplete,
'novalidate' => $novalidate ? 'novalidate' : '',
);
if ( '' !== $id_attr ) {
$atts['id'] = $id_attr;
}
if ( '' !== $name_attr ) {
$atts['name'] = $name_attr;
}
$atts = wpcf7_format_atts( $atts );
$html .= sprintf( '<form %s>', $atts ) . "\n";
$html .= $this->form_hidden_fields();
$html .= $this->form_elements();
if ( ! $this->responses_count ) {
$html .= $this->form_response_output();
}
$html .= '</form>';
$html .= '</div>';
return $html;
}
private function form_hidden_fields() {
$hidden_fields = array(
'_wpcf7' => $this->id(),
'_wpcf7_version' => WPCF7_VERSION,
'_wpcf7_locale' => $this->locale(),
'_wpcf7_unit_tag' => $this->unit_tag,
'_wpcf7_container_post' => 0,
);
if ( in_the_loop() ) {
$hidden_fields['_wpcf7_container_post'] = (int) get_the_ID();
}
if ( $this->nonce_is_active() ) {
$hidden_fields['_wpnonce'] = wpcf7_create_nonce();
}
$hidden_fields += (array) apply_filters(
'wpcf7_form_hidden_fields', array() );
$content = '';
foreach ( $hidden_fields as $name => $value ) {
$content .= sprintf(
'<input type="hidden" name="%1$s" value="%2$s" />',
esc_attr( $name ), esc_attr( $value ) ) . "\n";
}
return '<div style="display: none;">' . "\n" . $content . '</div>' . "\n";
}
public function form_response_output() {
$class = 'wpcf7-response-output';
$role = '';
$content = '';
if ( $this->is_posted() ) { // Post response output for non-AJAX
$role = 'alert';
$submission = WPCF7_Submission::get_instance();
$content = $submission->get_response();
switch ( $submission->get_status() ) {
case 'validation_failed':
$class .= ' wpcf7-validation-errors';
break;
case 'acceptance_missing':
$class .= ' wpcf7-acceptance-missing';
break;
case 'spam':
$class .= ' wpcf7-spam-blocked';
break;
case 'aborted':
$class .= ' wpcf7-aborted';
break;
case 'mail_sent':
$class .= ' wpcf7-mail-sent-ok';
break;
case 'mail_failed':
$class .= ' wpcf7-mail-sent-ng';
break;
default:
$class .= sprintf( ' wpcf7-custom-%s',
preg_replace( '/[^0-9a-z]+/i', '-', $submission->get_status() )
);
}
} else {
$class .= ' wpcf7-display-none';
}
$atts = array(
'class' => trim( $class ),
'role' => trim( $role ),
);
$atts = wpcf7_format_atts( $atts );
$output = sprintf( '<div %1$s>%2$s</div>',
$atts, esc_html( $content ) );
$output = apply_filters( 'wpcf7_form_response_output',
$output, $class, $content, $this );
$this->responses_count += 1;
return $output;
}
public function screen_reader_response() {
$class = 'screen-reader-response';
$role = '';
$content = '';
if ( $this->is_posted() ) { // Post response output for non-AJAX
$role = 'alert';
$submission = WPCF7_Submission::get_instance();
if ( $response = $submission->get_response() ) {
$content = esc_html( $response );
}
if ( $invalid_fields = $submission->get_invalid_fields() ) {
$content .= "\n" . '<ul>' . "\n";
foreach ( (array) $invalid_fields as $name => $field ) {
if ( $field['idref'] ) {
$link = sprintf( '<a href="#%1$s">%2$s</a>',
esc_attr( $field['idref'] ),
esc_html( $field['reason'] ) );
$content .= sprintf( '<li>%s</li>', $link );
} else {
$content .= sprintf( '<li>%s</li>',
esc_html( $field['reason'] ) );
}
$content .= "\n";
}
$content .= '</ul>' . "\n";
}
}
$atts = array(
'class' => trim( $class ),
'role' => trim( $role ) );
$atts = wpcf7_format_atts( $atts );
$output = sprintf( '<div %1$s>%2$s</div>',
$atts, $content );
return $output;
}
public function validation_error( $name ) {
$error = '';
if ( $this->is_posted() ) {
$submission = WPCF7_Submission::get_instance();
if ( $invalid_field = $submission->get_invalid_field( $name ) ) {
$error = trim( $invalid_field['reason'] );
}
}
if ( ! $error ) {
return $error;
}
$error = sprintf(
'<span role="alert" class="wpcf7-not-valid-tip">%s</span>',
esc_html( $error ) );
return apply_filters( 'wpcf7_validation_error', $error, $name, $this );
}
/* Form Elements */
public function replace_all_form_tags() {
$manager = WPCF7_FormTagsManager::get_instance();
$form = $this->prop( 'form' );
if ( wpcf7_autop_or_not() ) {
$form = $manager->normalize( $form );
$form = wpcf7_autop( $form );
}
$form = $manager->replace_all( $form );
$this->scanned_form_tags = $manager->get_scanned_tags();
return $form;
}
public function form_do_shortcode() {
wpcf7_deprecated_function( __METHOD__, '4.6',
'WPCF7_ContactForm::replace_all_form_tags' );
return $this->replace_all_form_tags();
}
public function scan_form_tags( $cond = null ) {
$manager = WPCF7_FormTagsManager::get_instance();
if ( empty( $this->scanned_form_tags ) ) {
$this->scanned_form_tags = $manager->scan( $this->prop( 'form' ) );
}
$tags = $this->scanned_form_tags;
return $manager->filter( $tags, $cond );
}
public function form_scan_shortcode( $cond = null ) {
wpcf7_deprecated_function( __METHOD__, '4.6',
'WPCF7_ContactForm::scan_form_tags' );
return $this->scan_form_tags( $cond );
}
public function form_elements() {
return apply_filters( 'wpcf7_form_elements',
$this->replace_all_form_tags() );
}
public function collect_mail_tags( $args = '' ) {
$manager = WPCF7_FormTagsManager::get_instance();
$args = wp_parse_args( $args, array(
'include' => array(),
'exclude' => $manager->collect_tag_types( 'not-for-mail' ),
) );
$tags = $this->scan_form_tags();
$mailtags = array();
foreach ( (array) $tags as $tag ) {
$type = $tag->basetype;
if ( empty( $type ) ) {
continue;
} elseif ( ! empty( $args['include'] ) ) {
if ( ! in_array( $type, $args['include'] ) ) {
continue;
}
} elseif ( ! empty( $args['exclude'] ) ) {
if ( in_array( $type, $args['exclude'] ) ) {
continue;
}
}
$mailtags[] = $tag->name;
}
$mailtags = array_unique( array_filter( $mailtags ) );
return apply_filters( 'wpcf7_collect_mail_tags', $mailtags, $args, $this );
}
public function suggest_mail_tags( $for = 'mail' ) {
$mail = wp_parse_args( $this->prop( $for ),
array(
'active' => false,
'recipient' => '',
'sender' => '',
'subject' => '',
'body' => '',
'additional_headers' => '',
'attachments' => '',
'use_html' => false,
'exclude_blank' => false,
)
);
$mail = array_filter( $mail );
foreach ( (array) $this->collect_mail_tags() as $mail_tag ) {
$pattern = sprintf( '/\[(_[a-z]+_)?%s([ \t]+[^]]+)?\]/',
preg_quote( $mail_tag, '/' ) );
$used = preg_grep( $pattern, $mail );
echo sprintf(
'<span class="%1$s">[%2$s]</span>',
'mailtag code ' . ( $used ? 'used' : 'unused' ),
esc_html( $mail_tag ) );
}
}
public function submit( $args = '' ) {
$args = wp_parse_args( $args, array(
'skip_mail' =>
( $this->in_demo_mode()
|| $this->is_true( 'skip_mail' )
|| ! empty( $this->skip_mail ) ),
) );
if ( $this->is_true( 'subscribers_only' )
and ! current_user_can( 'wpcf7_submit', $this->id() ) ) {
$result = array(
'contact_form_id' => $this->id(),
'status' => 'error',
'message' => __(
"This contact form is available only for logged in users.",
'contact-form-7' ),
);
return $result;
}
$submission = WPCF7_Submission::get_instance( $this, array(
'skip_mail' => $args['skip_mail'],
) );
$result = array(
'contact_form_id' => $this->id(),
'status' => $submission->get_status(),
'message' => $submission->get_response(),
'demo_mode' => $this->in_demo_mode(),
);
if ( $submission->is( 'validation_failed' ) ) {
$result['invalid_fields'] = $submission->get_invalid_fields();
}
do_action( 'wpcf7_submit', $this, $result );
return $result;
}
/* Message */
public function message( $status, $filter = true ) {
$messages = $this->prop( 'messages' );
$message = isset( $messages[$status] ) ? $messages[$status] : '';
if ( $filter ) {
$message = $this->filter_message( $message, $status );
}
return $message;
}
public function filter_message( $message, $status = '' ) {
$message = wp_strip_all_tags( $message );
$message = wpcf7_mail_replace_tags( $message, array( 'html' => true ) );
$message = apply_filters( 'wpcf7_display_message', $message, $status );
return $message;
}
/* Additional settings */
public function additional_setting( $name, $max = 1 ) {
$settings = (array) explode( "\n", $this->prop( 'additional_settings' ) );
$pattern = '/^([a-zA-Z0-9_]+)[\t ]*:(.*)$/';
$count = 0;
$values = array();
foreach ( $settings as $setting ) {
if ( preg_match( $pattern, $setting, $matches ) ) {
if ( $matches[1] != $name ) {
continue;
}
if ( ! $max or $count < (int) $max ) {
$values[] = trim( $matches[2] );
$count += 1;
}
}
}
return $values;
}
public function is_true( $name ) {
$settings = $this->additional_setting( $name, false );
foreach ( $settings as $setting ) {
if ( in_array( $setting, array( 'on', 'true', '1' ) ) ) {
return true;
}
}
return false;
}
public function in_demo_mode() {
return $this->is_true( 'demo_mode' );
}
public function nonce_is_active() {
$is_active = WPCF7_VERIFY_NONCE;
if ( $this->is_true( 'subscribers_only' ) ) {
$is_active = true;
}
return (bool) apply_filters( 'wpcf7_verify_nonce', $is_active, $this );
}
/* Upgrade */
private function upgrade() {
$mail = $this->prop( 'mail' );
if ( is_array( $mail )
and ! isset( $mail['recipient'] ) ) {
$mail['recipient'] = get_option( 'admin_email' );
}
$this->properties['mail'] = $mail;
$messages = $this->prop( 'messages' );
if ( is_array( $messages ) ) {
foreach ( wpcf7_messages() as $key => $arr ) {
if ( ! isset( $messages[$key] ) ) {
$messages[$key] = $arr['default'];
}
}
}
$this->properties['messages'] = $messages;
}
/* Save */
public function save() {
$props = $this->get_properties();
$post_content = implode( "\n", wpcf7_array_flatten( $props ) );
if ( $this->initial() ) {
$post_id = wp_insert_post( array(
'post_type' => self::post_type,
'post_status' => 'publish',
'post_title' => $this->title,
'post_content' => trim( $post_content ),
) );
} else {
$post_id = wp_update_post( array(
'ID' => (int) $this->id,
'post_status' => 'publish',
'post_title' => $this->title,
'post_content' => trim( $post_content ),
) );
}
if ( $post_id ) {
foreach ( $props as $prop => $value ) {
update_post_meta( $post_id, '_' . $prop,
wpcf7_normalize_newline_deep( $value ) );
}
if ( wpcf7_is_valid_locale( $this->locale ) ) {
update_post_meta( $post_id, '_locale', $this->locale );
}
if ( $this->initial() ) {
$this->id = $post_id;
do_action( 'wpcf7_after_create', $this );
} else {
do_action( 'wpcf7_after_update', $this );
}
do_action( 'wpcf7_after_save', $this );
}
return $post_id;
}
public function copy() {
$new = new self;
$new->title = $this->title . '_copy';
$new->locale = $this->locale;
$new->properties = $this->properties;
return apply_filters( 'wpcf7_copy', $new, $this );
}
public function delete() {
if ( $this->initial() ) {
return;
}
if ( wp_delete_post( $this->id, true ) ) {
$this->id = 0;
return true;
}
return false;
}
public function shortcode( $args = '' ) {
$args = wp_parse_args( $args, array(
'use_old_format' => false ) );
$title = str_replace( array( '"', '[', ']' ), '', $this->title );
if ( $args['use_old_format'] ) {
$old_unit_id = (int) get_post_meta( $this->id, '_old_cf7_unit_id', true );
if ( $old_unit_id ) {
$shortcode = sprintf( '[contact-form %1$d "%2$s"]', $old_unit_id, $title );
} else {
$shortcode = '';
}
} else {
$shortcode = sprintf( '[contact-form-7 id="%1$d" title="%2$s"]',
$this->id, $title );
}
return apply_filters( 'wpcf7_contact_form_shortcode',
$shortcode, $args, $this );
}
}

View File

@ -0,0 +1,104 @@
<?php
add_action( 'parse_request', 'wpcf7_control_init', 20, 0 );
function wpcf7_control_init() {
if ( WPCF7_Submission::is_restful() ) {
return;
}
if ( isset( $_POST['_wpcf7'] ) ) {
$contact_form = wpcf7_contact_form( (int) $_POST['_wpcf7'] );
if ( $contact_form ) {
$contact_form->submit();
}
}
}
add_action( 'wp_enqueue_scripts', 'wpcf7_do_enqueue_scripts', 10, 0 );
function wpcf7_do_enqueue_scripts() {
if ( wpcf7_load_js() ) {
wpcf7_enqueue_scripts();
}
if ( wpcf7_load_css() ) {
wpcf7_enqueue_styles();
}
}
function wpcf7_enqueue_scripts() {
$in_footer = true;
if ( 'header' === wpcf7_load_js() ) {
$in_footer = false;
}
wp_enqueue_script( 'contact-form-7',
wpcf7_plugin_url( 'includes/js/scripts.js' ),
array( 'jquery' ), WPCF7_VERSION, $in_footer );
$wpcf7 = array(
'apiSettings' => array(
'root' => esc_url_raw( rest_url( 'contact-form-7/v1' ) ),
'namespace' => 'contact-form-7/v1',
),
);
if ( defined( 'WP_CACHE' ) and WP_CACHE ) {
$wpcf7['cached'] = 1;
}
if ( wpcf7_support_html5_fallback() ) {
$wpcf7['jqueryUi'] = 1;
}
wp_localize_script( 'contact-form-7', 'wpcf7', $wpcf7 );
do_action( 'wpcf7_enqueue_scripts' );
}
function wpcf7_script_is() {
return wp_script_is( 'contact-form-7' );
}
function wpcf7_enqueue_styles() {
wp_enqueue_style( 'contact-form-7',
wpcf7_plugin_url( 'includes/css/styles.css' ),
array(), WPCF7_VERSION, 'all' );
if ( wpcf7_is_rtl() ) {
wp_enqueue_style( 'contact-form-7-rtl',
wpcf7_plugin_url( 'includes/css/styles-rtl.css' ),
array(), WPCF7_VERSION, 'all' );
}
do_action( 'wpcf7_enqueue_styles' );
}
function wpcf7_style_is() {
return wp_style_is( 'contact-form-7' );
}
/* HTML5 Fallback */
add_action( 'wp_enqueue_scripts', 'wpcf7_html5_fallback', 20, 0 );
function wpcf7_html5_fallback() {
if ( ! wpcf7_support_html5_fallback() ) {
return;
}
if ( wpcf7_script_is() ) {
wp_enqueue_script( 'jquery-ui-datepicker' );
wp_enqueue_script( 'jquery-ui-spinner' );
}
if ( wpcf7_style_is() ) {
wp_enqueue_style( 'jquery-ui-smoothness',
wpcf7_plugin_url(
'includes/js/jquery-ui/themes/smoothness/jquery-ui.min.css' ),
array(), '1.11.4', 'screen' );
}
}

View File

@ -0,0 +1,12 @@
span.wpcf7-not-valid-tip {
direction: rtl;
}
.use-floating-validation-tip span.wpcf7-not-valid-tip {
left: auto;
right: 20%;
}
span.wpcf7-list-item {
margin: 0 1em 0 0;
}

View File

@ -0,0 +1,110 @@
div.wpcf7 {
margin: 0;
padding: 0;
}
div.wpcf7 .screen-reader-response {
position: absolute;
overflow: hidden;
clip: rect(1px, 1px, 1px, 1px);
height: 1px;
width: 1px;
margin: 0;
padding: 0;
border: 0;
}
div.wpcf7-response-output {
margin: 2em 0.5em 1em;
padding: 0.2em 1em;
border: 2px solid #ff0000;
}
div.wpcf7-mail-sent-ok {
border: 2px solid #398f14;
}
div.wpcf7-mail-sent-ng,
div.wpcf7-aborted {
border: 2px solid #ff0000;
}
div.wpcf7-spam-blocked {
border: 2px solid #ffa500;
}
div.wpcf7-validation-errors,
div.wpcf7-acceptance-missing {
border: 2px solid #f7e700;
}
.wpcf7-form-control-wrap {
position: relative;
}
span.wpcf7-not-valid-tip {
color: #f00;
font-size: 1em;
font-weight: normal;
display: block;
}
.use-floating-validation-tip span.wpcf7-not-valid-tip {
position: absolute;
top: 20%;
left: 20%;
z-index: 100;
border: 1px solid #ff0000;
background: #fff;
padding: .2em .8em;
}
span.wpcf7-list-item {
display: inline-block;
margin: 0 0 0 1em;
}
span.wpcf7-list-item-label::before,
span.wpcf7-list-item-label::after {
content: " ";
}
.wpcf7-display-none {
display: none;
}
div.wpcf7 .ajax-loader {
visibility: hidden;
display: inline-block;
background-image: url('../../images/ajax-loader.gif');
width: 16px;
height: 16px;
border: none;
padding: 0;
margin: 0 0 0 4px;
vertical-align: middle;
}
div.wpcf7 .ajax-loader.is-active {
visibility: visible;
}
div.wpcf7 div.ajax-error {
display: none;
}
div.wpcf7 .placeheld {
color: #888;
}
div.wpcf7 input[type="file"] {
cursor: pointer;
}
div.wpcf7 input[type="file"]:disabled {
cursor: default;
}
div.wpcf7 .wpcf7-submit:disabled {
cursor: not-allowed;
}

View File

@ -0,0 +1,367 @@
<?php
class WPCF7_FormTag implements ArrayAccess {
public $type;
public $basetype;
public $name = '';
public $options = array();
public $raw_values = array();
public $values = array();
public $pipes;
public $labels = array();
public $attr = '';
public $content = '';
public function __construct( $tag = array() ) {
if ( is_array( $tag )
or $tag instanceof self ) {
foreach ( $tag as $key => $value ) {
if ( property_exists( __CLASS__, $key ) ) {
$this->{$key} = $value;
}
}
}
}
public function is_required() {
return ( '*' == substr( $this->type, -1 ) );
}
public function has_option( $opt ) {
$pattern = sprintf( '/^%s(:.+)?$/i', preg_quote( $opt, '/' ) );
return (bool) preg_grep( $pattern, $this->options );
}
public function get_option( $opt, $pattern = '', $single = false ) {
$preset_patterns = array(
'date' => '([0-9]{4}-[0-9]{2}-[0-9]{2}|today(.*))',
'int' => '[0-9]+',
'signed_int' => '-?[0-9]+',
'class' => '[-0-9a-zA-Z_]+',
'id' => '[-0-9a-zA-Z_]+',
);
if ( isset( $preset_patterns[$pattern] ) ) {
$pattern = $preset_patterns[$pattern];
}
if ( '' == $pattern ) {
$pattern = '.+';
}
$pattern = sprintf( '/^%s:%s$/i', preg_quote( $opt, '/' ), $pattern );
if ( $single ) {
$matches = $this->get_first_match_option( $pattern );
if ( ! $matches ) {
return false;
}
return substr( $matches[0], strlen( $opt ) + 1 );
} else {
$matches_a = $this->get_all_match_options( $pattern );
if ( ! $matches_a ) {
return false;
}
$results = array();
foreach ( $matches_a as $matches ) {
$results[] = substr( $matches[0], strlen( $opt ) + 1 );
}
return $results;
}
}
public function get_id_option() {
return $this->get_option( 'id', 'id', true );
}
public function get_class_option( $default = '' ) {
if ( is_string( $default ) ) {
$default = explode( ' ', $default );
}
$options = array_merge(
(array) $default,
(array) $this->get_option( 'class', 'class' ) );
$options = array_filter( array_unique( $options ) );
return implode( ' ', $options );
}
public function get_size_option( $default = '' ) {
$option = $this->get_option( 'size', 'int', true );
if ( $option ) {
return $option;
}
$matches_a = $this->get_all_match_options( '%^([0-9]*)/[0-9]*$%' );
foreach ( (array) $matches_a as $matches ) {
if ( isset( $matches[1] )
and '' !== $matches[1] ) {
return $matches[1];
}
}
return $default;
}
public function get_maxlength_option( $default = '' ) {
$option = $this->get_option( 'maxlength', 'int', true );
if ( $option ) {
return $option;
}
$matches_a = $this->get_all_match_options(
'%^(?:[0-9]*x?[0-9]*)?/([0-9]+)$%' );
foreach ( (array) $matches_a as $matches ) {
if ( isset( $matches[1] ) && '' !== $matches[1] ) {
return $matches[1];
}
}
return $default;
}
public function get_minlength_option( $default = '' ) {
$option = $this->get_option( 'minlength', 'int', true );
if ( $option ) {
return $option;
} else {
return $default;
}
}
public function get_cols_option( $default = '' ) {
$option = $this->get_option( 'cols', 'int', true );
if ( $option ) {
return $option;
}
$matches_a = $this->get_all_match_options(
'%^([0-9]*)x([0-9]*)(?:/[0-9]+)?$%' );
foreach ( (array) $matches_a as $matches ) {
if ( isset( $matches[1] ) && '' !== $matches[1] ) {
return $matches[1];
}
}
return $default;
}
public function get_rows_option( $default = '' ) {
$option = $this->get_option( 'rows', 'int', true );
if ( $option ) {
return $option;
}
$matches_a = $this->get_all_match_options(
'%^([0-9]*)x([0-9]*)(?:/[0-9]+)?$%' );
foreach ( (array) $matches_a as $matches ) {
if ( isset( $matches[2] )
and '' !== $matches[2] ) {
return $matches[2];
}
}
return $default;
}
public function get_date_option( $opt ) {
$option = $this->get_option( $opt, 'date', true );
if ( preg_match( '/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/', $option ) ) {
return $option;
}
if ( preg_match( '/^today(?:([+-][0-9]+)([a-z]*))?/', $option, $matches ) ) {
$number = isset( $matches[1] ) ? (int) $matches[1] : 0;
$unit = isset( $matches[2] ) ? $matches[2] : '';
if ( ! preg_match( '/^(day|month|year|week)s?$/', $unit ) ) {
$unit = 'days';
}
$date = gmdate( 'Y-m-d',
strtotime( sprintf( 'today %1$s %2$s', $number, $unit ) ) );
return $date;
}
return false;
}
public function get_default_option( $default = '', $args = '' ) {
$args = wp_parse_args( $args, array(
'multiple' => false,
'shifted' => false,
) );
$options = (array) $this->get_option( 'default' );
$values = array();
if ( empty( $options ) ) {
return $args['multiple'] ? $values : $default;
}
foreach ( $options as $opt ) {
$opt = sanitize_key( $opt );
if ( 'user_' == substr( $opt, 0, 5 )
and is_user_logged_in() ) {
$primary_props = array( 'user_login', 'user_email', 'user_url' );
$opt = in_array( $opt, $primary_props ) ? $opt : substr( $opt, 5 );
$user = wp_get_current_user();
$user_prop = $user->get( $opt );
if ( ! empty( $user_prop ) ) {
if ( $args['multiple'] ) {
$values[] = $user_prop;
} else {
return $user_prop;
}
}
} elseif ( 'post_meta' == $opt and in_the_loop() ) {
if ( $args['multiple'] ) {
$values = array_merge( $values,
get_post_meta( get_the_ID(), $this->name ) );
} else {
$val = (string) get_post_meta( get_the_ID(), $this->name, true );
if ( strlen( $val ) ) {
return $val;
}
}
} elseif ( 'get' == $opt and isset( $_GET[$this->name] ) ) {
$vals = (array) $_GET[$this->name];
$vals = array_map( 'wpcf7_sanitize_query_var', $vals );
if ( $args['multiple'] ) {
$values = array_merge( $values, $vals );
} else {
$val = isset( $vals[0] ) ? (string) $vals[0] : '';
if ( strlen( $val ) ) {
return $val;
}
}
} elseif ( 'post' == $opt and isset( $_POST[$this->name] ) ) {
$vals = (array) $_POST[$this->name];
$vals = array_map( 'wpcf7_sanitize_query_var', $vals );
if ( $args['multiple'] ) {
$values = array_merge( $values, $vals );
} else {
$val = isset( $vals[0] ) ? (string) $vals[0] : '';
if ( strlen( $val ) ) {
return $val;
}
}
} elseif ( 'shortcode_attr' == $opt ) {
if ( $contact_form = WPCF7_ContactForm::get_current() ) {
$val = $contact_form->shortcode_attr( $this->name );
if ( strlen( $val ) ) {
if ( $args['multiple'] ) {
$values[] = $val;
} else {
return $val;
}
}
}
} elseif ( preg_match( '/^[0-9_]+$/', $opt ) ) {
$nums = explode( '_', $opt );
foreach ( $nums as $num ) {
$num = absint( $num );
$num = $args['shifted'] ? $num : $num - 1;
if ( isset( $this->values[$num] ) ) {
if ( $args['multiple'] ) {
$values[] = $this->values[$num];
} else {
return $this->values[$num];
}
}
}
}
}
if ( $args['multiple'] ) {
$values = array_unique( $values );
return $values;
} else {
return $default;
}
}
public function get_data_option( $args = '' ) {
$options = (array) $this->get_option( 'data' );
return apply_filters( 'wpcf7_form_tag_data_option', null, $options, $args );
}
public function get_first_match_option( $pattern ) {
foreach( (array) $this->options as $option ) {
if ( preg_match( $pattern, $option, $matches ) ) {
return $matches;
}
}
return false;
}
public function get_all_match_options( $pattern ) {
$result = array();
foreach( (array) $this->options as $option ) {
if ( preg_match( $pattern, $option, $matches ) ) {
$result[] = $matches;
}
}
return $result;
}
public function offsetSet( $offset, $value ) {
if ( property_exists( __CLASS__, $offset ) ) {
$this->{$offset} = $value;
}
}
public function offsetGet( $offset ) {
if ( property_exists( __CLASS__, $offset ) ) {
return $this->{$offset};
}
return null;
}
public function offsetExists( $offset ) {
return property_exists( __CLASS__, $offset );
}
public function offsetUnset( $offset ) {
}
}

View File

@ -0,0 +1,368 @@
<?php
function wpcf7_add_form_tag( $tag, $func, $features = '' ) {
$manager = WPCF7_FormTagsManager::get_instance();
return $manager->add( $tag, $func, $features );
}
function wpcf7_remove_form_tag( $tag ) {
$manager = WPCF7_FormTagsManager::get_instance();
return $manager->remove( $tag );
}
function wpcf7_replace_all_form_tags( $content ) {
$manager = WPCF7_FormTagsManager::get_instance();
return $manager->replace_all( $content );
}
function wpcf7_scan_form_tags( $cond = null ) {
$contact_form = WPCF7_ContactForm::get_current();
if ( $contact_form ) {
return $contact_form->scan_form_tags( $cond );
}
return array();
}
function wpcf7_form_tag_supports( $tag, $feature ) {
$manager = WPCF7_FormTagsManager::get_instance();
return $manager->tag_type_supports( $tag, $feature );
}
class WPCF7_FormTagsManager {
private static $instance;
private $tag_types = array();
private $scanned_tags = null; // Tags scanned at the last time of scan()
private function __construct() {}
public static function get_instance() {
if ( empty( self::$instance ) ) {
self::$instance = new self;
}
return self::$instance;
}
public function get_scanned_tags() {
return $this->scanned_tags;
}
public function add( $tag, $func, $features = '' ) {
if ( ! is_callable( $func ) ) {
return;
}
if ( true === $features ) { // for back-compat
$features = array( 'name-attr' => true );
}
$features = wp_parse_args( $features, array() );
$tags = array_filter( array_unique( (array) $tag ) );
foreach ( $tags as $tag ) {
$tag = $this->sanitize_tag_type( $tag );
if ( ! $this->tag_type_exists( $tag ) ) {
$this->tag_types[$tag] = array(
'function' => $func,
'features' => $features,
);
}
}
}
public function tag_type_exists( $tag ) {
return isset( $this->tag_types[$tag] );
}
public function tag_type_supports( $tag, $feature ) {
$feature = array_filter( (array) $feature );
if ( isset( $this->tag_types[$tag]['features'] ) ) {
return (bool) array_intersect(
array_keys( array_filter( $this->tag_types[$tag]['features'] ) ),
$feature );
}
return false;
}
public function collect_tag_types( $feature = null, $invert = false ) {
$tag_types = array_keys( $this->tag_types );
if ( empty( $feature ) ) {
return $tag_types;
}
$output = array();
foreach ( $tag_types as $tag ) {
if ( ! $invert && $this->tag_type_supports( $tag, $feature )
|| $invert && ! $this->tag_type_supports( $tag, $feature ) ) {
$output[] = $tag;
}
}
return $output;
}
private function sanitize_tag_type( $tag ) {
$tag = preg_replace( '/[^a-zA-Z0-9_*]+/', '_', $tag );
$tag = rtrim( $tag, '_' );
$tag = strtolower( $tag );
return $tag;
}
public function remove( $tag ) {
unset( $this->tag_types[$tag] );
}
public function normalize( $content ) {
if ( empty( $this->tag_types ) ) {
return $content;
}
$content = preg_replace_callback(
'/' . $this->tag_regex() . '/s',
array( $this, 'normalize_callback' ),
$content );
return $content;
}
private function normalize_callback( $m ) {
// allow [[foo]] syntax for escaping a tag
if ( $m[1] == '['
and $m[6] == ']' ) {
return $m[0];
}
$tag = $m[2];
$attr = trim( preg_replace( '/[\r\n\t ]+/', ' ', $m[3] ) );
$attr = strtr( $attr, array( '<' => '&lt;', '>' => '&gt;' ) );
$content = trim( $m[5] );
$content = str_replace( "\n", '<WPPreserveNewline />', $content );
$result = $m[1] . '[' . $tag
. ( $attr ? ' ' . $attr : '' )
. ( $m[4] ? ' ' . $m[4] : '' )
. ']'
. ( $content ? $content . '[/' . $tag . ']' : '' )
. $m[6];
return $result;
}
public function replace_all( $content ) {
return $this->scan( $content, true );
}
public function scan( $content, $replace = false ) {
$this->scanned_tags = array();
if ( empty( $this->tag_types ) ) {
if ( $replace ) {
return $content;
} else {
return $this->scanned_tags;
}
}
if ( $replace ) {
$content = preg_replace_callback(
'/' . $this->tag_regex() . '/s',
array( $this, 'replace_callback' ),
$content );
return $content;
} else {
preg_replace_callback(
'/' . $this->tag_regex() . '/s',
array( $this, 'scan_callback' ),
$content );
return $this->scanned_tags;
}
}
public function filter( $input, $cond ) {
if ( is_array( $input ) ) {
$tags = $input;
} elseif ( is_string( $input ) ) {
$tags = $this->scan( $input );
} else {
$tags = $this->scanned_tags;
}
if ( empty( $tags ) ) {
return array();
}
$cond = wp_parse_args( $cond, array(
'type' => array(),
'name' => array(),
'feature' => '',
) );
$type = array_filter( (array) $cond['type'] );
$name = array_filter( (array) $cond['name'] );
$feature = is_string( $cond['feature'] ) ? trim( $cond['feature'] ) : '';
if ( '!' == substr( $feature, 0, 1 ) ) {
$feature_negative = true;
$feature = trim( substr( $feature, 1 ) );
} else {
$feature_negative = false;
}
$output = array();
foreach ( $tags as $tag ) {
$tag = new WPCF7_FormTag( $tag );
if ( $type and ! in_array( $tag->type, $type, true ) ) {
continue;
}
if ( $name and ! in_array( $tag->name, $name, true ) ) {
continue;
}
if ( $feature ) {
if ( ! $this->tag_type_supports( $tag->type, $feature )
and ! $feature_negative ) {
continue;
} elseif ( $this->tag_type_supports( $tag->type, $feature )
and $feature_negative ) {
continue;
}
}
$output[] = $tag;
}
return $output;
}
private function tag_regex() {
$tagnames = array_keys( $this->tag_types );
$tagregexp = join( '|', array_map( 'preg_quote', $tagnames ) );
return '(\[?)'
. '\[(' . $tagregexp . ')(?:[\r\n\t ](.*?))?(?:[\r\n\t ](\/))?\]'
. '(?:([^[]*?)\[\/\2\])?'
. '(\]?)';
}
private function replace_callback( $m ) {
return $this->scan_callback( $m, true );
}
private function scan_callback( $m, $replace = false ) {
// allow [[foo]] syntax for escaping a tag
if ( $m[1] == '['
and $m[6] == ']' ) {
return substr( $m[0], 1, -1 );
}
$tag = $m[2];
$attr = $this->parse_atts( $m[3] );
$scanned_tag = array(
'type' => $tag,
'basetype' => trim( $tag, '*' ),
'name' => '',
'options' => array(),
'raw_values' => array(),
'values' => array(),
'pipes' => null,
'labels' => array(),
'attr' => '',
'content' => '',
);
if ( is_array( $attr ) ) {
if ( is_array( $attr['options'] ) ) {
if ( $this->tag_type_supports( $tag, 'name-attr' )
and ! empty( $attr['options'] ) ) {
$scanned_tag['name'] = array_shift( $attr['options'] );
if ( ! wpcf7_is_name( $scanned_tag['name'] ) ) {
return $m[0]; // Invalid name is used. Ignore this tag.
}
}
$scanned_tag['options'] = (array) $attr['options'];
}
$scanned_tag['raw_values'] = (array) $attr['values'];
if ( WPCF7_USE_PIPE ) {
$pipes = new WPCF7_Pipes( $scanned_tag['raw_values'] );
$scanned_tag['values'] = $pipes->collect_befores();
$scanned_tag['pipes'] = $pipes;
} else {
$scanned_tag['values'] = $scanned_tag['raw_values'];
}
$scanned_tag['labels'] = $scanned_tag['values'];
} else {
$scanned_tag['attr'] = $attr;
}
$scanned_tag['values'] = array_map( 'trim', $scanned_tag['values'] );
$scanned_tag['labels'] = array_map( 'trim', $scanned_tag['labels'] );
$content = trim( $m[5] );
$content = preg_replace( "/<br[\r\n\t ]*\/?>$/m", '', $content );
$scanned_tag['content'] = $content;
$scanned_tag = apply_filters( 'wpcf7_form_tag', $scanned_tag, $replace );
$scanned_tag = new WPCF7_FormTag( $scanned_tag );
$this->scanned_tags[] = $scanned_tag;
if ( $replace ) {
$func = $this->tag_types[$tag]['function'];
return $m[1] . call_user_func( $func, $scanned_tag ) . $m[6];
} else {
return $m[0];
}
}
private function parse_atts( $text ) {
$atts = array( 'options' => array(), 'values' => array() );
$text = preg_replace( "/[\x{00a0}\x{200b}]+/u", " ", $text );
$text = stripcslashes( trim( $text ) );
$pattern = '%^([-+*=0-9a-zA-Z:.!?#$&@_/|\%\r\n\t ]*?)((?:[\r\n\t ]*"[^"]*"|[\r\n\t ]*\'[^\']*\')*)$%';
if ( preg_match( $pattern, $text, $match ) ) {
if ( ! empty( $match[1] ) ) {
$atts['options'] = preg_split( '/[\r\n\t ]+/', trim( $match[1] ) );
}
if ( ! empty( $match[2] ) ) {
preg_match_all( '/"[^"]*"|\'[^\']*\'/', $match[2], $matched_values );
$atts['values'] = wpcf7_strip_quote_deep( $matched_values[0] );
}
} else {
$atts = $text;
}
return $atts;
}
}

View File

@ -0,0 +1,381 @@
<?php
function wpcf7_autop( $pee, $br = 1 ) {
if ( trim( $pee ) === '' ) {
return '';
}
$pee = $pee . "\n"; // just to make things a little easier, pad the end
$pee = preg_replace( '|<br />\s*<br />|', "\n\n", $pee );
// Space things out a little
/* wpcf7: remove select and input */
$allblocks = '(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|form|map|area|blockquote|address|math|style|p|h[1-6]|hr|fieldset|legend|section|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary)';
$pee = preg_replace( '!(<' . $allblocks . '[^>]*>)!', "\n$1", $pee );
$pee = preg_replace( '!(</' . $allblocks . '>)!', "$1\n\n", $pee );
/* wpcf7: take care of [response], [recaptcha], and [hidden] tags */
$form_tags_manager = WPCF7_FormTagsManager::get_instance();
$block_hidden_form_tags = $form_tags_manager->collect_tag_types(
array( 'display-block', 'display-hidden' ) );
$block_hidden_form_tags = sprintf( '(?:%s)',
implode( '|', $block_hidden_form_tags ) );
$pee = preg_replace( '!(\[' . $block_hidden_form_tags . '[^]]*\])!',
"\n$1\n\n", $pee );
$pee = str_replace( array( "\r\n", "\r" ), "\n", $pee ); // cross-platform newlines
if ( strpos( $pee, '<object' ) !== false ) {
$pee = preg_replace( '|\s*<param([^>]*)>\s*|', "<param$1>", $pee ); // no pee inside object/embed
$pee = preg_replace( '|\s*</embed>\s*|', '</embed>', $pee );
}
$pee = preg_replace( "/\n\n+/", "\n\n", $pee ); // take care of duplicates
// make paragraphs, including one at the end
$pees = preg_split( '/\n\s*\n/', $pee, -1, PREG_SPLIT_NO_EMPTY );
$pee = '';
foreach ( $pees as $tinkle ) {
$pee .= '<p>' . trim( $tinkle, "\n" ) . "</p>\n";
}
$pee = preg_replace( '|<p>\s*</p>|', '', $pee ); // under certain strange conditions it could create a P of entirely whitespace
$pee = preg_replace( '!<p>([^<]+)</(div|address|form|fieldset)>!', "<p>$1</p></$2>", $pee );
$pee = preg_replace( '!<p>\s*(</?' . $allblocks . '[^>]*>)\s*</p>!', "$1", $pee ); // don't pee all over a tag
$pee = preg_replace( "|<p>(<li.+?)</p>|", "$1", $pee ); // problem with nested lists
$pee = preg_replace( '|<p><blockquote([^>]*)>|i', "<blockquote$1><p>", $pee );
$pee = str_replace( '</blockquote></p>', '</p></blockquote>', $pee );
$pee = preg_replace( '!<p>\s*(</?' . $allblocks . '[^>]*>)!', "$1", $pee );
$pee = preg_replace( '!(</?' . $allblocks . '[^>]*>)\s*</p>!', "$1", $pee );
/* wpcf7: take care of [response], [recaptcha], and [hidden] tag */
$pee = preg_replace( '!<p>\s*(\[' . $block_hidden_form_tags . '[^]]*\])!',
"$1", $pee );
$pee = preg_replace( '!(\[' . $block_hidden_form_tags . '[^]]*\])\s*</p>!',
"$1", $pee );
if ( $br ) {
/* wpcf7: add textarea */
$pee = preg_replace_callback(
'/<(script|style|textarea).*?<\/\\1>/s',
'wpcf7_autop_preserve_newline_callback', $pee );
$pee = preg_replace( '|(?<!<br />)\s*\n|', "<br />\n", $pee ); // optionally make line breaks
$pee = str_replace( '<WPPreserveNewline />', "\n", $pee );
/* wpcf7: remove extra <br /> just added before [response], [recaptcha], and [hidden] tags */
$pee = preg_replace( '!<br />\n(\[' . $block_hidden_form_tags . '[^]]*\])!',
"\n$1", $pee );
}
$pee = preg_replace( '!(</?' . $allblocks . '[^>]*>)\s*<br />!', "$1", $pee );
$pee = preg_replace( '!<br />(\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)!', '$1', $pee );
if ( strpos( $pee, '<pre' ) !== false ) {
$pee = preg_replace_callback( '!(<pre[^>]*>)(.*?)</pre>!is',
'clean_pre', $pee );
}
$pee = preg_replace( "|\n</p>$|", '</p>', $pee );
return $pee;
}
function wpcf7_autop_preserve_newline_callback( $matches ) {
return str_replace( "\n", '<WPPreserveNewline />', $matches[0] );
}
function wpcf7_sanitize_query_var( $text ) {
$text = wp_unslash( $text );
$text = wp_check_invalid_utf8( $text );
if ( false !== strpos( $text, '<' ) ) {
$text = wp_pre_kses_less_than( $text );
$text = wp_strip_all_tags( $text );
}
$text = preg_replace( '/%[a-f0-9]{2}/i', '', $text );
$text = preg_replace( '/ +/', ' ', $text );
$text = trim( $text, ' ' );
return $text;
}
function wpcf7_strip_quote( $text ) {
$text = trim( $text );
if ( preg_match( '/^"(.*)"$/s', $text, $matches ) ) {
$text = $matches[1];
} elseif ( preg_match( "/^'(.*)'$/s", $text, $matches ) ) {
$text = $matches[1];
}
return $text;
}
function wpcf7_strip_quote_deep( $arr ) {
if ( is_string( $arr ) ) {
return wpcf7_strip_quote( $arr );
}
if ( is_array( $arr ) ) {
$result = array();
foreach ( $arr as $key => $text ) {
$result[$key] = wpcf7_strip_quote_deep( $text );
}
return $result;
}
}
function wpcf7_normalize_newline( $text, $to = "\n" ) {
if ( ! is_string( $text ) ) {
return $text;
}
$nls = array( "\r\n", "\r", "\n" );
if ( ! in_array( $to, $nls ) ) {
return $text;
}
return str_replace( $nls, $to, $text );
}
function wpcf7_normalize_newline_deep( $arr, $to = "\n" ) {
if ( is_array( $arr ) ) {
$result = array();
foreach ( $arr as $key => $text ) {
$result[$key] = wpcf7_normalize_newline_deep( $text, $to );
}
return $result;
}
return wpcf7_normalize_newline( $arr, $to );
}
function wpcf7_strip_newline( $str ) {
$str = (string) $str;
$str = str_replace( array( "\r", "\n" ), '', $str );
return trim( $str );
}
function wpcf7_canonicalize( $text, $strto = 'lower' ) {
if ( function_exists( 'mb_convert_kana' )
and 'UTF-8' == get_option( 'blog_charset' ) ) {
$text = mb_convert_kana( $text, 'asKV', 'UTF-8' );
}
if ( 'lower' == $strto ) {
$text = strtolower( $text );
} elseif ( 'upper' == $strto ) {
$text = strtoupper( $text );
}
$text = trim( $text );
return $text;
}
/**
* Check whether a string is a valid NAME token.
*
* ID and NAME tokens must begin with a letter ([A-Za-z])
* and may be followed by any number of letters, digits ([0-9]),
* hyphens ("-"), underscores ("_"), colons (":"), and periods (".").
*
* @see http://www.w3.org/TR/html401/types.html#h-6.2
*
* @return bool True if it is a valid name, false if not.
*/
function wpcf7_is_name( $string ) {
return preg_match( '/^[A-Za-z][-A-Za-z0-9_:.]*$/', $string );
}
function wpcf7_sanitize_unit_tag( $tag ) {
$tag = preg_replace( '/[^A-Za-z0-9_-]/', '', $tag );
return $tag;
}
function wpcf7_is_email( $email ) {
$result = is_email( $email );
return apply_filters( 'wpcf7_is_email', $result, $email );
}
function wpcf7_is_url( $url ) {
$result = ( false !== filter_var( $url, FILTER_VALIDATE_URL ) );
return apply_filters( 'wpcf7_is_url', $result, $url );
}
function wpcf7_is_tel( $tel ) {
$result = preg_match( '%^[+]?[0-9()/ -]*$%', $tel );
return apply_filters( 'wpcf7_is_tel', $result, $tel );
}
function wpcf7_is_number( $number ) {
$result = is_numeric( $number );
return apply_filters( 'wpcf7_is_number', $result, $number );
}
function wpcf7_is_date( $date ) {
$result = preg_match( '/^([0-9]{4,})-([0-9]{2})-([0-9]{2})$/', $date, $matches );
if ( $result ) {
$result = checkdate( $matches[2], $matches[3], $matches[1] );
}
return apply_filters( 'wpcf7_is_date', $result, $date );
}
function wpcf7_is_mailbox_list( $mailbox_list ) {
if ( ! is_array( $mailbox_list ) ) {
$mailbox_text = (string) $mailbox_list;
$mailbox_text = wp_unslash( $mailbox_text );
$mailbox_text = preg_replace( '/\\\\(?:\"|\')/', 'esc-quote',
$mailbox_text );
$mailbox_text = preg_replace( '/(?:\".*?\"|\'.*?\')/', 'quoted-string',
$mailbox_text );
$mailbox_list = explode( ',', $mailbox_text );
}
$addresses = array();
foreach ( $mailbox_list as $mailbox ) {
if ( ! is_string( $mailbox ) ) {
return false;
}
$mailbox = trim( $mailbox );
if ( preg_match( '/<(.+)>$/', $mailbox, $matches ) ) {
$addr_spec = $matches[1];
} else {
$addr_spec = $mailbox;
}
if ( ! wpcf7_is_email( $addr_spec ) ) {
return false;
}
$addresses[] = $addr_spec;
}
return $addresses;
}
function wpcf7_is_email_in_domain( $email, $domain ) {
$email_list = wpcf7_is_mailbox_list( $email );
$domain = strtolower( $domain );
foreach ( $email_list as $email ) {
$email_domain = substr( $email, strrpos( $email, '@' ) + 1 );
$email_domain = strtolower( $email_domain );
$domain_parts = explode( '.', $domain );
do {
$site_domain = implode( '.', $domain_parts );
if ( $site_domain == $email_domain ) {
continue 2;
}
array_shift( $domain_parts );
} while ( $domain_parts );
return false;
}
return true;
}
function wpcf7_is_email_in_site_domain( $email ) {
if ( wpcf7_is_localhost() ) {
return true;
}
$site_domain = strtolower( $_SERVER['SERVER_NAME'] );
if ( preg_match( '/^[0-9.]+$/', $site_domain ) ) { // 123.456.789.012
return true;
}
if ( wpcf7_is_email_in_domain( $email, $site_domain ) ) {
return true;
}
$home_url = home_url();
// for interoperability with WordPress MU Domain Mapping plugin
if ( is_multisite()
and function_exists( 'domain_mapping_siteurl' ) ) {
$domain_mapping_siteurl = domain_mapping_siteurl( false );
if ( $domain_mapping_siteurl ) {
$home_url = $domain_mapping_siteurl;
}
}
if ( preg_match( '%^https?://([^/]+)%', $home_url, $matches ) ) {
$site_domain = strtolower( $matches[1] );
if ( $site_domain != strtolower( $_SERVER['SERVER_NAME'] )
and wpcf7_is_email_in_domain( $email, $site_domain ) ) {
return true;
}
}
return false;
}
function wpcf7_antiscript_file_name( $filename ) {
$filename = basename( $filename );
$parts = explode( '.', $filename );
if ( count( $parts ) < 2 ) {
return $filename;
}
$script_pattern = '/^(php|phtml|pl|py|rb|cgi|asp|aspx)\d?$/i';
$filename = array_shift( $parts );
$extension = array_pop( $parts );
foreach ( (array) $parts as $part ) {
if ( preg_match( $script_pattern, $part ) ) {
$filename .= '.' . $part . '_';
} else {
$filename .= '.' . $part;
}
}
if ( preg_match( $script_pattern, $extension ) ) {
$filename .= '.' . $extension . '_.txt';
} else {
$filename .= '.' . $extension;
}
return $filename;
}
function wpcf7_mask_password( $text, $length_unmasked = 0 ) {
$length = strlen( $text );
$length_unmasked = absint( $length_unmasked );
if ( 0 == $length_unmasked ) {
if ( 9 < $length ) {
$length_unmasked = 4;
} elseif ( 3 < $length ) {
$length_unmasked = 2;
} else {
$length_unmasked = $length;
}
}
$text = substr( $text, 0 - $length_unmasked );
$text = str_pad( $text, $length, '*', STR_PAD_LEFT );
return $text;
}

View File

@ -0,0 +1,433 @@
<?php
function wpcf7_plugin_path( $path = '' ) {
return path_join( WPCF7_PLUGIN_DIR, trim( $path, '/' ) );
}
function wpcf7_plugin_url( $path = '' ) {
$url = plugins_url( $path, WPCF7_PLUGIN );
if ( is_ssl()
and 'http:' == substr( $url, 0, 5 ) ) {
$url = 'https:' . substr( $url, 5 );
}
return $url;
}
function wpcf7_upload_dir( $type = false ) {
$uploads = wp_get_upload_dir();
$uploads = apply_filters( 'wpcf7_upload_dir', array(
'dir' => $uploads['basedir'],
'url' => $uploads['baseurl'],
) );
if ( 'dir' == $type ) {
return $uploads['dir'];
} if ( 'url' == $type ) {
return $uploads['url'];
}
return $uploads;
}
function wpcf7_verify_nonce( $nonce, $action = 'wp_rest' ) {
return wp_verify_nonce( $nonce, $action );
}
function wpcf7_create_nonce( $action = 'wp_rest' ) {
return wp_create_nonce( $action );
}
function wpcf7_blacklist_check( $target ) {
$mod_keys = trim( get_option( 'blacklist_keys' ) );
if ( empty( $mod_keys ) ) {
return false;
}
$words = explode( "\n", $mod_keys );
foreach ( (array) $words as $word ) {
$word = trim( $word );
if ( empty( $word )
or 256 < strlen( $word ) ) {
continue;
}
$pattern = sprintf( '#%s#i', preg_quote( $word, '#' ) );
if ( preg_match( $pattern, $target ) ) {
return true;
}
}
return false;
}
function wpcf7_array_flatten( $input ) {
if ( ! is_array( $input ) ) {
return array( $input );
}
$output = array();
foreach ( $input as $value ) {
$output = array_merge( $output, wpcf7_array_flatten( $value ) );
}
return $output;
}
function wpcf7_flat_join( $input ) {
$input = wpcf7_array_flatten( $input );
$output = array();
foreach ( (array) $input as $value ) {
$output[] = trim( (string) $value );
}
return implode( ', ', $output );
}
function wpcf7_support_html5() {
return (bool) apply_filters( 'wpcf7_support_html5', true );
}
function wpcf7_support_html5_fallback() {
return (bool) apply_filters( 'wpcf7_support_html5_fallback', false );
}
function wpcf7_use_really_simple_captcha() {
return apply_filters( 'wpcf7_use_really_simple_captcha',
WPCF7_USE_REALLY_SIMPLE_CAPTCHA );
}
function wpcf7_validate_configuration() {
return apply_filters( 'wpcf7_validate_configuration',
WPCF7_VALIDATE_CONFIGURATION );
}
function wpcf7_autop_or_not() {
return (bool) apply_filters( 'wpcf7_autop_or_not', WPCF7_AUTOP );
}
function wpcf7_load_js() {
return apply_filters( 'wpcf7_load_js', WPCF7_LOAD_JS );
}
function wpcf7_load_css() {
return apply_filters( 'wpcf7_load_css', WPCF7_LOAD_CSS );
}
function wpcf7_format_atts( $atts ) {
$html = '';
$prioritized_atts = array( 'type', 'name', 'value' );
foreach ( $prioritized_atts as $att ) {
if ( isset( $atts[$att] ) ) {
$value = trim( $atts[$att] );
$html .= sprintf( ' %s="%s"', $att, esc_attr( $value ) );
unset( $atts[$att] );
}
}
foreach ( $atts as $key => $value ) {
$key = strtolower( trim( $key ) );
if ( ! preg_match( '/^[a-z_:][a-z_:.0-9-]*$/', $key ) ) {
continue;
}
$value = trim( $value );
if ( '' !== $value ) {
$html .= sprintf( ' %s="%s"', $key, esc_attr( $value ) );
}
}
$html = trim( $html );
return $html;
}
function wpcf7_link( $url, $anchor_text, $args = '' ) {
$defaults = array(
'id' => '',
'class' => '',
);
$args = wp_parse_args( $args, $defaults );
$args = array_intersect_key( $args, $defaults );
$atts = wpcf7_format_atts( $args );
$link = sprintf( '<a href="%1$s"%3$s>%2$s</a>',
esc_url( $url ),
esc_html( $anchor_text ),
$atts ? ( ' ' . $atts ) : '' );
return $link;
}
function wpcf7_get_request_uri() {
static $request_uri = '';
if ( empty( $request_uri ) ) {
$request_uri = add_query_arg( array() );
}
return esc_url_raw( $request_uri );
}
function wpcf7_register_post_types() {
if ( class_exists( 'WPCF7_ContactForm' ) ) {
WPCF7_ContactForm::register_post_type();
return true;
} else {
return false;
}
}
function wpcf7_version( $args = '' ) {
$defaults = array(
'limit' => -1,
'only_major' => false,
);
$args = wp_parse_args( $args, $defaults );
if ( $args['only_major'] ) {
$args['limit'] = 2;
}
$args['limit'] = (int) $args['limit'];
$ver = WPCF7_VERSION;
$ver = strtr( $ver, '_-+', '...' );
$ver = preg_replace( '/[^0-9.]+/', ".$0.", $ver );
$ver = preg_replace( '/[.]+/', ".", $ver );
$ver = trim( $ver, '.' );
$ver = explode( '.', $ver );
if ( -1 < $args['limit'] ) {
$ver = array_slice( $ver, 0, $args['limit'] );
}
$ver = implode( '.', $ver );
return $ver;
}
function wpcf7_version_grep( $version, array $input ) {
$pattern = '/^' . preg_quote( (string) $version, '/' ) . '(?:\.|$)/';
return preg_grep( $pattern, $input );
}
function wpcf7_enctype_value( $enctype ) {
$enctype = trim( $enctype );
if ( empty( $enctype ) ) {
return '';
}
$valid_enctypes = array(
'application/x-www-form-urlencoded',
'multipart/form-data',
'text/plain',
);
if ( in_array( $enctype, $valid_enctypes ) ) {
return $enctype;
}
$pattern = '%^enctype="(' . implode( '|', $valid_enctypes ) . ')"$%';
if ( preg_match( $pattern, $enctype, $matches ) ) {
return $matches[1]; // for back-compat
}
return '';
}
function wpcf7_rmdir_p( $dir ) {
if ( is_file( $dir ) ) {
$file = $dir;
if ( @unlink( $file ) ) {
return true;
}
$stat = stat( $file );
if ( @chmod( $file, $stat['mode'] | 0200 ) ) { // add write for owner
if ( @unlink( $file ) ) {
return true;
}
@chmod( $file, $stat['mode'] );
}
return false;
}
if ( ! is_dir( $dir ) ) {
return false;
}
if ( $handle = opendir( $dir ) ) {
while ( false !== ( $file = readdir( $handle ) ) ) {
if ( $file == "."
or $file == ".." ) {
continue;
}
wpcf7_rmdir_p( path_join( $dir, $file ) );
}
closedir( $handle );
}
if ( false !== ( $files = scandir( $dir ) )
and ! array_diff( $files, array( '.', '..' ) ) ) {
return rmdir( $dir );
}
return false;
}
/* From _http_build_query in wp-includes/functions.php */
function wpcf7_build_query( $args, $key = '' ) {
$sep = '&';
$ret = array();
foreach ( (array) $args as $k => $v ) {
$k = urlencode( $k );
if ( ! empty( $key ) ) {
$k = $key . '%5B' . $k . '%5D';
}
if ( null === $v ) {
continue;
} elseif ( false === $v ) {
$v = '0';
}
if ( is_array( $v ) or is_object( $v ) ) {
array_push( $ret, wpcf7_build_query( $v, $k ) );
} else {
array_push( $ret, $k . '=' . urlencode( $v ) );
}
}
return implode( $sep, $ret );
}
/**
* Returns the number of code units in a string.
*
* @see http://www.w3.org/TR/html5/infrastructure.html#code-unit-length
*
* @return int|bool The number of code units, or false if mb_convert_encoding is not available.
*/
function wpcf7_count_code_units( $string ) {
static $use_mb = null;
if ( is_null( $use_mb ) ) {
$use_mb = function_exists( 'mb_convert_encoding' );
}
if ( ! $use_mb ) {
return false;
}
$string = (string) $string;
$string = str_replace( "\r\n", "\n", $string );
$encoding = mb_detect_encoding( $string, mb_detect_order(), true );
if ( $encoding ) {
$string = mb_convert_encoding( $string, 'UTF-16', $encoding );
} else {
$string = mb_convert_encoding( $string, 'UTF-16', 'UTF-8' );
}
$byte_count = mb_strlen( $string, '8bit' );
return floor( $byte_count / 2 );
}
function wpcf7_is_localhost() {
$server_name = strtolower( $_SERVER['SERVER_NAME'] );
return in_array( $server_name, array( 'localhost', '127.0.0.1' ) );
}
function wpcf7_deprecated_function( $function, $version, $replacement ) {
$trigger_error = apply_filters( 'deprecated_function_trigger_error', true );
if ( WP_DEBUG and $trigger_error ) {
if ( function_exists( '__' ) ) {
trigger_error( sprintf( __( '%1$s is <strong>deprecated</strong> since Contact Form 7 version %2$s! Use %3$s instead.', 'contact-form-7' ), $function, $version, $replacement ) );
} else {
trigger_error( sprintf( '%1$s is <strong>deprecated</strong> since Contact Form 7 version %2$s! Use %3$s instead.', $function, $version, $replacement ) );
}
}
}
function wpcf7_log_remote_request( $url, $request, $response ) {
$log = sprintf(
/* translators: 1: response code, 2: response message, 3: URL */
__( 'HTTP Response: %1$s %2$s from %3$s', 'contact-form-7' ),
(int) wp_remote_retrieve_response_code( $response ),
wp_remote_retrieve_response_message( $response ),
$url
);
$log = apply_filters( 'wpcf7_log_remote_request',
$log, $url, $request, $response
);
if ( $log ) {
trigger_error( $log );
}
}
function wpcf7_anonymize_ip_addr( $ip_addr ) {
if ( ! function_exists( 'inet_ntop' )
or ! function_exists( 'inet_pton' ) ) {
return $ip_addr;
}
$packed = inet_pton( $ip_addr );
if ( false === $packed ) {
return $ip_addr;
}
if ( 4 == strlen( $packed ) ) { // IPv4
$mask = '255.255.255.0';
} elseif ( 16 == strlen( $packed ) ) { // IPv6
$mask = 'ffff:ffff:ffff:0000:0000:0000:0000:0000';
} else {
return $ip_addr;
}
return inet_ntop( $packed & inet_pton( $mask ) );
}
function wpcf7_is_file_path_in_content_dir( $path ) {
if ( 0 === strpos( realpath( $path ), realpath( WP_CONTENT_DIR ) ) ) {
return true;
}
if ( defined( 'UPLOADS' )
and 0 === strpos( realpath( $path ), realpath( ABSPATH . UPLOADS ) ) ) {
return true;
}
return false;
}

View File

@ -0,0 +1,321 @@
<?php
class WPCF7_Integration {
private static $instance;
private $services = array();
private $categories = array();
private function __construct() {}
public static function get_instance() {
if ( empty( self::$instance ) ) {
self::$instance = new self;
}
return self::$instance;
}
public function add_service( $name, WPCF7_Service $service ) {
$name = sanitize_key( $name );
if ( empty( $name )
or isset( $this->services[$name] ) ) {
return false;
}
$this->services[$name] = $service;
}
public function add_category( $name, $title ) {
$name = sanitize_key( $name );
if ( empty( $name )
or isset( $this->categories[$name] ) ) {
return false;
}
$this->categories[$name] = $title;
}
public function service_exists( $name = '' ) {
if ( '' == $name ) {
return (bool) count( $this->services );
} else {
return isset( $this->services[$name] );
}
}
public function get_service( $name ) {
if ( $this->service_exists( $name ) ) {
return $this->services[$name];
} else {
return false;
}
}
public function list_services( $args = '' ) {
$args = wp_parse_args( $args, array(
'include' => array(),
) );
$singular = false;
$services = (array) $this->services;
if ( ! empty( $args['include'] ) ) {
$services = array_intersect_key( $services,
array_flip( (array) $args['include'] ) );
if ( 1 == count( $services ) ) {
$singular = true;
}
}
if ( empty( $services ) ) {
return;
}
$action = wpcf7_current_action();
foreach ( $services as $name => $service ) {
$cats = array_intersect_key( $this->categories,
array_flip( $service->get_categories() ) );
?>
<div class="card<?php echo $service->is_active() ? ' active' : ''; ?>" id="<?php echo esc_attr( $name ); ?>">
<?php $service->icon(); ?>
<h2 class="title"><?php echo esc_html( $service->get_title() ); ?></h2>
<div class="infobox">
<?php echo esc_html( implode( ', ', $cats ) ); ?>
<br />
<?php $service->link(); ?>
</div>
<br class="clear" />
<div class="inside">
<?php
if ( $singular ) {
$service->display( $action );
} else {
$service->display();
}
?>
</div>
</div>
<?php
}
}
}
abstract class WPCF7_Service {
abstract public function get_title();
abstract public function is_active();
public function get_categories() {
return array();
}
public function icon() {
return '';
}
public function link() {
return '';
}
public function load( $action = '' ) {
}
public function display( $action = '' ) {
}
public function admin_notice( $message = '' ) {
}
}
class WPCF7_Service_OAuth2 extends WPCF7_Service {
protected $client_id = '';
protected $client_secret = '';
protected $access_token = '';
protected $refresh_token = '';
protected $authorization_endpoint = 'https://example.com/authorization';
protected $token_endpoint = 'https://example.com/token';
public function get_title() {
return '';
}
public function is_active() {
return ! empty( $this->access_token );
}
protected function save_data() {
}
protected function reset_data() {
}
protected function get_redirect_uri() {
return admin_url();
}
protected function menu_page_url( $args = '' ) {
return menu_page_url( 'wpcf7-integration', false );
}
public function load( $action = '' ) {
if ( 'auth_redirect' == $action ) {
$code = isset( $_GET['code'] ) ? $_GET['code'] : '';
if ( $code ) {
$this->request_token( $code );
}
wp_safe_redirect( $this->menu_page_url( 'action=setup' ) );
exit();
}
}
protected function authorize( $scope = '' ) {
$endpoint = add_query_arg(
array(
'response_type' => 'code',
'client_id' => $this->client_id,
'redirect_uri' => urlencode( $this->get_redirect_uri() ),
'scope' => $scope,
),
$this->authorization_endpoint
);
if ( wp_redirect( esc_url_raw( $endpoint ) ) ) {
exit();
}
}
protected function get_http_authorization_header( $scheme = 'basic' ) {
$scheme = strtolower( trim( $scheme ) );
switch ( $scheme ) {
case 'bearer':
return sprintf( 'Bearer %s', $this->access_token );
case 'basic':
default:
return sprintf( 'Basic %s',
base64_encode( $this->client_id . ':' . $this->client_secret )
);
}
}
protected function request_token( $authorization_code ) {
$endpoint = add_query_arg(
array(
'code' => $authorization_code,
'redirect_uri' => urlencode( $this->get_redirect_uri() ),
'grant_type' => 'authorization_code',
),
$this->token_endpoint
);
$request = array(
'headers' => array(
'Authorization' => $this->get_http_authorization_header( 'basic' ),
),
);
$response = wp_remote_post( esc_url_raw( $endpoint ), $request );
if ( WP_DEBUG
and 400 <= (int) wp_remote_retrieve_response_code( $response ) ) {
$this->log( $endpoint, $request, $response );
}
$response_body = wp_remote_retrieve_body( $response );
if ( empty( $response_body ) ) {
return $response;
}
$response_body = json_decode( $response_body, true );
$this->access_token = isset( $response_body['access_token'] )
? $response_body['access_token'] : null;
$this->refresh_token = isset( $response_body['refresh_token'] )
? $response_body['refresh_token'] : null;
$this->save_data();
return $response;
}
protected function refresh_token() {
$endpoint = add_query_arg(
array(
'refresh_token' => $this->refresh_token,
'grant_type' => 'refresh_token',
),
$this->token_endpoint
);
$request = array(
'headers' => array(
'Authorization' => $this->get_http_authorization_header( 'basic' ),
),
);
$response = wp_remote_post( esc_url_raw( $endpoint ), $request );
if ( WP_DEBUG
and 400 <= (int) wp_remote_retrieve_response_code( $response ) ) {
$this->log( $endpoint, $request, $response );
}
$response_body = wp_remote_retrieve_body( $response );
if ( empty( $response_body ) ) {
return $response;
}
$response_body = json_decode( $response_body, true );
$this->access_token = isset( $response_body['access_token'] )
? $response_body['access_token'] : null;
$this->refresh_token = isset( $response_body['refresh_token'] )
? $response_body['refresh_token'] : null;
$this->save_data();
return $response;
}
protected function remote_request( $url, $args = array() ) {
$request = $args = wp_parse_args( $args, array(
'refresh_token' => true,
) );
unset( $request['refresh_token'] );
$response = wp_remote_request( esc_url_raw( $url ), $request );
if ( 401 === wp_remote_retrieve_response_code( $response )
and $args['refresh_token'] ) {
$this->refresh_token();
$response = $this->remote_request( $url,
array_merge( $args, array( 'refresh_token' => false ) )
);
}
return $response;
}
protected function log( $url, $request, $response ) {
wpcf7_log_remote_request( $url, $request, $response );
}
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,410 @@
/*!
* jQuery UI CSS Framework 1.11.4
* http://jqueryui.com
*
* Copyright jQuery Foundation and other contributors
* Released under the MIT license.
* http://jquery.org/license
*
* http://api.jqueryui.com/category/theming/
*
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
*/
/* Component containers
----------------------------------*/
.ui-widget {
font-family: Verdana,Arial,sans-serif;
font-size: 1.1em;
}
.ui-widget .ui-widget {
font-size: 1em;
}
.ui-widget input,
.ui-widget select,
.ui-widget textarea,
.ui-widget button {
font-family: Verdana,Arial,sans-serif;
font-size: 1em;
}
.ui-widget-content {
border: 1px solid #aaaaaa;
background: #ffffff url("images/ui-bg_flat_75_ffffff_40x100.png") 50% 50% repeat-x;
color: #222222;
}
.ui-widget-content a {
color: #222222;
}
.ui-widget-header {
border: 1px solid #aaaaaa;
background: #cccccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;
color: #222222;
font-weight: bold;
}
.ui-widget-header a {
color: #222222;
}
/* Interaction states
----------------------------------*/
.ui-state-default,
.ui-widget-content .ui-state-default,
.ui-widget-header .ui-state-default {
border: 1px solid #d3d3d3;
background: #e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;
font-weight: normal;
color: #555555;
}
.ui-state-default a,
.ui-state-default a:link,
.ui-state-default a:visited {
color: #555555;
text-decoration: none;
}
.ui-state-hover,
.ui-widget-content .ui-state-hover,
.ui-widget-header .ui-state-hover,
.ui-state-focus,
.ui-widget-content .ui-state-focus,
.ui-widget-header .ui-state-focus {
border: 1px solid #999999;
background: #dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;
font-weight: normal;
color: #212121;
}
.ui-state-hover a,
.ui-state-hover a:hover,
.ui-state-hover a:link,
.ui-state-hover a:visited,
.ui-state-focus a,
.ui-state-focus a:hover,
.ui-state-focus a:link,
.ui-state-focus a:visited {
color: #212121;
text-decoration: none;
}
.ui-state-active,
.ui-widget-content .ui-state-active,
.ui-widget-header .ui-state-active {
border: 1px solid #aaaaaa;
background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;
font-weight: normal;
color: #212121;
}
.ui-state-active a,
.ui-state-active a:link,
.ui-state-active a:visited {
color: #212121;
text-decoration: none;
}
/* Interaction Cues
----------------------------------*/
.ui-state-highlight,
.ui-widget-content .ui-state-highlight,
.ui-widget-header .ui-state-highlight {
border: 1px solid #fcefa1;
background: #fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;
color: #363636;
}
.ui-state-highlight a,
.ui-widget-content .ui-state-highlight a,
.ui-widget-header .ui-state-highlight a {
color: #363636;
}
.ui-state-error,
.ui-widget-content .ui-state-error,
.ui-widget-header .ui-state-error {
border: 1px solid #cd0a0a;
background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;
color: #cd0a0a;
}
.ui-state-error a,
.ui-widget-content .ui-state-error a,
.ui-widget-header .ui-state-error a {
color: #cd0a0a;
}
.ui-state-error-text,
.ui-widget-content .ui-state-error-text,
.ui-widget-header .ui-state-error-text {
color: #cd0a0a;
}
.ui-priority-primary,
.ui-widget-content .ui-priority-primary,
.ui-widget-header .ui-priority-primary {
font-weight: bold;
}
.ui-priority-secondary,
.ui-widget-content .ui-priority-secondary,
.ui-widget-header .ui-priority-secondary {
opacity: .7;
filter:Alpha(Opacity=70); /* support: IE8 */
font-weight: normal;
}
.ui-state-disabled,
.ui-widget-content .ui-state-disabled,
.ui-widget-header .ui-state-disabled {
opacity: .35;
filter:Alpha(Opacity=35); /* support: IE8 */
background-image: none;
}
.ui-state-disabled .ui-icon {
filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
}
/* Icons
----------------------------------*/
/* states and images */
.ui-icon {
width: 16px;
height: 16px;
}
.ui-icon,
.ui-widget-content .ui-icon {
background-image: url("images/ui-icons_222222_256x240.png");
}
.ui-widget-header .ui-icon {
background-image: url("images/ui-icons_222222_256x240.png");
}
.ui-state-default .ui-icon {
background-image: url("images/ui-icons_888888_256x240.png");
}
.ui-state-hover .ui-icon,
.ui-state-focus .ui-icon {
background-image: url("images/ui-icons_454545_256x240.png");
}
.ui-state-active .ui-icon {
background-image: url("images/ui-icons_454545_256x240.png");
}
.ui-state-highlight .ui-icon {
background-image: url("images/ui-icons_2e83ff_256x240.png");
}
.ui-state-error .ui-icon,
.ui-state-error-text .ui-icon {
background-image: url("images/ui-icons_cd0a0a_256x240.png");
}
/* positioning */
.ui-icon-blank { background-position: 16px 16px; }
.ui-icon-carat-1-n { background-position: 0 0; }
.ui-icon-carat-1-ne { background-position: -16px 0; }
.ui-icon-carat-1-e { background-position: -32px 0; }
.ui-icon-carat-1-se { background-position: -48px 0; }
.ui-icon-carat-1-s { background-position: -64px 0; }
.ui-icon-carat-1-sw { background-position: -80px 0; }
.ui-icon-carat-1-w { background-position: -96px 0; }
.ui-icon-carat-1-nw { background-position: -112px 0; }
.ui-icon-carat-2-n-s { background-position: -128px 0; }
.ui-icon-carat-2-e-w { background-position: -144px 0; }
.ui-icon-triangle-1-n { background-position: 0 -16px; }
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
.ui-icon-triangle-1-e { background-position: -32px -16px; }
.ui-icon-triangle-1-se { background-position: -48px -16px; }
.ui-icon-triangle-1-s { background-position: -64px -16px; }
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
.ui-icon-triangle-1-w { background-position: -96px -16px; }
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
.ui-icon-arrow-1-n { background-position: 0 -32px; }
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
.ui-icon-arrow-1-e { background-position: -32px -32px; }
.ui-icon-arrow-1-se { background-position: -48px -32px; }
.ui-icon-arrow-1-s { background-position: -64px -32px; }
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
.ui-icon-arrow-1-w { background-position: -96px -32px; }
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
.ui-icon-arrow-4 { background-position: 0 -80px; }
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
.ui-icon-extlink { background-position: -32px -80px; }
.ui-icon-newwin { background-position: -48px -80px; }
.ui-icon-refresh { background-position: -64px -80px; }
.ui-icon-shuffle { background-position: -80px -80px; }
.ui-icon-transfer-e-w { background-position: -96px -80px; }
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
.ui-icon-folder-collapsed { background-position: 0 -96px; }
.ui-icon-folder-open { background-position: -16px -96px; }
.ui-icon-document { background-position: -32px -96px; }
.ui-icon-document-b { background-position: -48px -96px; }
.ui-icon-note { background-position: -64px -96px; }
.ui-icon-mail-closed { background-position: -80px -96px; }
.ui-icon-mail-open { background-position: -96px -96px; }
.ui-icon-suitcase { background-position: -112px -96px; }
.ui-icon-comment { background-position: -128px -96px; }
.ui-icon-person { background-position: -144px -96px; }
.ui-icon-print { background-position: -160px -96px; }
.ui-icon-trash { background-position: -176px -96px; }
.ui-icon-locked { background-position: -192px -96px; }
.ui-icon-unlocked { background-position: -208px -96px; }
.ui-icon-bookmark { background-position: -224px -96px; }
.ui-icon-tag { background-position: -240px -96px; }
.ui-icon-home { background-position: 0 -112px; }
.ui-icon-flag { background-position: -16px -112px; }
.ui-icon-calendar { background-position: -32px -112px; }
.ui-icon-cart { background-position: -48px -112px; }
.ui-icon-pencil { background-position: -64px -112px; }
.ui-icon-clock { background-position: -80px -112px; }
.ui-icon-disk { background-position: -96px -112px; }
.ui-icon-calculator { background-position: -112px -112px; }
.ui-icon-zoomin { background-position: -128px -112px; }
.ui-icon-zoomout { background-position: -144px -112px; }
.ui-icon-search { background-position: -160px -112px; }
.ui-icon-wrench { background-position: -176px -112px; }
.ui-icon-gear { background-position: -192px -112px; }
.ui-icon-heart { background-position: -208px -112px; }
.ui-icon-star { background-position: -224px -112px; }
.ui-icon-link { background-position: -240px -112px; }
.ui-icon-cancel { background-position: 0 -128px; }
.ui-icon-plus { background-position: -16px -128px; }
.ui-icon-plusthick { background-position: -32px -128px; }
.ui-icon-minus { background-position: -48px -128px; }
.ui-icon-minusthick { background-position: -64px -128px; }
.ui-icon-close { background-position: -80px -128px; }
.ui-icon-closethick { background-position: -96px -128px; }
.ui-icon-key { background-position: -112px -128px; }
.ui-icon-lightbulb { background-position: -128px -128px; }
.ui-icon-scissors { background-position: -144px -128px; }
.ui-icon-clipboard { background-position: -160px -128px; }
.ui-icon-copy { background-position: -176px -128px; }
.ui-icon-contact { background-position: -192px -128px; }
.ui-icon-image { background-position: -208px -128px; }
.ui-icon-video { background-position: -224px -128px; }
.ui-icon-script { background-position: -240px -128px; }
.ui-icon-alert { background-position: 0 -144px; }
.ui-icon-info { background-position: -16px -144px; }
.ui-icon-notice { background-position: -32px -144px; }
.ui-icon-help { background-position: -48px -144px; }
.ui-icon-check { background-position: -64px -144px; }
.ui-icon-bullet { background-position: -80px -144px; }
.ui-icon-radio-on { background-position: -96px -144px; }
.ui-icon-radio-off { background-position: -112px -144px; }
.ui-icon-pin-w { background-position: -128px -144px; }
.ui-icon-pin-s { background-position: -144px -144px; }
.ui-icon-play { background-position: 0 -160px; }
.ui-icon-pause { background-position: -16px -160px; }
.ui-icon-seek-next { background-position: -32px -160px; }
.ui-icon-seek-prev { background-position: -48px -160px; }
.ui-icon-seek-end { background-position: -64px -160px; }
.ui-icon-seek-start { background-position: -80px -160px; }
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
.ui-icon-seek-first { background-position: -80px -160px; }
.ui-icon-stop { background-position: -96px -160px; }
.ui-icon-eject { background-position: -112px -160px; }
.ui-icon-volume-off { background-position: -128px -160px; }
.ui-icon-volume-on { background-position: -144px -160px; }
.ui-icon-power { background-position: 0 -176px; }
.ui-icon-signal-diag { background-position: -16px -176px; }
.ui-icon-signal { background-position: -32px -176px; }
.ui-icon-battery-0 { background-position: -48px -176px; }
.ui-icon-battery-1 { background-position: -64px -176px; }
.ui-icon-battery-2 { background-position: -80px -176px; }
.ui-icon-battery-3 { background-position: -96px -176px; }
.ui-icon-circle-plus { background-position: 0 -192px; }
.ui-icon-circle-minus { background-position: -16px -192px; }
.ui-icon-circle-close { background-position: -32px -192px; }
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
.ui-icon-circle-zoomin { background-position: -176px -192px; }
.ui-icon-circle-zoomout { background-position: -192px -192px; }
.ui-icon-circle-check { background-position: -208px -192px; }
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
.ui-icon-circlesmall-close { background-position: -32px -208px; }
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
.ui-icon-squaresmall-close { background-position: -80px -208px; }
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
/* Misc visuals
----------------------------------*/
/* Corner radius */
.ui-corner-all,
.ui-corner-top,
.ui-corner-left,
.ui-corner-tl {
border-top-left-radius: 4px;
}
.ui-corner-all,
.ui-corner-top,
.ui-corner-right,
.ui-corner-tr {
border-top-right-radius: 4px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-left,
.ui-corner-bl {
border-bottom-left-radius: 4px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-right,
.ui-corner-br {
border-bottom-right-radius: 4px;
}
/* Overlays */
.ui-widget-overlay {
background: #aaaaaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
opacity: .3;
filter: Alpha(Opacity=30); /* support: IE8 */
}
.ui-widget-shadow {
margin: -8px 0 0 -8px;
padding: 8px;
background: #aaaaaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
opacity: .3;
filter: Alpha(Opacity=30); /* support: IE8 */
border-radius: 8px;
}

View File

@ -0,0 +1,526 @@
( function( $ ) {
'use strict';
if ( typeof wpcf7 === 'undefined' || wpcf7 === null ) {
return;
}
wpcf7 = $.extend( {
cached: 0,
inputs: []
}, wpcf7 );
$( function() {
wpcf7.supportHtml5 = ( function() {
var features = {};
var input = document.createElement( 'input' );
features.placeholder = 'placeholder' in input;
var inputTypes = [ 'email', 'url', 'tel', 'number', 'range', 'date' ];
$.each( inputTypes, function( index, value ) {
input.setAttribute( 'type', value );
features[ value ] = input.type !== 'text';
} );
return features;
} )();
$( 'div.wpcf7 > form' ).each( function() {
var $form = $( this );
wpcf7.initForm( $form );
if ( wpcf7.cached ) {
wpcf7.refill( $form );
}
} );
} );
wpcf7.getId = function( form ) {
return parseInt( $( 'input[name="_wpcf7"]', form ).val(), 10 );
};
wpcf7.initForm = function( form ) {
var $form = $( form );
$form.submit( function( event ) {
if ( ! wpcf7.supportHtml5.placeholder ) {
$( '[placeholder].placeheld', $form ).each( function( i, n ) {
$( n ).val( '' ).removeClass( 'placeheld' );
} );
}
if ( typeof window.FormData === 'function' ) {
wpcf7.submit( $form );
event.preventDefault();
}
} );
$( '.wpcf7-submit', $form ).after( '<span class="ajax-loader"></span>' );
wpcf7.toggleSubmit( $form );
$form.on( 'click', '.wpcf7-acceptance', function() {
wpcf7.toggleSubmit( $form );
} );
// Exclusive Checkbox
$( '.wpcf7-exclusive-checkbox', $form ).on( 'click', 'input:checkbox', function() {
var name = $( this ).attr( 'name' );
$form.find( 'input:checkbox[name="' + name + '"]' ).not( this ).prop( 'checked', false );
} );
// Free Text Option for Checkboxes and Radio Buttons
$( '.wpcf7-list-item.has-free-text', $form ).each( function() {
var $freetext = $( ':input.wpcf7-free-text', this );
var $wrap = $( this ).closest( '.wpcf7-form-control' );
if ( $( ':checkbox, :radio', this ).is( ':checked' ) ) {
$freetext.prop( 'disabled', false );
} else {
$freetext.prop( 'disabled', true );
}
$wrap.on( 'change', ':checkbox, :radio', function() {
var $cb = $( '.has-free-text', $wrap ).find( ':checkbox, :radio' );
if ( $cb.is( ':checked' ) ) {
$freetext.prop( 'disabled', false ).focus();
} else {
$freetext.prop( 'disabled', true );
}
} );
} );
// Placeholder Fallback
if ( ! wpcf7.supportHtml5.placeholder ) {
$( '[placeholder]', $form ).each( function() {
$( this ).val( $( this ).attr( 'placeholder' ) );
$( this ).addClass( 'placeheld' );
$( this ).focus( function() {
if ( $( this ).hasClass( 'placeheld' ) ) {
$( this ).val( '' ).removeClass( 'placeheld' );
}
} );
$( this ).blur( function() {
if ( '' === $( this ).val() ) {
$( this ).val( $( this ).attr( 'placeholder' ) );
$( this ).addClass( 'placeheld' );
}
} );
} );
}
if ( wpcf7.jqueryUi && ! wpcf7.supportHtml5.date ) {
$form.find( 'input.wpcf7-date[type="date"]' ).each( function() {
$( this ).datepicker( {
dateFormat: 'yy-mm-dd',
minDate: new Date( $( this ).attr( 'min' ) ),
maxDate: new Date( $( this ).attr( 'max' ) )
} );
} );
}
if ( wpcf7.jqueryUi && ! wpcf7.supportHtml5.number ) {
$form.find( 'input.wpcf7-number[type="number"]' ).each( function() {
$( this ).spinner( {
min: $( this ).attr( 'min' ),
max: $( this ).attr( 'max' ),
step: $( this ).attr( 'step' )
} );
} );
}
// Character Count
$( '.wpcf7-character-count', $form ).each( function() {
var $count = $( this );
var name = $count.attr( 'data-target-name' );
var down = $count.hasClass( 'down' );
var starting = parseInt( $count.attr( 'data-starting-value' ), 10 );
var maximum = parseInt( $count.attr( 'data-maximum-value' ), 10 );
var minimum = parseInt( $count.attr( 'data-minimum-value' ), 10 );
var updateCount = function( target ) {
var $target = $( target );
var length = $target.val().length;
var count = down ? starting - length : length;
$count.attr( 'data-current-value', count );
$count.text( count );
if ( maximum && maximum < length ) {
$count.addClass( 'too-long' );
} else {
$count.removeClass( 'too-long' );
}
if ( minimum && length < minimum ) {
$count.addClass( 'too-short' );
} else {
$count.removeClass( 'too-short' );
}
};
$( ':input[name="' + name + '"]', $form ).each( function() {
updateCount( this );
$( this ).keyup( function() {
updateCount( this );
} );
} );
} );
// URL Input Correction
$form.on( 'change', '.wpcf7-validates-as-url', function() {
var val = $.trim( $( this ).val() );
if ( val
&& ! val.match( /^[a-z][a-z0-9.+-]*:/i )
&& -1 !== val.indexOf( '.' ) ) {
val = val.replace( /^\/+/, '' );
val = 'http://' + val;
}
$( this ).val( val );
} );
};
wpcf7.submit = function( form ) {
if ( typeof window.FormData !== 'function' ) {
return;
}
var $form = $( form );
$( '.ajax-loader', $form ).addClass( 'is-active' );
wpcf7.clearResponse( $form );
var formData = new FormData( $form.get( 0 ) );
var detail = {
id: $form.closest( 'div.wpcf7' ).attr( 'id' ),
status: 'init',
inputs: [],
formData: formData
};
$.each( $form.serializeArray(), function( i, field ) {
if ( '_wpcf7' == field.name ) {
detail.contactFormId = field.value;
} else if ( '_wpcf7_version' == field.name ) {
detail.pluginVersion = field.value;
} else if ( '_wpcf7_locale' == field.name ) {
detail.contactFormLocale = field.value;
} else if ( '_wpcf7_unit_tag' == field.name ) {
detail.unitTag = field.value;
} else if ( '_wpcf7_container_post' == field.name ) {
detail.containerPostId = field.value;
} else if ( field.name.match( /^_wpcf7_\w+_free_text_/ ) ) {
var owner = field.name.replace( /^_wpcf7_\w+_free_text_/, '' );
detail.inputs.push( {
name: owner + '-free-text',
value: field.value
} );
} else if ( field.name.match( /^_/ ) ) {
// do nothing
} else {
detail.inputs.push( field );
}
} );
wpcf7.triggerEvent( $form.closest( 'div.wpcf7' ), 'beforesubmit', detail );
var ajaxSuccess = function( data, status, xhr, $form ) {
detail.id = $( data.into ).attr( 'id' );
detail.status = data.status;
detail.apiResponse = data;
var $message = $( '.wpcf7-response-output', $form );
switch ( data.status ) {
case 'validation_failed':
$.each( data.invalidFields, function( i, n ) {
$( n.into, $form ).each( function() {
wpcf7.notValidTip( this, n.message );
$( '.wpcf7-form-control', this ).addClass( 'wpcf7-not-valid' );
$( '[aria-invalid]', this ).attr( 'aria-invalid', 'true' );
} );
} );
$message.addClass( 'wpcf7-validation-errors' );
$form.addClass( 'invalid' );
wpcf7.triggerEvent( data.into, 'invalid', detail );
break;
case 'acceptance_missing':
$message.addClass( 'wpcf7-acceptance-missing' );
$form.addClass( 'unaccepted' );
wpcf7.triggerEvent( data.into, 'unaccepted', detail );
break;
case 'spam':
$message.addClass( 'wpcf7-spam-blocked' );
$form.addClass( 'spam' );
wpcf7.triggerEvent( data.into, 'spam', detail );
break;
case 'aborted':
$message.addClass( 'wpcf7-aborted' );
$form.addClass( 'aborted' );
wpcf7.triggerEvent( data.into, 'aborted', detail );
break;
case 'mail_sent':
$message.addClass( 'wpcf7-mail-sent-ok' );
$form.addClass( 'sent' );
wpcf7.triggerEvent( data.into, 'mailsent', detail );
break;
case 'mail_failed':
$message.addClass( 'wpcf7-mail-sent-ng' );
$form.addClass( 'failed' );
wpcf7.triggerEvent( data.into, 'mailfailed', detail );
break;
default:
var customStatusClass = 'custom-'
+ data.status.replace( /[^0-9a-z]+/i, '-' );
$message.addClass( 'wpcf7-' + customStatusClass );
$form.addClass( customStatusClass );
}
wpcf7.refill( $form, data );
wpcf7.triggerEvent( data.into, 'submit', detail );
if ( 'mail_sent' == data.status ) {
$form.each( function() {
this.reset();
} );
wpcf7.toggleSubmit( $form );
}
if ( ! wpcf7.supportHtml5.placeholder ) {
$form.find( '[placeholder].placeheld' ).each( function( i, n ) {
$( n ).val( $( n ).attr( 'placeholder' ) );
} );
}
$message.html( '' ).append( data.message ).slideDown( 'fast' );
$message.attr( 'role', 'alert' );
$( '.screen-reader-response', $form.closest( '.wpcf7' ) ).each( function() {
var $response = $( this );
$response.html( '' ).attr( 'role', '' ).append( data.message );
if ( data.invalidFields ) {
var $invalids = $( '<ul></ul>' );
$.each( data.invalidFields, function( i, n ) {
if ( n.idref ) {
var $li = $( '<li></li>' ).append( $( '<a></a>' ).attr( 'href', '#' + n.idref ).append( n.message ) );
} else {
var $li = $( '<li></li>' ).append( n.message );
}
$invalids.append( $li );
} );
$response.append( $invalids );
}
$response.attr( 'role', 'alert' ).focus();
} );
};
$.ajax( {
type: 'POST',
url: wpcf7.apiSettings.getRoute(
'/contact-forms/' + wpcf7.getId( $form ) + '/feedback' ),
data: formData,
dataType: 'json',
processData: false,
contentType: false
} ).done( function( data, status, xhr ) {
ajaxSuccess( data, status, xhr, $form );
$( '.ajax-loader', $form ).removeClass( 'is-active' );
} ).fail( function( xhr, status, error ) {
var $e = $( '<div class="ajax-error"></div>' ).text( error.message );
$form.after( $e );
} );
};
wpcf7.triggerEvent = function( target, name, detail ) {
var $target = $( target );
/* DOM event */
var event = new CustomEvent( 'wpcf7' + name, {
bubbles: true,
detail: detail
} );
$target.get( 0 ).dispatchEvent( event );
/* jQuery event */
$target.trigger( 'wpcf7:' + name, detail );
$target.trigger( name + '.wpcf7', detail ); // deprecated
};
wpcf7.toggleSubmit = function( form, state ) {
var $form = $( form );
var $submit = $( 'input:submit', $form );
if ( typeof state !== 'undefined' ) {
$submit.prop( 'disabled', ! state );
return;
}
if ( $form.hasClass( 'wpcf7-acceptance-as-validation' ) ) {
return;
}
$submit.prop( 'disabled', false );
$( '.wpcf7-acceptance', $form ).each( function() {
var $span = $( this );
var $input = $( 'input:checkbox', $span );
if ( ! $span.hasClass( 'optional' ) ) {
if ( $span.hasClass( 'invert' ) && $input.is( ':checked' )
|| ! $span.hasClass( 'invert' ) && ! $input.is( ':checked' ) ) {
$submit.prop( 'disabled', true );
return false;
}
}
} );
};
wpcf7.notValidTip = function( target, message ) {
var $target = $( target );
$( '.wpcf7-not-valid-tip', $target ).remove();
$( '<span role="alert" class="wpcf7-not-valid-tip"></span>' )
.text( message ).appendTo( $target );
if ( $target.is( '.use-floating-validation-tip *' ) ) {
var fadeOut = function( target ) {
$( target ).not( ':hidden' ).animate( {
opacity: 0
}, 'fast', function() {
$( this ).css( { 'z-index': -100 } );
} );
};
$target.on( 'mouseover', '.wpcf7-not-valid-tip', function() {
fadeOut( this );
} );
$target.on( 'focus', ':input', function() {
fadeOut( $( '.wpcf7-not-valid-tip', $target ) );
} );
}
};
wpcf7.refill = function( form, data ) {
var $form = $( form );
var refillCaptcha = function( $form, items ) {
$.each( items, function( i, n ) {
$form.find( ':input[name="' + i + '"]' ).val( '' );
$form.find( 'img.wpcf7-captcha-' + i ).attr( 'src', n );
var match = /([0-9]+)\.(png|gif|jpeg)$/.exec( n );
$form.find( 'input:hidden[name="_wpcf7_captcha_challenge_' + i + '"]' ).attr( 'value', match[ 1 ] );
} );
};
var refillQuiz = function( $form, items ) {
$.each( items, function( i, n ) {
$form.find( ':input[name="' + i + '"]' ).val( '' );
$form.find( ':input[name="' + i + '"]' ).siblings( 'span.wpcf7-quiz-label' ).text( n[ 0 ] );
$form.find( 'input:hidden[name="_wpcf7_quiz_answer_' + i + '"]' ).attr( 'value', n[ 1 ] );
} );
};
if ( typeof data === 'undefined' ) {
$.ajax( {
type: 'GET',
url: wpcf7.apiSettings.getRoute(
'/contact-forms/' + wpcf7.getId( $form ) + '/refill' ),
beforeSend: function( xhr ) {
var nonce = $form.find( ':input[name="_wpnonce"]' ).val();
if ( nonce ) {
xhr.setRequestHeader( 'X-WP-Nonce', nonce );
}
},
dataType: 'json'
} ).done( function( data, status, xhr ) {
if ( data.captcha ) {
refillCaptcha( $form, data.captcha );
}
if ( data.quiz ) {
refillQuiz( $form, data.quiz );
}
} );
} else {
if ( data.captcha ) {
refillCaptcha( $form, data.captcha );
}
if ( data.quiz ) {
refillQuiz( $form, data.quiz );
}
}
};
wpcf7.clearResponse = function( form ) {
var $form = $( form );
$form.removeClass( 'invalid spam sent failed' );
$form.siblings( '.screen-reader-response' ).html( '' ).attr( 'role', '' );
$( '.wpcf7-not-valid-tip', $form ).remove();
$( '[aria-invalid]', $form ).attr( 'aria-invalid', 'false' );
$( '.wpcf7-form-control', $form ).removeClass( 'wpcf7-not-valid' );
$( '.wpcf7-response-output', $form )
.hide().empty().removeAttr( 'role' )
.removeClass( 'wpcf7-mail-sent-ok wpcf7-mail-sent-ng wpcf7-validation-errors wpcf7-spam-blocked' );
};
wpcf7.apiSettings.getRoute = function( path ) {
var url = wpcf7.apiSettings.root;
url = url.replace(
wpcf7.apiSettings.namespace,
wpcf7.apiSettings.namespace + path );
return url;
};
} )( jQuery );
/*
* Polyfill for Internet Explorer
* See https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent
*/
( function () {
if ( typeof window.CustomEvent === "function" ) return false;
function CustomEvent ( event, params ) {
params = params || { bubbles: false, cancelable: false, detail: undefined };
var evt = document.createEvent( 'CustomEvent' );
evt.initCustomEvent( event,
params.bubbles, params.cancelable, params.detail );
return evt;
}
CustomEvent.prototype = window.Event.prototype;
window.CustomEvent = CustomEvent;
} )();

View File

@ -0,0 +1,98 @@
<?php
function wpcf7_l10n() {
static $l10n = array();
if ( ! empty( $l10n ) ) {
return $l10n;
}
if ( ! is_admin() ) {
return $l10n;
}
require_once( ABSPATH . 'wp-admin/includes/translation-install.php' );
$api = translations_api( 'plugins', array(
'slug' => 'contact-form-7',
'version' => WPCF7_VERSION,
) );
if ( is_wp_error( $api )
or empty( $api['translations'] ) ) {
return $l10n;
}
foreach ( (array) $api['translations'] as $translation ) {
if ( ! empty( $translation['language'] )
and ! empty( $translation['english_name'] ) ) {
$l10n[$translation['language']] = $translation['english_name'];
}
}
return $l10n;
}
function wpcf7_is_valid_locale( $locale ) {
$pattern = '/^[a-z]{2,3}(?:_[a-zA-Z_]{2,})?$/';
return (bool) preg_match( $pattern, $locale );
}
function wpcf7_is_rtl( $locale = '' ) {
static $rtl_locales = array(
'ar' => 'Arabic',
'ary' => 'Moroccan Arabic',
'azb' => 'South Azerbaijani',
'fa_IR' => 'Persian',
'haz' => 'Hazaragi',
'he_IL' => 'Hebrew',
'ps' => 'Pashto',
'ug_CN' => 'Uighur',
);
if ( empty( $locale )
and function_exists( 'is_rtl' ) ) {
return is_rtl();
}
if ( empty( $locale ) ) {
$locale = get_locale();
}
return isset( $rtl_locales[$locale] );
}
function wpcf7_load_textdomain( $locale = null ) {
global $l10n;
$domain = 'contact-form-7';
if ( ( is_admin() ? get_user_locale() : get_locale() ) === $locale ) {
$locale = null;
}
if ( empty( $locale ) ) {
if ( is_textdomain_loaded( $domain ) ) {
return true;
} else {
return load_plugin_textdomain( $domain, false, $domain . '/languages' );
}
} else {
$mo_orig = $l10n[$domain];
unload_textdomain( $domain );
$mofile = $domain . '-' . $locale . '.mo';
$path = WP_PLUGIN_DIR . '/' . $domain . '/languages';
if ( $loaded = load_textdomain( $domain, $path . '/'. $mofile ) ) {
return $loaded;
} else {
$mofile = WP_LANG_DIR . '/plugins/' . $mofile;
return load_textdomain( $domain, $mofile );
}
$l10n[$domain] = $mo_orig;
}
return false;
}

View File

@ -0,0 +1,448 @@
<?php
class WPCF7_Mail {
private static $current = null;
private $name = '';
private $locale = '';
private $template = array();
private $use_html = false;
private $exclude_blank = false;
public static function get_current() {
return self::$current;
}
public static function send( $template, $name = '' ) {
self::$current = new self( $name, $template );
return self::$current->compose();
}
private function __construct( $name, $template ) {
$this->name = trim( $name );
$this->use_html = ! empty( $template['use_html'] );
$this->exclude_blank = ! empty( $template['exclude_blank'] );
$this->template = wp_parse_args( $template, array(
'subject' => '',
'sender' => '',
'body' => '',
'recipient' => '',
'additional_headers' => '',
'attachments' => '',
) );
if ( $submission = WPCF7_Submission::get_instance() ) {
$contact_form = $submission->get_contact_form();
$this->locale = $contact_form->locale();
}
}
public function name() {
return $this->name;
}
public function get( $component, $replace_tags = false ) {
$use_html = ( $this->use_html && 'body' == $component );
$exclude_blank = ( $this->exclude_blank && 'body' == $component );
$template = $this->template;
$component = isset( $template[$component] ) ? $template[$component] : '';
if ( $replace_tags ) {
$component = $this->replace_tags( $component, array(
'html' => $use_html,
'exclude_blank' => $exclude_blank,
) );
if ( $use_html
and ! preg_match( '%<html[>\s].*</html>%is', $component ) ) {
$component = $this->htmlize( $component );
}
}
return $component;
}
private function htmlize( $body ) {
if ( $this->locale ) {
$lang_atts = sprintf( ' %s',
wpcf7_format_atts( array(
'dir' => wpcf7_is_rtl( $this->locale ) ? 'rtl' : 'ltr',
'lang' => str_replace( '_', '-', $this->locale ),
) )
);
} else {
$lang_atts = '';
}
$header = apply_filters( 'wpcf7_mail_html_header',
'<!doctype html>
<html xmlns="http://www.w3.org/1999/xhtml"' . $lang_atts . '>
<head>
<title>' . esc_html( $this->get( 'subject', true ) ) . '</title>
</head>
<body>
', $this );
$footer = apply_filters( 'wpcf7_mail_html_footer',
'</body>
</html>', $this );
$html = $header . wpautop( $body ) . $footer;
return $html;
}
private function compose( $send = true ) {
$components = array(
'subject' => $this->get( 'subject', true ),
'sender' => $this->get( 'sender', true ),
'body' => $this->get( 'body', true ),
'recipient' => $this->get( 'recipient', true ),
'additional_headers' => $this->get( 'additional_headers', true ),
'attachments' => $this->attachments(),
);
$components = apply_filters( 'wpcf7_mail_components',
$components, wpcf7_get_current_contact_form(), $this );
if ( ! $send ) {
return $components;
}
$subject = wpcf7_strip_newline( $components['subject'] );
$sender = wpcf7_strip_newline( $components['sender'] );
$recipient = wpcf7_strip_newline( $components['recipient'] );
$body = $components['body'];
$additional_headers = trim( $components['additional_headers'] );
$attachments = $components['attachments'];
$headers = "From: $sender\n";
if ( $this->use_html ) {
$headers .= "Content-Type: text/html\n";
$headers .= "X-WPCF7-Content-Type: text/html\n";
} else {
$headers .= "X-WPCF7-Content-Type: text/plain\n";
}
if ( $additional_headers ) {
$headers .= $additional_headers . "\n";
}
return wp_mail( $recipient, $subject, $body, $headers, $attachments );
}
public function replace_tags( $content, $args = '' ) {
if ( true === $args ) {
$args = array( 'html' => true );
}
$args = wp_parse_args( $args, array(
'html' => false,
'exclude_blank' => false,
) );
return wpcf7_mail_replace_tags( $content, $args );
}
private function attachments( $template = null ) {
if ( ! $template ) {
$template = $this->get( 'attachments' );
}
$attachments = array();
if ( $submission = WPCF7_Submission::get_instance() ) {
$uploaded_files = $submission->uploaded_files();
foreach ( (array) $uploaded_files as $name => $path ) {
if ( false !== strpos( $template, "[${name}]" )
and ! empty( $path ) ) {
$attachments[] = $path;
}
}
}
foreach ( explode( "\n", $template ) as $line ) {
$line = trim( $line );
if ( '[' == substr( $line, 0, 1 ) ) {
continue;
}
$path = path_join( WP_CONTENT_DIR, $line );
if ( ! wpcf7_is_file_path_in_content_dir( $path ) ) {
// $path is out of WP_CONTENT_DIR
continue;
}
if ( is_readable( $path )
and is_file( $path ) ) {
$attachments[] = $path;
}
}
return $attachments;
}
}
function wpcf7_mail_replace_tags( $content, $args = '' ) {
$args = wp_parse_args( $args, array(
'html' => false,
'exclude_blank' => false,
) );
if ( is_array( $content ) ) {
foreach ( $content as $key => $value ) {
$content[$key] = wpcf7_mail_replace_tags( $value, $args );
}
return $content;
}
$content = explode( "\n", $content );
foreach ( $content as $num => $line ) {
$line = new WPCF7_MailTaggedText( $line, $args );
$replaced = $line->replace_tags();
if ( $args['exclude_blank'] ) {
$replaced_tags = $line->get_replaced_tags();
if ( empty( $replaced_tags )
or array_filter( $replaced_tags ) ) {
$content[$num] = $replaced;
} else {
unset( $content[$num] ); // Remove a line.
}
} else {
$content[$num] = $replaced;
}
}
$content = implode( "\n", $content );
return $content;
}
add_action( 'phpmailer_init', 'wpcf7_phpmailer_init', 10, 1 );
function wpcf7_phpmailer_init( $phpmailer ) {
$custom_headers = $phpmailer->getCustomHeaders();
$phpmailer->clearCustomHeaders();
$wpcf7_content_type = false;
foreach ( (array) $custom_headers as $custom_header ) {
$name = $custom_header[0];
$value = $custom_header[1];
if ( 'X-WPCF7-Content-Type' === $name ) {
$wpcf7_content_type = trim( $value );
} else {
$phpmailer->addCustomHeader( $name, $value );
}
}
if ( 'text/html' === $wpcf7_content_type ) {
$phpmailer->msgHTML( $phpmailer->Body );
} elseif ( 'text/plain' === $wpcf7_content_type ) {
$phpmailer->AltBody = '';
}
}
class WPCF7_MailTaggedText {
private $html = false;
private $callback = null;
private $content = '';
private $replaced_tags = array();
public function __construct( $content, $args = '' ) {
$args = wp_parse_args( $args, array(
'html' => false,
'callback' => null,
) );
$this->html = (bool) $args['html'];
if ( null !== $args['callback']
and is_callable( $args['callback'] ) ) {
$this->callback = $args['callback'];
} elseif ( $this->html ) {
$this->callback = array( $this, 'replace_tags_callback_html' );
} else {
$this->callback = array( $this, 'replace_tags_callback' );
}
$this->content = $content;
}
public function get_replaced_tags() {
return $this->replaced_tags;
}
public function replace_tags() {
$regex = '/(\[?)\[[\t ]*'
. '([a-zA-Z_][0-9a-zA-Z:._-]*)' // [2] = name
. '((?:[\t ]+"[^"]*"|[\t ]+\'[^\']*\')*)' // [3] = values
. '[\t ]*\](\]?)/';
return preg_replace_callback( $regex, $this->callback, $this->content );
}
private function replace_tags_callback_html( $matches ) {
return $this->replace_tags_callback( $matches, true );
}
private function replace_tags_callback( $matches, $html = false ) {
// allow [[foo]] syntax for escaping a tag
if ( $matches[1] == '['
and $matches[4] == ']' ) {
return substr( $matches[0], 1, -1 );
}
$tag = $matches[0];
$tagname = $matches[2];
$values = $matches[3];
$mail_tag = new WPCF7_MailTag( $tag, $tagname, $values );
$field_name = $mail_tag->field_name();
$submission = WPCF7_Submission::get_instance();
$submitted = $submission
? $submission->get_posted_data( $field_name )
: null;
if ( null !== $submitted ) {
if ( $mail_tag->get_option( 'do_not_heat' ) ) {
$submitted = isset( $_POST[$field_name] ) ? $_POST[$field_name] : '';
}
$replaced = $submitted;
if ( $format = $mail_tag->get_option( 'format' ) ) {
$replaced = $this->format( $replaced, $format );
}
$replaced = wpcf7_flat_join( $replaced );
if ( $html ) {
$replaced = esc_html( $replaced );
$replaced = wptexturize( $replaced );
}
if ( $form_tag = $mail_tag->corresponding_form_tag() ) {
$type = $form_tag->type;
$replaced = apply_filters(
"wpcf7_mail_tag_replaced_{$type}", $replaced,
$submitted, $html, $mail_tag );
}
$replaced = apply_filters( 'wpcf7_mail_tag_replaced', $replaced,
$submitted, $html, $mail_tag );
$replaced = wp_unslash( trim( $replaced ) );
$this->replaced_tags[$tag] = $replaced;
return $replaced;
}
$special = apply_filters( 'wpcf7_special_mail_tags', null,
$mail_tag->tag_name(), $html, $mail_tag );
if ( null !== $special ) {
$this->replaced_tags[$tag] = $special;
return $special;
}
return $tag;
}
public function format( $original, $format ) {
$original = (array) $original;
foreach ( $original as $key => $value ) {
if ( preg_match( '/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/', $value ) ) {
$original[$key] = mysql2date( $format, $value );
}
}
return $original;
}
}
class WPCF7_MailTag {
private $tag;
private $tagname = '';
private $name = '';
private $options = array();
private $values = array();
private $form_tag = null;
public function __construct( $tag, $tagname, $values ) {
$this->tag = $tag;
$this->name = $this->tagname = $tagname;
$this->options = array(
'do_not_heat' => false,
'format' => '',
);
if ( ! empty( $values ) ) {
preg_match_all( '/"[^"]*"|\'[^\']*\'/', $values, $matches );
$this->values = wpcf7_strip_quote_deep( $matches[0] );
}
if ( preg_match( '/^_raw_(.+)$/', $tagname, $matches ) ) {
$this->name = trim( $matches[1] );
$this->options['do_not_heat'] = true;
}
if ( preg_match( '/^_format_(.+)$/', $tagname, $matches ) ) {
$this->name = trim( $matches[1] );
$this->options['format'] = $this->values[0];
}
}
public function tag_name() {
return $this->tagname;
}
public function field_name() {
return $this->name;
}
public function get_option( $option ) {
return $this->options[$option];
}
public function values() {
return $this->values;
}
public function corresponding_form_tag() {
if ( $this->form_tag instanceof WPCF7_FormTag ) {
return $this->form_tag;
}
if ( $submission = WPCF7_Submission::get_instance() ) {
$contact_form = $submission->get_contact_form();
$tags = $contact_form->scan_form_tags( array(
'name' => $this->name,
'feature' => '! zero-controls-container',
) );
if ( $tags ) {
$this->form_tag = $tags[0];
}
}
return $this->form_tag;
}
}

View File

@ -0,0 +1,78 @@
<?php
class WPCF7_Pipe {
public $before = '';
public $after = '';
public function __construct( $text ) {
$text = (string) $text;
$pipe_pos = strpos( $text, '|' );
if ( false === $pipe_pos ) {
$this->before = $this->after = trim( $text );
} else {
$this->before = trim( substr( $text, 0, $pipe_pos ) );
$this->after = trim( substr( $text, $pipe_pos + 1 ) );
}
}
}
class WPCF7_Pipes {
private $pipes = array();
public function __construct( array $texts ) {
foreach ( $texts as $text ) {
$this->add_pipe( $text );
}
}
private function add_pipe( $text ) {
$pipe = new WPCF7_Pipe( $text );
$this->pipes[] = $pipe;
}
public function do_pipe( $before ) {
foreach ( $this->pipes as $pipe ) {
if ( $pipe->before == $before ) {
return $pipe->after;
}
}
return $before;
}
public function collect_befores() {
$befores = array();
foreach ( $this->pipes as $pipe ) {
$befores[] = $pipe->before;
}
return $befores;
}
public function collect_afters() {
$afters = array();
foreach ( $this->pipes as $pipe ) {
$afters[] = $pipe->after;
}
return $afters;
}
public function zero() {
return empty( $this->pipes );
}
public function random_pipe() {
if ( $this->zero() ) {
return null;
}
return $this->pipes[array_rand( $this->pipes )];
}
}

View File

@ -0,0 +1,323 @@
<?php
add_action( 'rest_api_init', 'wpcf7_rest_api_init', 10, 0 );
function wpcf7_rest_api_init() {
$namespace = 'contact-form-7/v1';
register_rest_route( $namespace,
'/contact-forms',
array(
array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'wpcf7_rest_get_contact_forms',
),
array(
'methods' => WP_REST_Server::CREATABLE,
'callback' => 'wpcf7_rest_create_contact_form',
),
)
);
register_rest_route( $namespace,
'/contact-forms/(?P<id>\d+)',
array(
array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'wpcf7_rest_get_contact_form',
),
array(
'methods' => WP_REST_Server::EDITABLE,
'callback' => 'wpcf7_rest_update_contact_form',
),
array(
'methods' => WP_REST_Server::DELETABLE,
'callback' => 'wpcf7_rest_delete_contact_form',
),
)
);
register_rest_route( $namespace,
'/contact-forms/(?P<id>\d+)/feedback',
array(
array(
'methods' => WP_REST_Server::CREATABLE,
'callback' => 'wpcf7_rest_create_feedback',
),
)
);
register_rest_route( $namespace,
'/contact-forms/(?P<id>\d+)/refill',
array(
array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'wpcf7_rest_get_refill',
),
)
);
}
function wpcf7_rest_get_contact_forms( WP_REST_Request $request ) {
if ( ! current_user_can( 'wpcf7_read_contact_forms' ) ) {
return new WP_Error( 'wpcf7_forbidden',
__( "You are not allowed to access contact forms.", 'contact-form-7' ),
array( 'status' => 403 ) );
}
$args = array();
$per_page = $request->get_param( 'per_page' );
if ( null !== $per_page ) {
$args['posts_per_page'] = (int) $per_page;
}
$offset = $request->get_param( 'offset' );
if ( null !== $offset ) {
$args['offset'] = (int) $offset;
}
$order = $request->get_param( 'order' );
if ( null !== $order ) {
$args['order'] = (string) $order;
}
$orderby = $request->get_param( 'orderby' );
if ( null !== $orderby ) {
$args['orderby'] = (string) $orderby;
}
$search = $request->get_param( 'search' );
if ( null !== $search ) {
$args['s'] = (string) $search;
}
$items = WPCF7_ContactForm::find( $args );
$response = array();
foreach ( $items as $item ) {
$response[] = array(
'id' => $item->id(),
'slug' => $item->name(),
'title' => $item->title(),
'locale' => $item->locale(),
);
}
return rest_ensure_response( $response );
}
function wpcf7_rest_create_contact_form( WP_REST_Request $request ) {
$id = (int) $request->get_param( 'id' );
if ( $id ) {
return new WP_Error( 'wpcf7_post_exists',
__( "Cannot create existing contact form.", 'contact-form-7' ),
array( 'status' => 400 ) );
}
if ( ! current_user_can( 'wpcf7_edit_contact_forms' ) ) {
return new WP_Error( 'wpcf7_forbidden',
__( "You are not allowed to create a contact form.", 'contact-form-7' ),
array( 'status' => 403 ) );
}
$args = $request->get_params();
$args['id'] = -1; // Create
$context = $request->get_param( 'context' );
$item = wpcf7_save_contact_form( $args, $context );
if ( ! $item ) {
return new WP_Error( 'wpcf7_cannot_save',
__( "There was an error saving the contact form.", 'contact-form-7' ),
array( 'status' => 500 ) );
}
$response = array(
'id' => $item->id(),
'slug' => $item->name(),
'title' => $item->title(),
'locale' => $item->locale(),
'properties' => $item->get_properties(),
'config_errors' => array(),
);
if ( wpcf7_validate_configuration() ) {
$config_validator = new WPCF7_ConfigValidator( $item );
$config_validator->validate();
$response['config_errors'] = $config_validator->collect_error_messages();
if ( 'save' == $context ) {
$config_validator->save();
}
}
return rest_ensure_response( $response );
}
function wpcf7_rest_get_contact_form( WP_REST_Request $request ) {
$id = (int) $request->get_param( 'id' );
$item = wpcf7_contact_form( $id );
if ( ! $item ) {
return new WP_Error( 'wpcf7_not_found',
__( "The requested contact form was not found.", 'contact-form-7' ),
array( 'status' => 404 ) );
}
if ( ! current_user_can( 'wpcf7_edit_contact_form', $id ) ) {
return new WP_Error( 'wpcf7_forbidden',
__( "You are not allowed to access the requested contact form.", 'contact-form-7' ),
array( 'status' => 403 ) );
}
$response = array(
'id' => $item->id(),
'slug' => $item->name(),
'title' => $item->title(),
'locale' => $item->locale(),
'properties' => $item->get_properties(),
);
return rest_ensure_response( $response );
}
function wpcf7_rest_update_contact_form( WP_REST_Request $request ) {
$id = (int) $request->get_param( 'id' );
$item = wpcf7_contact_form( $id );
if ( ! $item ) {
return new WP_Error( 'wpcf7_not_found',
__( "The requested contact form was not found.", 'contact-form-7' ),
array( 'status' => 404 ) );
}
if ( ! current_user_can( 'wpcf7_edit_contact_form', $id ) ) {
return new WP_Error( 'wpcf7_forbidden',
__( "You are not allowed to access the requested contact form.", 'contact-form-7' ),
array( 'status' => 403 ) );
}
$args = $request->get_params();
$context = $request->get_param( 'context' );
$item = wpcf7_save_contact_form( $args, $context );
if ( ! $item ) {
return new WP_Error( 'wpcf7_cannot_save',
__( "There was an error saving the contact form.", 'contact-form-7' ),
array( 'status' => 500 ) );
}
$response = array(
'id' => $item->id(),
'slug' => $item->name(),
'title' => $item->title(),
'locale' => $item->locale(),
'properties' => $item->get_properties(),
'config_errors' => array(),
);
if ( wpcf7_validate_configuration() ) {
$config_validator = new WPCF7_ConfigValidator( $item );
$config_validator->validate();
$response['config_errors'] = $config_validator->collect_error_messages();
if ( 'save' == $context ) {
$config_validator->save();
}
}
return rest_ensure_response( $response );
}
function wpcf7_rest_delete_contact_form( WP_REST_Request $request ) {
$id = (int) $request->get_param( 'id' );
$item = wpcf7_contact_form( $id );
if ( ! $item ) {
return new WP_Error( 'wpcf7_not_found',
__( "The requested contact form was not found.", 'contact-form-7' ),
array( 'status' => 404 ) );
}
if ( ! current_user_can( 'wpcf7_delete_contact_form', $id ) ) {
return new WP_Error( 'wpcf7_forbidden',
__( "You are not allowed to access the requested contact form.", 'contact-form-7' ),
array( 'status' => 403 ) );
}
$result = $item->delete();
if ( ! $result ) {
return new WP_Error( 'wpcf7_cannot_delete',
__( "There was an error deleting the contact form.", 'contact-form-7' ),
array( 'status' => 500 ) );
}
$response = array( 'deleted' => true );
return rest_ensure_response( $response );
}
function wpcf7_rest_create_feedback( WP_REST_Request $request ) {
$id = (int) $request->get_param( 'id' );
$item = wpcf7_contact_form( $id );
if ( ! $item ) {
return new WP_Error( 'wpcf7_not_found',
__( "The requested contact form was not found.", 'contact-form-7' ),
array( 'status' => 404 ) );
}
$result = $item->submit();
$unit_tag = $request->get_param( '_wpcf7_unit_tag' );
$response = array(
'into' => '#' . wpcf7_sanitize_unit_tag( $unit_tag ),
'status' => $result['status'],
'message' => $result['message'],
);
if ( 'validation_failed' == $result['status'] ) {
$invalid_fields = array();
foreach ( (array) $result['invalid_fields'] as $name => $field ) {
$invalid_fields[] = array(
'into' => 'span.wpcf7-form-control-wrap.'
. sanitize_html_class( $name ),
'message' => $field['reason'],
'idref' => $field['idref'],
);
}
$response['invalidFields'] = $invalid_fields;
}
$response = apply_filters( 'wpcf7_ajax_json_echo', $response, $result );
return rest_ensure_response( $response );
}
function wpcf7_rest_get_refill( WP_REST_Request $request ) {
$id = (int) $request->get_param( 'id' );
$item = wpcf7_contact_form( $id );
if ( ! $item ) {
return new WP_Error( 'wpcf7_not_found',
__( "The requested contact form was not found.", 'contact-form-7' ),
array( 'status' => 404 ) );
}
$response = apply_filters( 'wpcf7_ajax_onload', array() );
return rest_ensure_response( $response );
}

View File

@ -0,0 +1,101 @@
<?php
/**
* All the functions and classes in this file are deprecated.
* You shouldn't use them. The functions and classes will be
* removed in a later version.
*/
function wpcf7_add_shortcode( $tag, $func, $has_name = false ) {
wpcf7_deprecated_function( __FUNCTION__, '4.6', 'wpcf7_add_form_tag' );
return wpcf7_add_form_tag( $tag, $func, $has_name );
}
function wpcf7_remove_shortcode( $tag ) {
wpcf7_deprecated_function( __FUNCTION__, '4.6', 'wpcf7_remove_form_tag' );
return wpcf7_remove_form_tag( $tag );
}
function wpcf7_do_shortcode( $content ) {
wpcf7_deprecated_function( __FUNCTION__, '4.6',
'wpcf7_replace_all_form_tags' );
return wpcf7_replace_all_form_tags( $content );
}
function wpcf7_scan_shortcode( $cond = null ) {
wpcf7_deprecated_function( __FUNCTION__, '4.6', 'wpcf7_scan_form_tags' );
return wpcf7_scan_form_tags( $cond );
}
class WPCF7_ShortcodeManager {
private static $form_tags_manager;
private function __construct() {}
public static function get_instance() {
wpcf7_deprecated_function( __METHOD__, '4.6',
'WPCF7_FormTagsManager::get_instance' );
self::$form_tags_manager = WPCF7_FormTagsManager::get_instance();
return new self;
}
public function get_scanned_tags() {
wpcf7_deprecated_function( __METHOD__, '4.6',
'WPCF7_FormTagsManager::get_scanned_tags' );
return self::$form_tags_manager->get_scanned_tags();
}
public function add_shortcode( $tag, $func, $has_name = false ) {
wpcf7_deprecated_function( __METHOD__, '4.6',
'WPCF7_FormTagsManager::add' );
return self::$form_tags_manager->add( $tag, $func, $has_name );
}
public function remove_shortcode( $tag ) {
wpcf7_deprecated_function( __METHOD__, '4.6',
'WPCF7_FormTagsManager::remove' );
return self::$form_tags_manager->remove( $tag );
}
public function normalize_shortcode( $content ) {
wpcf7_deprecated_function( __METHOD__, '4.6',
'WPCF7_FormTagsManager::normalize' );
return self::$form_tags_manager->normalize( $content );
}
public function do_shortcode( $content, $exec = true ) {
wpcf7_deprecated_function( __METHOD__, '4.6',
'WPCF7_FormTagsManager::replace_all' );
if ( $exec ) {
return self::$form_tags_manager->replace_all( $content );
} else {
return self::$form_tags_manager->scan( $content );
}
}
public function scan_shortcode( $content ) {
wpcf7_deprecated_function( __METHOD__, '4.6',
'WPCF7_FormTagsManager::scan' );
return self::$form_tags_manager->scan( $content );
}
}
class WPCF7_Shortcode extends WPCF7_FormTag {
public function __construct( $tag ) {
wpcf7_deprecated_function( 'WPCF7_Shortcode', '4.6', 'WPCF7_FormTag' );
parent::__construct( $tag );
}
}

View File

@ -0,0 +1,168 @@
<?php
/**
** Special Mail Tags
** https://contactform7.com/special-mail-tags/
**/
add_filter( 'wpcf7_special_mail_tags', 'wpcf7_special_mail_tag', 10, 3 );
function wpcf7_special_mail_tag( $output, $name, $html ) {
$name = preg_replace( '/^wpcf7\./', '_', $name ); // for back-compat
$submission = WPCF7_Submission::get_instance();
if ( ! $submission ) {
return $output;
}
if ( '_remote_ip' == $name ) {
if ( $remote_ip = $submission->get_meta( 'remote_ip' ) ) {
return $remote_ip;
} else {
return '';
}
}
if ( '_user_agent' == $name ) {
if ( $user_agent = $submission->get_meta( 'user_agent' ) ) {
return $html ? esc_html( $user_agent ) : $user_agent;
} else {
return '';
}
}
if ( '_url' == $name ) {
if ( $url = $submission->get_meta( 'url' ) ) {
return esc_url( $url );
} else {
return '';
}
}
if ( '_date' == $name
or '_time' == $name ) {
if ( $timestamp = $submission->get_meta( 'timestamp' ) ) {
if ( '_date' == $name ) {
return date_i18n( get_option( 'date_format' ), $timestamp );
}
if ( '_time' == $name ) {
return date_i18n( get_option( 'time_format' ), $timestamp );
}
}
return '';
}
if ( '_invalid_fields' == $name ) {
return count( $submission->get_invalid_fields() );
}
return $output;
}
add_filter( 'wpcf7_special_mail_tags', 'wpcf7_post_related_smt', 10, 3 );
function wpcf7_post_related_smt( $output, $name, $html ) {
if ( '_post_' != substr( $name, 0, 6 ) ) {
return $output;
}
$submission = WPCF7_Submission::get_instance();
if ( ! $submission ) {
return $output;
}
$post_id = (int) $submission->get_meta( 'container_post_id' );
if ( ! $post_id
or ! $post = get_post( $post_id ) ) {
return '';
}
if ( '_post_id' == $name ) {
return (string) $post->ID;
}
if ( '_post_name' == $name ) {
return $post->post_name;
}
if ( '_post_title' == $name ) {
return $html ? esc_html( $post->post_title ) : $post->post_title;
}
if ( '_post_url' == $name ) {
return get_permalink( $post->ID );
}
$user = new WP_User( $post->post_author );
if ( '_post_author' == $name ) {
return $user->display_name;
}
if ( '_post_author_email' == $name ) {
return $user->user_email;
}
return $output;
}
add_filter( 'wpcf7_special_mail_tags', 'wpcf7_site_related_smt', 10, 3 );
function wpcf7_site_related_smt( $output, $name, $html ) {
$filter = $html ? 'display' : 'raw';
if ( '_site_title' == $name ) {
return get_bloginfo( 'name', $filter );
}
if ( '_site_description' == $name ) {
return get_bloginfo( 'description', $filter );
}
if ( '_site_url' == $name ) {
return get_bloginfo( 'url', $filter );
}
if ( '_site_admin_email' == $name ) {
return get_bloginfo( 'admin_email', $filter );
}
return $output;
}
add_filter( 'wpcf7_special_mail_tags', 'wpcf7_user_related_smt', 10, 3 );
function wpcf7_user_related_smt( $output, $name, $html ) {
if ( '_user_' != substr( $name, 0, 6 )
or '_user_agent' == $name ) {
return $output;
}
$submission = WPCF7_Submission::get_instance();
if ( ! $submission ) {
return $output;
}
$user_id = (int) $submission->get_meta( 'current_user_id' );
if ( ! $user_id ) {
return '';
}
$primary_props = array( 'user_login', 'user_email', 'user_url' );
$opt = ltrim( $name, '_' );
$opt = in_array( $opt, $primary_props ) ? $opt : substr( $opt, 5 );
$user = new WP_User( $user_id );
if ( $user->has_prop( $opt ) ) {
return $user->get( $opt );
}
return '';
}

View File

@ -0,0 +1,412 @@
<?php
class WPCF7_Submission {
private static $instance;
private $contact_form;
private $status = 'init';
private $posted_data = array();
private $uploaded_files = array();
private $skip_mail = false;
private $response = '';
private $invalid_fields = array();
private $meta = array();
private $consent = array();
private function __construct() {}
public static function get_instance( WPCF7_ContactForm $contact_form = null, $args = '' ) {
$args = wp_parse_args( $args, array(
'skip_mail' => false,
) );
if ( empty( self::$instance ) ) {
if ( null == $contact_form ) {
return null;
}
self::$instance = new self;
self::$instance->contact_form = $contact_form;
self::$instance->skip_mail = (bool) $args['skip_mail'];
self::$instance->setup_posted_data();
self::$instance->submit();
} elseif ( null != $contact_form ) {
return null;
}
return self::$instance;
}
public static function is_restful() {
return defined( 'REST_REQUEST' ) && REST_REQUEST;
}
public function get_status() {
return $this->status;
}
public function set_status( $status ) {
if ( preg_match( '/^[a-z][0-9a-z_]+$/', $status ) ) {
$this->status = $status;
return true;
}
return false;
}
public function is( $status ) {
return $this->status == $status;
}
public function get_response() {
return $this->response;
}
public function set_response( $response ) {
$this->response = $response;
return true;
}
public function get_contact_form() {
return $this->contact_form;
}
public function get_invalid_field( $name ) {
if ( isset( $this->invalid_fields[$name] ) ) {
return $this->invalid_fields[$name];
} else {
return false;
}
}
public function get_invalid_fields() {
return $this->invalid_fields;
}
public function get_posted_data( $name = '' ) {
if ( ! empty( $name ) ) {
if ( isset( $this->posted_data[$name] ) ) {
return $this->posted_data[$name];
} else {
return null;
}
}
return $this->posted_data;
}
private function setup_posted_data() {
$posted_data = (array) $_POST;
$posted_data = array_diff_key( $posted_data, array( '_wpnonce' => '' ) );
$posted_data = $this->sanitize_posted_data( $posted_data );
$tags = $this->contact_form->scan_form_tags();
foreach ( (array) $tags as $tag ) {
if ( empty( $tag->name ) ) {
continue;
}
$type = $tag->type;
$name = $tag->name;
$pipes = $tag->pipes;
$value_orig = $value = '';
if ( isset( $posted_data[$name] ) ) {
$value_orig = $value = $posted_data[$name];
}
if ( WPCF7_USE_PIPE
and $pipes instanceof WPCF7_Pipes
and ! $pipes->zero() ) {
if ( is_array( $value_orig ) ) {
$value = array();
foreach ( $value_orig as $v ) {
$value[] = $pipes->do_pipe( wp_unslash( $v ) );
}
} else {
$value = $pipes->do_pipe( wp_unslash( $value_orig ) );
}
}
$value = apply_filters( "wpcf7_posted_data_{$type}", $value,
$value_orig, $tag );
$posted_data[$name] = $value;
if ( $tag->has_option( 'consent_for:storage' )
and empty( $posted_data[$name] ) ) {
$this->meta['do_not_store'] = true;
}
}
$this->posted_data = apply_filters( 'wpcf7_posted_data', $posted_data );
return $this->posted_data;
}
private function sanitize_posted_data( $value ) {
if ( is_array( $value ) ) {
$value = array_map( array( $this, 'sanitize_posted_data' ), $value );
} elseif ( is_string( $value ) ) {
$value = wp_check_invalid_utf8( $value );
$value = wp_kses_no_null( $value );
}
return $value;
}
private function submit() {
if ( ! $this->is( 'init' ) ) {
return $this->status;
}
$this->meta = array_merge( $this->meta, array(
'remote_ip' => $this->get_remote_ip_addr(),
'user_agent' => isset( $_SERVER['HTTP_USER_AGENT'] )
? substr( $_SERVER['HTTP_USER_AGENT'], 0, 254 ) : '',
'url' => $this->get_request_url(),
'timestamp' => current_time( 'timestamp' ),
'unit_tag' =>
isset( $_POST['_wpcf7_unit_tag'] ) ? $_POST['_wpcf7_unit_tag'] : '',
'container_post_id' => isset( $_POST['_wpcf7_container_post'] )
? (int) $_POST['_wpcf7_container_post'] : 0,
'current_user_id' => get_current_user_id(),
) );
$contact_form = $this->contact_form;
if ( $contact_form->is_true( 'do_not_store' ) ) {
$this->meta['do_not_store'] = true;
}
if ( ! $this->validate() ) { // Validation error occured
$this->set_status( 'validation_failed' );
$this->set_response( $contact_form->message( 'validation_error' ) );
} elseif ( ! $this->accepted() ) { // Not accepted terms
$this->set_status( 'acceptance_missing' );
$this->set_response( $contact_form->message( 'accept_terms' ) );
} elseif ( $this->spam() ) { // Spam!
$this->set_status( 'spam' );
$this->set_response( $contact_form->message( 'spam' ) );
} elseif ( ! $this->before_send_mail() ) {
if ( 'init' == $this->get_status() ) {
$this->set_status( 'aborted' );
}
if ( '' === $this->get_response() ) {
$this->set_response( $contact_form->filter_message(
__( "Sending mail has been aborted.", 'contact-form-7' ) )
);
}
} elseif ( $this->mail() ) {
$this->set_status( 'mail_sent' );
$this->set_response( $contact_form->message( 'mail_sent_ok' ) );
do_action( 'wpcf7_mail_sent', $contact_form );
} else {
$this->set_status( 'mail_failed' );
$this->set_response( $contact_form->message( 'mail_sent_ng' ) );
do_action( 'wpcf7_mail_failed', $contact_form );
}
$this->remove_uploaded_files();
return $this->status;
}
private function get_remote_ip_addr() {
$ip_addr = '';
if ( isset( $_SERVER['REMOTE_ADDR'] )
and WP_Http::is_ip_address( $_SERVER['REMOTE_ADDR'] ) ) {
$ip_addr = $_SERVER['REMOTE_ADDR'];
}
return apply_filters( 'wpcf7_remote_ip_addr', $ip_addr );
}
private function get_request_url() {
$home_url = untrailingslashit( home_url() );
if ( self::is_restful() ) {
$referer = isset( $_SERVER['HTTP_REFERER'] )
? trim( $_SERVER['HTTP_REFERER'] ) : '';
if ( $referer
and 0 === strpos( $referer, $home_url ) ) {
return esc_url_raw( $referer );
}
}
$url = preg_replace( '%(?<!:|/)/.*$%', '', $home_url )
. wpcf7_get_request_uri();
return $url;
}
private function validate() {
if ( $this->invalid_fields ) {
return false;
}
require_once WPCF7_PLUGIN_DIR . '/includes/validation.php';
$result = new WPCF7_Validation();
$tags = $this->contact_form->scan_form_tags();
foreach ( $tags as $tag ) {
$type = $tag->type;
$result = apply_filters( "wpcf7_validate_{$type}", $result, $tag );
}
$result = apply_filters( 'wpcf7_validate', $result, $tags );
$this->invalid_fields = $result->get_invalid_fields();
return $result->is_valid();
}
private function accepted() {
return apply_filters( 'wpcf7_acceptance', true, $this );
}
public function add_consent( $name, $conditions ) {
$this->consent[$name] = $conditions;
return true;
}
public function collect_consent() {
return (array) $this->consent;
}
private function spam() {
$spam = false;
if ( $this->contact_form->is_true( 'subscribers_only' )
and current_user_can( 'wpcf7_submit', $this->contact_form->id() ) ) {
return $spam;
}
$user_agent = (string) $this->get_meta( 'user_agent' );
if ( strlen( $user_agent ) < 2 ) {
$spam = true;
}
if ( ! $this->verify_nonce() ) {
$spam = true;
}
if ( $this->is_blacklisted() ) {
$spam = true;
}
return apply_filters( 'wpcf7_spam', $spam );
}
private function verify_nonce() {
if ( ! $this->contact_form->nonce_is_active() ) {
return true;
}
return wpcf7_verify_nonce( $_POST['_wpnonce'] );
}
private function is_blacklisted() {
$target = wpcf7_array_flatten( $this->posted_data );
$target[] = $this->get_meta( 'remote_ip' );
$target[] = $this->get_meta( 'user_agent' );
$target = implode( "\n", $target );
return (bool) apply_filters( 'wpcf7_submission_is_blacklisted',
wpcf7_blacklist_check( $target ), $this );
}
/* Mail */
private function before_send_mail() {
$abort = false;
do_action_ref_array( 'wpcf7_before_send_mail', array(
$this->contact_form,
&$abort,
$this,
) );
return ! $abort;
}
private function mail() {
$contact_form = $this->contact_form;
$skip_mail = apply_filters( 'wpcf7_skip_mail',
$this->skip_mail, $contact_form );
if ( $skip_mail ) {
return true;
}
$result = WPCF7_Mail::send( $contact_form->prop( 'mail' ), 'mail' );
if ( $result ) {
$additional_mail = array();
if ( $mail_2 = $contact_form->prop( 'mail_2' )
and $mail_2['active'] ) {
$additional_mail['mail_2'] = $mail_2;
}
$additional_mail = apply_filters( 'wpcf7_additional_mail',
$additional_mail, $contact_form );
foreach ( $additional_mail as $name => $template ) {
WPCF7_Mail::send( $template, $name );
}
return true;
}
return false;
}
public function uploaded_files() {
return $this->uploaded_files;
}
public function add_uploaded_file( $name, $file_path ) {
$this->uploaded_files[$name] = $file_path;
if ( empty( $this->posted_data[$name] ) ) {
$this->posted_data[$name] = basename( $file_path );
}
}
public function remove_uploaded_files() {
foreach ( (array) $this->uploaded_files as $name => $path ) {
wpcf7_rmdir_p( $path );
if ( $dir = dirname( $path )
and false !== ( $files = scandir( $dir ) )
and ! array_diff( $files, array( '.', '..' ) ) ) {
// remove parent dir if it's empty.
rmdir( $dir );
}
}
}
public function get_meta( $name ) {
if ( isset( $this->meta[$name] ) ) {
return $this->meta[$name];
}
}
}

View File

@ -0,0 +1,85 @@
<?php
add_action( 'wpcf7_upgrade', 'wpcf7_convert_to_cpt', 10, 2 );
function wpcf7_convert_to_cpt( $new_ver, $old_ver ) {
global $wpdb;
if ( ! version_compare( $old_ver, '3.0-dev', '<' ) ) {
return;
}
$old_rows = array();
$table_name = $wpdb->prefix . "contact_form_7";
if ( $wpdb->get_var( "SHOW TABLES LIKE '$table_name'" ) ) {
$old_rows = $wpdb->get_results( "SELECT * FROM $table_name" );
} elseif ( $opt = get_option( 'wpcf7' )
and ! empty( $opt['contact_forms'] ) ) {
foreach ( (array) $opt['contact_forms'] as $key => $value ) {
$old_rows[] = (object) array_merge(
$value,
array( 'cf7_unit_id' => $key )
);
}
}
foreach ( (array) $old_rows as $row ) {
$q = "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_old_cf7_unit_id'"
. $wpdb->prepare( " AND meta_value = %d", $row->cf7_unit_id );
if ( $wpdb->get_var( $q ) ) {
continue;
}
$postarr = array(
'post_type' => 'wpcf7_contact_form',
'post_status' => 'publish',
'post_title' => maybe_unserialize( $row->title ),
);
$post_id = wp_insert_post( $postarr );
if ( $post_id ) {
update_post_meta( $post_id, '_old_cf7_unit_id', $row->cf7_unit_id );
$metas = array( 'form', 'mail', 'mail_2', 'messages', 'additional_settings' );
foreach ( $metas as $meta ) {
update_post_meta( $post_id, '_' . $meta,
wpcf7_normalize_newline_deep( maybe_unserialize( $row->{$meta} ) ) );
}
}
}
}
add_action( 'wpcf7_upgrade', 'wpcf7_prepend_underscore', 10, 2 );
function wpcf7_prepend_underscore( $new_ver, $old_ver ) {
if ( version_compare( $old_ver, '3.0-dev', '<' ) ) {
return;
}
if ( ! version_compare( $old_ver, '3.3-dev', '<' ) ) {
return;
}
$posts = WPCF7_ContactForm::find( array(
'post_status' => 'any',
'posts_per_page' => -1,
) );
foreach ( $posts as $post ) {
$props = $post->get_properties();
foreach ( $props as $prop => $value ) {
if ( metadata_exists( 'post', $post->id(), '_' . $prop ) ) {
continue;
}
update_post_meta( $post->id(), '_' . $prop, $value );
delete_post_meta( $post->id(), $prop );
}
}
}

View File

@ -0,0 +1,84 @@
<?php
class WPCF7_Validation implements ArrayAccess {
private $invalid_fields = array();
private $container = array();
public function __construct() {
$this->container = array(
'valid' => true,
'reason' => array(),
'idref' => array(),
);
}
public function invalidate( $context, $message ) {
if ( $context instanceof WPCF7_FormTag ) {
$tag = $context;
} elseif ( is_array( $context ) ) {
$tag = new WPCF7_FormTag( $context );
} elseif ( is_string( $context ) ) {
$tags = wpcf7_scan_form_tags( array( 'name' => trim( $context ) ) );
$tag = $tags ? new WPCF7_FormTag( $tags[0] ) : null;
}
$name = ! empty( $tag ) ? $tag->name : null;
if ( empty( $name )
or ! wpcf7_is_name( $name ) ) {
return;
}
if ( $this->is_valid( $name ) ) {
$id = $tag->get_id_option();
if ( empty( $id )
or ! wpcf7_is_name( $id ) ) {
$id = null;
}
$this->invalid_fields[$name] = array(
'reason' => (string) $message,
'idref' => $id,
);
}
}
public function is_valid( $name = null ) {
if ( ! empty( $name ) ) {
return ! isset( $this->invalid_fields[$name] );
} else {
return empty( $this->invalid_fields );
}
}
public function get_invalid_fields() {
return $this->invalid_fields;
}
public function offsetSet( $offset, $value ) {
if ( isset( $this->container[$offset] ) ) {
$this->container[$offset] = $value;
}
if ( 'reason' == $offset
and is_array( $value ) ) {
foreach ( $value as $k => $v ) {
$this->invalidate( $k, $v );
}
}
}
public function offsetGet( $offset ) {
if ( isset( $this->container[$offset] ) ) {
return $this->container[$offset];
}
}
public function offsetExists( $offset ) {
return isset( $this->container[$offset] );
}
public function offsetUnset( $offset ) {
}
}

View File

@ -0,0 +1,4 @@
Translations have moved to
https://translate.wordpress.org/projects/wp-plugins/contact-form-7
Thank you for your contribution.

View File

@ -0,0 +1,358 @@
Contact Form 7 WordPress Plugin, 2007-2018 Takayuki Miyoshi
Contact Form 7 is distributed under the terms of the GNU GPL
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

View File

@ -0,0 +1,282 @@
<?php
/**
** A base module for [acceptance]
**/
/* form_tag handler */
add_action( 'wpcf7_init', 'wpcf7_add_form_tag_acceptance', 10, 0 );
function wpcf7_add_form_tag_acceptance() {
wpcf7_add_form_tag( 'acceptance',
'wpcf7_acceptance_form_tag_handler',
array(
'name-attr' => true,
)
);
}
function wpcf7_acceptance_form_tag_handler( $tag ) {
if ( empty( $tag->name ) ) {
return '';
}
$validation_error = wpcf7_get_validation_error( $tag->name );
$class = wpcf7_form_controls_class( $tag->type );
if ( $validation_error ) {
$class .= ' wpcf7-not-valid';
}
if ( $tag->has_option( 'invert' ) ) {
$class .= ' invert';
}
if ( $tag->has_option( 'optional' ) ) {
$class .= ' optional';
}
$atts = array(
'class' => trim( $class ),
);
$item_atts = array();
$item_atts['type'] = 'checkbox';
$item_atts['name'] = $tag->name;
$item_atts['value'] = '1';
$item_atts['tabindex'] = $tag->get_option( 'tabindex', 'signed_int', true );
$item_atts['aria-invalid'] = $validation_error ? 'true' : 'false';
if ( $tag->has_option( 'default:on' ) ) {
$item_atts['checked'] = 'checked';
}
$item_atts['class'] = $tag->get_class_option();
$item_atts['id'] = $tag->get_id_option();
$item_atts = wpcf7_format_atts( $item_atts );
$content = empty( $tag->content )
? (string) reset( $tag->values )
: $tag->content;
$content = trim( $content );
if ( $content ) {
$html = sprintf(
'<span class="wpcf7-list-item"><label><input %1$s /><span class="wpcf7-list-item-label">%2$s</span></label></span>',
$item_atts, $content );
} else {
$html = sprintf(
'<span class="wpcf7-list-item"><input %1$s /></span>',
$item_atts );
}
$atts = wpcf7_format_atts( $atts );
$html = sprintf(
'<span class="wpcf7-form-control-wrap %1$s"><span %2$s>%3$s</span>%4$s</span>',
sanitize_html_class( $tag->name ), $atts, $html, $validation_error );
return $html;
}
/* Validation filter */
add_filter( 'wpcf7_validate_acceptance',
'wpcf7_acceptance_validation_filter', 10, 2 );
function wpcf7_acceptance_validation_filter( $result, $tag ) {
if ( ! wpcf7_acceptance_as_validation() ) {
return $result;
}
if ( $tag->has_option( 'optional' ) ) {
return $result;
}
$name = $tag->name;
$value = ( ! empty( $_POST[$name] ) ? 1 : 0 );
$invert = $tag->has_option( 'invert' );
if ( $invert and $value
or ! $invert and ! $value ) {
$result->invalidate( $tag, wpcf7_get_message( 'accept_terms' ) );
}
return $result;
}
/* Acceptance filter */
add_filter( 'wpcf7_acceptance', 'wpcf7_acceptance_filter', 10, 2 );
function wpcf7_acceptance_filter( $accepted, $submission ) {
$tags = wpcf7_scan_form_tags( array( 'type' => 'acceptance' ) );
foreach ( $tags as $tag ) {
$name = $tag->name;
if ( empty( $name ) ) {
continue;
}
$value = ( ! empty( $_POST[$name] ) ? 1 : 0 );
$content = empty( $tag->content )
? (string) reset( $tag->values )
: $tag->content;
$content = trim( $content );
if ( $value and $content ) {
$submission->add_consent( $name, $content );
}
if ( $tag->has_option( 'optional' ) ) {
continue;
}
$invert = $tag->has_option( 'invert' );
if ( $invert and $value
or ! $invert and ! $value ) {
$accepted = false;
}
}
return $accepted;
}
add_filter( 'wpcf7_form_class_attr',
'wpcf7_acceptance_form_class_attr', 10, 1 );
function wpcf7_acceptance_form_class_attr( $class ) {
if ( wpcf7_acceptance_as_validation() ) {
return $class . ' wpcf7-acceptance-as-validation';
}
return $class;
}
function wpcf7_acceptance_as_validation() {
if ( ! $contact_form = wpcf7_get_current_contact_form() ) {
return false;
}
return $contact_form->is_true( 'acceptance_as_validation' );
}
add_filter( 'wpcf7_mail_tag_replaced_acceptance',
'wpcf7_acceptance_mail_tag', 10, 4 );
function wpcf7_acceptance_mail_tag( $replaced, $submitted, $html, $mail_tag ) {
$form_tag = $mail_tag->corresponding_form_tag();
if ( ! $form_tag ) {
return $replaced;
}
if ( ! empty( $submitted ) ) {
$replaced = __( 'Consented', 'contact-form-7' );
} else {
$replaced = __( 'Not consented', 'contact-form-7' );
}
$content = empty( $form_tag->content )
? (string) reset( $form_tag->values )
: $form_tag->content;
if ( ! $html ) {
$content = wp_strip_all_tags( $content );
}
$content = trim( $content );
if ( $content ) {
/* translators: 1: 'Consented' or 'Not consented', 2: conditions */
$replaced = sprintf(
_x( '%1$s: %2$s', 'mail output for acceptance checkboxes',
'contact-form-7' ),
$replaced,
$content );
}
return $replaced;
}
/* Tag generator */
add_action( 'wpcf7_admin_init', 'wpcf7_add_tag_generator_acceptance', 35, 0 );
function wpcf7_add_tag_generator_acceptance() {
$tag_generator = WPCF7_TagGenerator::get_instance();
$tag_generator->add( 'acceptance', __( 'acceptance', 'contact-form-7' ),
'wpcf7_tag_generator_acceptance' );
}
function wpcf7_tag_generator_acceptance( $contact_form, $args = '' ) {
$args = wp_parse_args( $args, array() );
$type = 'acceptance';
$description = __( "Generate a form-tag for an acceptance checkbox. For more details, see %s.", 'contact-form-7' );
$desc_link = wpcf7_link( __( 'https://contactform7.com/acceptance-checkbox/', 'contact-form-7' ), __( 'Acceptance Checkbox', 'contact-form-7' ) );
?>
<div class="control-box">
<fieldset>
<legend><?php echo sprintf( esc_html( $description ), $desc_link ); ?></legend>
<table class="form-table">
<tbody>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-name' ); ?>"><?php echo esc_html( __( 'Name', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="name" class="tg-name oneline" id="<?php echo esc_attr( $args['content'] . '-name' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-content' ); ?>"><?php echo esc_html( __( 'Condition', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="content" class="oneline large-text" id="<?php echo esc_attr( $args['content'] . '-content' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><?php echo esc_html( __( 'Options', 'contact-form-7' ) ); ?></th>
<td>
<fieldset>
<legend class="screen-reader-text"><?php echo esc_html( __( 'Options', 'contact-form-7' ) ); ?></legend>
<label><input type="checkbox" name="optional" class="option" checked="checked" /> <?php echo esc_html( __( 'Make this checkbox optional', 'contact-form-7' ) ); ?></label>
</fieldset>
</td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-id' ); ?>"><?php echo esc_html( __( 'Id attribute', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="id" class="idvalue oneline option" id="<?php echo esc_attr( $args['content'] . '-id' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-class' ); ?>"><?php echo esc_html( __( 'Class attribute', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="class" class="classvalue oneline option" id="<?php echo esc_attr( $args['content'] . '-class' ); ?>" /></td>
</tr>
</tbody>
</table>
</fieldset>
</div>
<div class="insert-box">
<input type="text" name="<?php echo $type; ?>" class="tag code" readonly="readonly" onfocus="this.select()" />
<div class="submitbox">
<input type="button" class="button button-primary insert-tag" value="<?php echo esc_attr( __( 'Insert Tag', 'contact-form-7' ) ); ?>" />
</div>
</div>
<?php
}

View File

@ -0,0 +1,138 @@
<?php
/**
** Akismet Filter
** Akismet API: http://akismet.com/development/api/
**/
add_filter( 'wpcf7_spam', 'wpcf7_akismet', 10, 1 );
function wpcf7_akismet( $spam ) {
if ( $spam ) {
return $spam;
}
if ( ! wpcf7_akismet_is_available() ) {
return false;
}
if ( ! $params = wpcf7_akismet_submitted_params() ) {
return false;
}
$c = array();
$c['comment_author'] = $params['author'];
$c['comment_author_email'] = $params['author_email'];
$c['comment_author_url'] = $params['author_url'];
$c['comment_content'] = $params['content'];
$c['blog'] = get_option( 'home' );
$c['blog_lang'] = get_locale();
$c['blog_charset'] = get_option( 'blog_charset' );
$c['user_ip'] = $_SERVER['REMOTE_ADDR'];
$c['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
$c['referrer'] = $_SERVER['HTTP_REFERER'];
// http://blog.akismet.com/2012/06/19/pro-tip-tell-us-your-comment_type/
$c['comment_type'] = 'contact-form';
if ( $permalink = get_permalink() ) {
$c['permalink'] = $permalink;
}
$ignore = array( 'HTTP_COOKIE', 'HTTP_COOKIE2', 'PHP_AUTH_PW' );
foreach ( $_SERVER as $key => $value ) {
if ( ! in_array( $key, (array) $ignore ) ) {
$c["$key"] = $value;
}
}
return wpcf7_akismet_comment_check( $c );
}
function wpcf7_akismet_is_available() {
if ( is_callable( array( 'Akismet', 'get_api_key' ) ) ) {
return (bool) Akismet::get_api_key();
}
return false;
}
function wpcf7_akismet_submitted_params() {
$params = array(
'author' => '',
'author_email' => '',
'author_url' => '',
'content' => '',
);
$has_akismet_option = false;
foreach ( (array) $_POST as $key => $val ) {
if ( '_wpcf7' == substr( $key, 0, 6 )
or '_wpnonce' == $key ) {
continue;
}
if ( is_array( $val ) ) {
$val = implode( ', ', wpcf7_array_flatten( $val ) );
}
$val = trim( $val );
if ( 0 == strlen( $val ) ) {
continue;
}
if ( $tags = wpcf7_scan_form_tags( array( 'name' => $key ) ) ) {
$tag = $tags[0];
$akismet = $tag->get_option( 'akismet',
'(author|author_email|author_url)', true );
if ( $akismet ) {
$has_akismet_option = true;
if ( 'author' == $akismet ) {
$params[$akismet] = trim( $params[$akismet] . ' ' . $val );
continue;
} elseif ( '' == $params[$akismet] ) {
$params[$akismet] = $val;
continue;
}
}
}
$params['content'] .= "\n\n" . $val;
}
if ( ! $has_akismet_option ) {
return false;
}
$params['content'] = trim( $params['content'] );
return $params;
}
function wpcf7_akismet_comment_check( $comment ) {
$spam = false;
$query_string = wpcf7_build_query( $comment );
if ( is_callable( array( 'Akismet', 'http_post' ) ) ) {
$response = Akismet::http_post( $query_string, 'comment-check' );
} else {
return $spam;
}
if ( 'true' == $response[1] ) {
$spam = true;
}
if ( $submission = WPCF7_Submission::get_instance() ) {
$submission->akismet = array( 'comment' => $comment, 'spam' => $spam );
}
return apply_filters( 'wpcf7_akismet_comment_check', $spam, $comment );
}

View File

@ -0,0 +1,349 @@
<?php
/**
** A base module for [checkbox], [checkbox*], and [radio]
**/
/* form_tag handler */
add_action( 'wpcf7_init', 'wpcf7_add_form_tag_checkbox', 10, 0 );
function wpcf7_add_form_tag_checkbox() {
wpcf7_add_form_tag( array( 'checkbox', 'checkbox*', 'radio' ),
'wpcf7_checkbox_form_tag_handler',
array(
'name-attr' => true,
'selectable-values' => true,
'multiple-controls-container' => true,
)
);
}
function wpcf7_checkbox_form_tag_handler( $tag ) {
if ( empty( $tag->name ) ) {
return '';
}
$validation_error = wpcf7_get_validation_error( $tag->name );
$class = wpcf7_form_controls_class( $tag->type );
if ( $validation_error ) {
$class .= ' wpcf7-not-valid';
}
$label_first = $tag->has_option( 'label_first' );
$use_label_element = $tag->has_option( 'use_label_element' );
$exclusive = $tag->has_option( 'exclusive' );
$free_text = $tag->has_option( 'free_text' );
$multiple = false;
if ( 'checkbox' == $tag->basetype ) {
$multiple = ! $exclusive;
} else { // radio
$exclusive = false;
}
if ( $exclusive ) {
$class .= ' wpcf7-exclusive-checkbox';
}
$atts = array();
$atts['class'] = $tag->get_class_option( $class );
$atts['id'] = $tag->get_id_option();
$tabindex = $tag->get_option( 'tabindex', 'signed_int', true );
if ( false !== $tabindex ) {
$tabindex = (int) $tabindex;
}
$html = '';
$count = 0;
if ( $data = (array) $tag->get_data_option() ) {
if ( $free_text ) {
$tag->values = array_merge(
array_slice( $tag->values, 0, -1 ),
array_values( $data ),
array_slice( $tag->values, -1 ) );
$tag->labels = array_merge(
array_slice( $tag->labels, 0, -1 ),
array_values( $data ),
array_slice( $tag->labels, -1 ) );
} else {
$tag->values = array_merge( $tag->values, array_values( $data ) );
$tag->labels = array_merge( $tag->labels, array_values( $data ) );
}
}
$values = $tag->values;
$labels = $tag->labels;
$default_choice = $tag->get_default_option( null, array(
'multiple' => $multiple,
) );
$hangover = wpcf7_get_hangover( $tag->name, $multiple ? array() : '' );
foreach ( $values as $key => $value ) {
if ( $hangover ) {
$checked = in_array( $value, (array) $hangover, true );
} else {
$checked = in_array( $value, (array) $default_choice, true );
}
if ( isset( $labels[$key] ) ) {
$label = $labels[$key];
} else {
$label = $value;
}
$item_atts = array(
'type' => $tag->basetype,
'name' => $tag->name . ( $multiple ? '[]' : '' ),
'value' => $value,
'checked' => $checked ? 'checked' : '',
'tabindex' => false !== $tabindex ? $tabindex : '',
);
$item_atts = wpcf7_format_atts( $item_atts );
if ( $label_first ) { // put label first, input last
$item = sprintf(
'<span class="wpcf7-list-item-label">%1$s</span><input %2$s />',
esc_html( $label ), $item_atts );
} else {
$item = sprintf(
'<input %2$s /><span class="wpcf7-list-item-label">%1$s</span>',
esc_html( $label ), $item_atts );
}
if ( $use_label_element ) {
$item = '<label>' . $item . '</label>';
}
if ( false !== $tabindex
and 0 < $tabindex ) {
$tabindex += 1;
}
$class = 'wpcf7-list-item';
$count += 1;
if ( 1 == $count ) {
$class .= ' first';
}
if ( count( $values ) == $count ) { // last round
$class .= ' last';
if ( $free_text ) {
$free_text_name = sprintf(
'_wpcf7_%1$s_free_text_%2$s', $tag->basetype, $tag->name );
$free_text_atts = array(
'name' => $free_text_name,
'class' => 'wpcf7-free-text',
'tabindex' => false !== $tabindex ? $tabindex : '',
);
if ( wpcf7_is_posted()
and isset( $_POST[$free_text_name] ) ) {
$free_text_atts['value'] = wp_unslash(
$_POST[$free_text_name] );
}
$free_text_atts = wpcf7_format_atts( $free_text_atts );
$item .= sprintf( ' <input type="text" %s />', $free_text_atts );
$class .= ' has-free-text';
}
}
$item = '<span class="' . esc_attr( $class ) . '">' . $item . '</span>';
$html .= $item;
}
$atts = wpcf7_format_atts( $atts );
$html = sprintf(
'<span class="wpcf7-form-control-wrap %1$s"><span %2$s>%3$s</span>%4$s</span>',
sanitize_html_class( $tag->name ), $atts, $html, $validation_error );
return $html;
}
/* Validation filter */
add_filter( 'wpcf7_validate_checkbox',
'wpcf7_checkbox_validation_filter', 10, 2 );
add_filter( 'wpcf7_validate_checkbox*',
'wpcf7_checkbox_validation_filter', 10, 2 );
add_filter( 'wpcf7_validate_radio',
'wpcf7_checkbox_validation_filter', 10, 2 );
function wpcf7_checkbox_validation_filter( $result, $tag ) {
$name = $tag->name;
$is_required = $tag->is_required() || 'radio' == $tag->type;
$value = isset( $_POST[$name] ) ? (array) $_POST[$name] : array();
if ( $is_required and empty( $value ) ) {
$result->invalidate( $tag, wpcf7_get_message( 'invalid_required' ) );
}
return $result;
}
/* Adding free text field */
add_filter( 'wpcf7_posted_data', 'wpcf7_checkbox_posted_data', 10, 1 );
function wpcf7_checkbox_posted_data( $posted_data ) {
$tags = wpcf7_scan_form_tags(
array( 'type' => array( 'checkbox', 'checkbox*', 'radio' ) ) );
if ( empty( $tags ) ) {
return $posted_data;
}
foreach ( $tags as $tag ) {
if ( ! isset( $posted_data[$tag->name] ) ) {
continue;
}
$posted_items = (array) $posted_data[$tag->name];
if ( $tag->has_option( 'free_text' ) ) {
if ( WPCF7_USE_PIPE ) {
$values = $tag->pipes->collect_afters();
} else {
$values = $tag->values;
}
$last = array_pop( $values );
$last = html_entity_decode( $last, ENT_QUOTES, 'UTF-8' );
if ( in_array( $last, $posted_items ) ) {
$posted_items = array_diff( $posted_items, array( $last ) );
$free_text_name = sprintf(
'_wpcf7_%1$s_free_text_%2$s', $tag->basetype, $tag->name );
$free_text = $posted_data[$free_text_name];
if ( ! empty( $free_text ) ) {
$posted_items[] = trim( $last . ' ' . $free_text );
} else {
$posted_items[] = $last;
}
}
}
$posted_data[$tag->name] = $posted_items;
}
return $posted_data;
}
/* Tag generator */
add_action( 'wpcf7_admin_init',
'wpcf7_add_tag_generator_checkbox_and_radio', 30, 0 );
function wpcf7_add_tag_generator_checkbox_and_radio() {
$tag_generator = WPCF7_TagGenerator::get_instance();
$tag_generator->add( 'checkbox', __( 'checkboxes', 'contact-form-7' ),
'wpcf7_tag_generator_checkbox' );
$tag_generator->add( 'radio', __( 'radio buttons', 'contact-form-7' ),
'wpcf7_tag_generator_checkbox' );
}
function wpcf7_tag_generator_checkbox( $contact_form, $args = '' ) {
$args = wp_parse_args( $args, array() );
$type = $args['id'];
if ( 'radio' != $type ) {
$type = 'checkbox';
}
if ( 'checkbox' == $type ) {
$description = __( "Generate a form-tag for a group of checkboxes. For more details, see %s.", 'contact-form-7' );
} elseif ( 'radio' == $type ) {
$description = __( "Generate a form-tag for a group of radio buttons. For more details, see %s.", 'contact-form-7' );
}
$desc_link = wpcf7_link( __( 'https://contactform7.com/checkboxes-radio-buttons-and-menus/', 'contact-form-7' ), __( 'Checkboxes, Radio Buttons and Menus', 'contact-form-7' ) );
?>
<div class="control-box">
<fieldset>
<legend><?php echo sprintf( esc_html( $description ), $desc_link ); ?></legend>
<table class="form-table">
<tbody>
<?php if ( 'checkbox' == $type ) : ?>
<tr>
<th scope="row"><?php echo esc_html( __( 'Field type', 'contact-form-7' ) ); ?></th>
<td>
<fieldset>
<legend class="screen-reader-text"><?php echo esc_html( __( 'Field type', 'contact-form-7' ) ); ?></legend>
<label><input type="checkbox" name="required" /> <?php echo esc_html( __( 'Required field', 'contact-form-7' ) ); ?></label>
</fieldset>
</td>
</tr>
<?php endif; ?>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-name' ); ?>"><?php echo esc_html( __( 'Name', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="name" class="tg-name oneline" id="<?php echo esc_attr( $args['content'] . '-name' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><?php echo esc_html( __( 'Options', 'contact-form-7' ) ); ?></th>
<td>
<fieldset>
<legend class="screen-reader-text"><?php echo esc_html( __( 'Options', 'contact-form-7' ) ); ?></legend>
<textarea name="values" class="values" id="<?php echo esc_attr( $args['content'] . '-values' ); ?>"></textarea>
<label for="<?php echo esc_attr( $args['content'] . '-values' ); ?>"><span class="description"><?php echo esc_html( __( "One option per line.", 'contact-form-7' ) ); ?></span></label><br />
<label><input type="checkbox" name="label_first" class="option" /> <?php echo esc_html( __( 'Put a label first, a checkbox last', 'contact-form-7' ) ); ?></label><br />
<label><input type="checkbox" name="use_label_element" class="option" /> <?php echo esc_html( __( 'Wrap each item with label element', 'contact-form-7' ) ); ?></label>
<?php if ( 'checkbox' == $type ) : ?>
<br /><label><input type="checkbox" name="exclusive" class="option" /> <?php echo esc_html( __( 'Make checkboxes exclusive', 'contact-form-7' ) ); ?></label>
<?php endif; ?>
</fieldset>
</td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-id' ); ?>"><?php echo esc_html( __( 'Id attribute', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="id" class="idvalue oneline option" id="<?php echo esc_attr( $args['content'] . '-id' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-class' ); ?>"><?php echo esc_html( __( 'Class attribute', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="class" class="classvalue oneline option" id="<?php echo esc_attr( $args['content'] . '-class' ); ?>" /></td>
</tr>
</tbody>
</table>
</fieldset>
</div>
<div class="insert-box">
<input type="text" name="<?php echo $type; ?>" class="tag code" readonly="readonly" onfocus="this.select()" />
<div class="submitbox">
<input type="button" class="button button-primary insert-tag" value="<?php echo esc_attr( __( 'Insert Tag', 'contact-form-7' ) ); ?>" />
</div>
<br class="clear" />
<p class="description mail-tag"><label for="<?php echo esc_attr( $args['content'] . '-mailtag' ); ?>"><?php echo sprintf( esc_html( __( "To use the value input through this field in a mail field, you need to insert the corresponding mail-tag (%s) into the field on the Mail tab.", 'contact-form-7' ) ), '<strong><span class="mail-tag"></span></strong>' ); ?><input type="text" class="mail-tag code hidden" readonly="readonly" id="<?php echo esc_attr( $args['content'] . '-mailtag' ); ?>" /></label></p>
</div>
<?php
}

View File

@ -0,0 +1,677 @@
<?php
add_action( 'wpcf7_init', 'wpcf7_constant_contact_register_service', 10, 0 );
function wpcf7_constant_contact_register_service() {
$integration = WPCF7_Integration::get_instance();
$integration->add_category( 'email_marketing',
__( 'Email Marketing', 'contact-form-7' ) );
$service = WPCF7_ConstantContact::get_instance();
$integration->add_service( 'constant_contact', $service );
}
add_action( 'wpcf7_submit', 'wpcf7_constant_contact_submit', 10, 2 );
function wpcf7_constant_contact_submit( $contact_form, $result ) {
$service = WPCF7_ConstantContact::get_instance();
if ( ! $service->is_active() ) {
return;
}
if ( $contact_form->in_demo_mode() ) {
return;
}
$do_submit = true;
if ( empty( $result['status'] )
or ! in_array( $result['status'], array( 'mail_sent' ) ) ) {
$do_submit = false;
}
$do_submit = apply_filters( 'wpcf7_constant_contact_submit',
$do_submit, $contact_form, $result );
if ( ! $do_submit ) {
return;
}
$submission = WPCF7_Submission::get_instance();
$consented = true;
foreach ( $contact_form->scan_form_tags( 'feature=name-attr' ) as $tag ) {
if ( $tag->has_option( 'consent_for:constant_contact' )
and null == $submission->get_posted_data( $tag->name ) ) {
$consented = false;
break;
}
}
if ( ! $consented ) {
return;
}
$request_builder_class_name = apply_filters(
'wpcf7_constant_contact_contact_post_request_builder',
'WPCF7_ConstantContact_ContactPostRequest'
);
if ( ! class_exists( $request_builder_class_name ) ) {
return;
}
$request_builder = new $request_builder_class_name;
$request_builder->build( $submission );
if ( ! $request_builder->is_valid() ) {
return;
}
if ( $email = $request_builder->get_email_address()
and $service->email_exists( $email ) ) {
return;
}
$service->create_contact( $request_builder->to_array() );
}
if ( ! class_exists( 'WPCF7_Service_OAuth2' ) ) {
return;
}
class WPCF7_ConstantContact extends WPCF7_Service_OAuth2 {
const service_name = 'constant_contact';
const authorization_endpoint = 'https://api.cc.email/v3/idfed';
const token_endpoint = 'https://idfed.constantcontact.com/as/token.oauth2';
private static $instance;
public static function get_instance() {
if ( empty( self::$instance ) ) {
self::$instance = new self;
}
return self::$instance;
}
private function __construct() {
$this->authorization_endpoint = self::authorization_endpoint;
$this->token_endpoint = self::token_endpoint;
$option = (array) WPCF7::get_option( self::service_name );
if ( isset( $option['client_id'] ) ) {
$this->client_id = $option['client_id'];
}
if ( isset( $option['client_secret'] ) ) {
$this->client_secret = $option['client_secret'];
}
if ( isset( $option['access_token'] ) ) {
$this->access_token = $option['access_token'];
}
if ( isset( $option['refresh_token'] ) ) {
$this->refresh_token = $option['refresh_token'];
}
add_action( 'wpcf7_admin_init', array( $this, 'auth_redirect' ) );
}
public function auth_redirect() {
$auth = isset( $_GET['auth'] ) ? trim( $_GET['auth'] ) : '';
$code = isset( $_GET['code'] ) ? trim( $_GET['code'] ) : '';
if ( self::service_name === $auth and $code
and current_user_can( 'wpcf7_manage_integration' ) ) {
$redirect_to = add_query_arg(
array(
'service' => self::service_name,
'action' => 'auth_redirect',
'code' => $code,
),
menu_page_url( 'wpcf7-integration', false )
);
wp_safe_redirect( $redirect_to );
exit();
}
}
protected function save_data() {
$option = array_merge(
(array) WPCF7::get_option( self::service_name ),
array(
'client_id' => $this->client_id,
'client_secret' => $this->client_secret,
'access_token' => $this->access_token,
'refresh_token' => $this->refresh_token,
)
);
WPCF7::update_option( self::service_name, $option );
}
protected function reset_data() {
$this->client_id = '';
$this->client_secret = '';
$this->access_token = '';
$this->refresh_token = '';
$this->save_data();
}
public function get_title() {
return __( 'Constant Contact', 'contact-form-7' );
}
public function get_categories() {
return array( 'email_marketing' );
}
public function icon() {
}
public function link() {
echo sprintf( '<a href="%1$s">%2$s</a>',
'https://constant-contact.evyy.net/c/1293104/205991/3411',
'constantcontact.com'
);
}
protected function get_redirect_uri() {
return admin_url( '/?auth=' . self::service_name );
}
protected function menu_page_url( $args = '' ) {
$args = wp_parse_args( $args, array() );
$url = menu_page_url( 'wpcf7-integration', false );
$url = add_query_arg( array( 'service' => self::service_name ), $url );
if ( ! empty( $args) ) {
$url = add_query_arg( $args, $url );
}
return $url;
}
public function load( $action = '' ) {
parent::load( $action );
if ( 'setup' == $action and 'POST' == $_SERVER['REQUEST_METHOD'] ) {
check_admin_referer( 'wpcf7-constant-contact-setup' );
if ( ! empty( $_POST['reset'] ) ) {
$this->reset_data();
} else {
$this->client_id = isset( $_POST['client_id'] )
? trim( $_POST['client_id'] ) : '';
$this->client_secret = isset( $_POST['client_secret'] )
? trim( $_POST['client_secret'] ) : '';
$this->save_data();
$this->authorize( 'contact_data' );
}
wp_safe_redirect( $this->menu_page_url( 'action=setup' ) );
exit();
}
}
public function email_exists( $email ) {
$endpoint = add_query_arg(
array( 'email' => $email ),
'https://api.cc.email/v3/contacts'
);
$request = array(
'method' => 'GET',
'headers' => array(
'Accept' => 'application/json',
'Content-Type' => 'application/json; charset=utf-8',
'Authorization' => $this->get_http_authorization_header( 'bearer' ),
),
);
$response = $this->remote_request( esc_url_raw( $endpoint ), $request );
if ( WP_DEBUG
and 400 <= (int) wp_remote_retrieve_response_code( $response ) ) {
$this->log( $endpoint, $request, $response );
}
$response_body = wp_remote_retrieve_body( $response );
if ( empty( $response_body ) ) {
return false;
}
$response_body = json_decode( $response_body, true );
return ! empty( $response_body['contacts'] );
}
public function create_contact( $properties ) {
$endpoint = 'https://api.cc.email/v3/contacts';
$request = array(
'method' => 'POST',
'headers' => array(
'Accept' => 'application/json',
'Content-Type' => 'application/json; charset=utf-8',
'Authorization' => $this->get_http_authorization_header( 'bearer' ),
),
'body' => json_encode( $properties ),
);
$response = $this->remote_request( esc_url_raw( $endpoint ), $request );
if ( WP_DEBUG
and 400 <= (int) wp_remote_retrieve_response_code( $response ) ) {
$this->log( $endpoint, $request, $response );
}
}
public function display( $action = '' ) {
echo '<p>' . sprintf(
esc_html( __( 'The Constant Contact integration module allows you to send contact data collected through your contact forms to the Constant Contact API. You can create reliable email subscription services in a few easy steps. For details, see %s.', 'contact-form-7' ) ),
wpcf7_link(
__(
'https://contactform7.com/constant-contact-integration/',
'contact-form-7'
),
__( 'Constant Contact Integration', 'contact-form-7' )
)
) . '</p>';
if ( $this->is_active() or 'setup' == $action ) {
$this->display_setup();
} else {
echo sprintf(
'<p><a href="%1$s" class="button">%2$s</a></p>',
esc_url( $this->menu_page_url( 'action=setup' ) ),
esc_html( __( 'Setup Integration', 'contact-form-7' ) )
);
}
}
private function display_setup() {
?>
<form method="post" action="<?php echo esc_url( $this->menu_page_url( 'action=setup' ) ); ?>">
<?php wp_nonce_field( 'wpcf7-constant-contact-setup' ); ?>
<table class="form-table">
<tbody>
<tr>
<th scope="row"><label for="client_id"><?php echo esc_html( __( 'API Key', 'contact-form-7' ) ); ?></label></th>
<td><?php
if ( $this->is_active() ) {
echo esc_html( $this->client_id );
echo sprintf(
'<input type="hidden" value="%1$s" id="client_id" name="client_id" />',
esc_attr( $this->client_id )
);
} else {
echo sprintf(
'<input type="text" aria-required="true" value="%1$s" id="client_id" name="client_id" class="regular-text code" />',
esc_attr( $this->client_id )
);
}
?></td>
</tr>
<tr>
<th scope="row"><label for="client_secret"><?php echo esc_html( __( 'App Secret', 'contact-form-7' ) ); ?></label></th>
<td><?php
if ( $this->is_active() ) {
echo esc_html( wpcf7_mask_password( $this->client_secret ) );
echo sprintf(
'<input type="hidden" value="%1$s" id="client_secret" name="client_secret" />',
esc_attr( $this->client_secret )
);
} else {
echo sprintf(
'<input type="text" aria-required="true" value="%1$s" id="client_secret" name="client_secret" class="regular-text code" />',
esc_attr( $this->client_secret )
);
}
?></td>
</tr>
<tr>
<th scope="row"><label for="redirect_uri"><?php echo esc_html( __( 'Redirect URI', 'contact-form-7' ) ); ?></label></th>
<td><?php
echo sprintf(
'<input type="text" value="%1$s" id="redirect_uri" name="redirect_uri" class="large-text code" readonly="readonly" onfocus="this.select();" style="font-size: 11px;" />',
$this->get_redirect_uri()
);
?>
<p class="description"><?php echo esc_html( __( "Set this URL as the redirect URI.", 'contact-form-7' ) ); ?></p>
</td>
</tr>
</tbody>
</table>
<?php
if ( $this->is_active() ) {
submit_button(
_x( 'Remove Keys', 'API keys', 'contact-form-7' ),
'small', 'reset'
);
} else {
submit_button( __( 'Connect to the Constant Contact API', 'contact-form-7' ) );
}
?>
</form>
<?php
}
}
class WPCF7_ConstantContact_ContactPostRequest {
private $email_address;
private $first_name;
private $last_name;
private $job_title;
private $company_name;
private $create_source;
private $birthday_month;
private $birthday_day;
private $anniversary;
private $custom_fields = array();
private $phone_numbers = array();
private $street_addresses = array();
private $list_memberships = array();
public function __construct() {
}
public function build( WPCF7_Submission $submission ) {
$this->set_create_source( 'Contact' );
$posted_data = (array) $submission->get_posted_data();
if ( isset( $posted_data['your-first-name'] ) ) {
$this->set_first_name( $posted_data['your-first-name'] );
}
if ( isset( $posted_data['your-last-name'] ) ) {
$this->set_last_name( $posted_data['your-last-name'] );
}
if ( ! ( $this->first_name || $this->last_name )
and isset( $posted_data['your-name'] ) ) {
$your_name = preg_split( '/[\s]+/', $posted_data['your-name'], 2 );
$this->set_first_name( array_shift( $your_name ) );
$this->set_last_name( array_shift( $your_name ) );
}
if ( isset( $posted_data['your-email'] ) ) {
$this->set_email_address( $posted_data['your-email'], 'implicit' );
}
if ( isset( $posted_data['your-job-title'] ) ) {
$this->set_job_title( $posted_data['your-job-title'] );
}
if ( isset( $posted_data['your-company-name'] ) ) {
$this->set_company_name( $posted_data['your-company-name'] );
}
if ( isset( $posted_data['your-birthday-month'] )
and isset( $posted_data['your-birthday-day'] ) ) {
$this->set_birthday(
$posted_data['your-birthday-month'],
$posted_data['your-birthday-day']
);
} elseif ( isset( $posted_data['your-birthday'] ) ) {
$date = trim( $posted_data['your-birthday'] );
if ( preg_match( '/^(\d{4})-(\d{2})-(\d{2})$/', $date, $matches ) ) {
$this->set_birthday( $matches[2], $matches[3] );
}
}
if ( isset( $posted_data['your-anniversary'] ) ) {
$this->set_anniversary( $posted_data['your-anniversary'] );
}
if ( isset( $posted_data['your-phone-number'] ) ) {
$this->add_phone_number( $posted_data['your-phone-number'] );
}
$this->add_street_address(
isset( $posted_data['your-address-street'] )
? $posted_data['your-address-street'] : '',
isset( $posted_data['your-address-city'] )
? $posted_data['your-address-city'] : '',
isset( $posted_data['your-address-state'] )
? $posted_data['your-address-state'] : '',
isset( $posted_data['your-address-postal-code'] )
? $posted_data['your-address-postal-code'] : '',
isset( $posted_data['your-address-country'] )
? $posted_data['your-address-country'] : ''
);
}
public function is_valid() {
return $this->create_source
&& ( $this->email_address || $this->first_name || $this->last_name );
}
public function to_array() {
$output = array(
'email_address' => $this->email_address,
'first_name' => $this->first_name,
'last_name' => $this->last_name,
'job_title' => $this->job_title,
'company_name' => $this->company_name,
'create_source' => $this->create_source,
'birthday_month' => $this->birthday_month,
'birthday_day' => $this->birthday_day,
'anniversary' => $this->anniversary,
'custom_fields' => $this->custom_fields,
'phone_numbers' => $this->phone_numbers,
'street_addresses' => $this->street_addresses,
'list_memberships' => $this->list_memberships,
);
return array_filter( $output );
}
public function get_email_address() {
if ( isset( $this->email_address['address'] ) ) {
return $this->email_address['address'];
}
return '';
}
public function set_email_address( $address, $permission_to_send = '' ) {
if ( ! wpcf7_is_email( $address )
or 80 < $this->strlen( $address ) ) {
return false;
}
$types_of_permission = array(
'implicit', 'explicit', 'deprecate', 'pending',
'unsubscribe', 'temp_hold', 'not_set',
);
if ( ! in_array( $permission_to_send, $types_of_permission ) ) {
$permission_to_send = 'implicit';
}
return $this->email_address = array(
'address' => $address,
'permission_to_send' => $permission_to_send,
);
}
public function set_first_name( $first_name ) {
$first_name = trim( $first_name );
if ( empty( $first_name )
or 50 < $this->strlen( $first_name ) ) {
return false;
}
return $this->first_name = $first_name;
}
public function set_last_name( $last_name ) {
$last_name = trim( $last_name );
if ( empty( $last_name )
or 50 < $this->strlen( $last_name ) ) {
return false;
}
return $this->last_name = $last_name;
}
public function set_job_title( $job_title ) {
$job_title = trim( $job_title );
if ( empty( $job_title )
or 50 < $this->strlen( $job_title ) ) {
return false;
}
return $this->job_title = $job_title;
}
public function set_company_name( $company_name ) {
$company_name = trim( $company_name );
if ( empty( $company_name )
or 50 < $this->strlen( $company_name ) ) {
return false;
}
return $this->company_name = $company_name;
}
public function set_create_source( $create_source ) {
if ( ! in_array( $create_source, array( 'Contact', 'Account' ) ) ) {
return false;
}
return $this->create_source = $create_source;
}
public function set_birthday( $month, $day ) {
$month = (int) $month;
$day = (int) $day;
if ( $month < 1 || 12 < $month
or $day < 1 || 31 < $day ) {
return false;
}
$this->birthday_month = $month;
$this->birthday_day = $day;
return array( $this->birthday_month, $this->birthday_day );
}
public function set_anniversary( $anniversary ) {
$pattern = sprintf(
'#^(%s)$#',
implode( '|', array(
'\d{1,2}/\d{1,2}/\d{4}',
'\d{4}/\d{1,2}/\d{1,2}',
'\d{4}-\d{1,2}-\d{1,2}',
'\d{1,2}-\d{1,2}-\d{4}',
) )
);
if ( ! preg_match( $pattern, $anniversary ) ) {
return false;
}
return $this->anniversary = $anniversary;
}
public function add_custom_field( $custom_field_id, $value ) {
$uuid_pattern = '/^[0-9a-f-]+$/i';
$value = trim( $value );
if ( 25 <= count( $this->custom_fields )
or ! preg_match( $uuid_pattern, $custom_field_id )
or 255 < $this->strlen( $value ) ) {
return false;
}
return $this->custom_fields[] = array(
'custom_field_id' => $custom_field_id,
'value' => $value,
);
}
public function add_phone_number( $phone_number, $kind = 'home' ) {
$phone_number = trim( $phone_number );
if ( 2 <= count( $this->phone_numbers )
or ! wpcf7_is_tel( $phone_number )
or 25 < $this->strlen( $phone_number )
or ! in_array( $kind, array( 'home', 'work', 'other' ) ) ) {
return false;
}
return $this->phone_numbers[] = array(
'phone_number' => $phone_number,
'kind' => $kind,
);
}
public function add_street_address( $street, $city, $state, $postal_code, $country, $kind = 'home' ) {
$street = trim( $street );
$city = trim( $city );
$state = trim( $state );
$postal_code = trim( $postal_code );
$country = trim( $country );
if ( ! ( $street || $city || $state || $postal_code || $country )
or 1 <= count( $this->street_addresses )
or ! in_array( $kind, array( 'home', 'work', 'other' ) )
or 255 < $this->strlen( $street )
or 50 < $this->strlen( $city )
or 50 < $this->strlen( $state )
or 50 < $this->strlen( $postal_code )
or 50 < $this->strlen( $country ) ) {
return false;
}
return $this->street_addresses[] = array(
'kind' => $kind,
'street' => $street,
'city' => $city,
'state' => $state,
'postal_code' => $postal_code,
'country' => $country,
);
}
public function add_list_membership( $list_id ) {
$uuid_pattern = '/^[0-9a-f-]+$/i';
if ( 50 <= count( $this->list_memberships )
or ! preg_match( $uuid_pattern, $list_id ) ) {
return false;
}
return $this->list_memberships[] = $list_id;
}
protected function strlen( $string ) {
return wpcf7_count_code_units( stripslashes( $string ) );
}
}

View File

@ -0,0 +1,65 @@
<?php
/**
** A base module for [count], Twitter-like character count
**/
/* form_tag handler */
add_action( 'wpcf7_init', 'wpcf7_add_form_tag_count', 10, 0 );
function wpcf7_add_form_tag_count() {
wpcf7_add_form_tag( 'count',
'wpcf7_count_form_tag_handler',
array(
'name-attr' => true,
'zero-controls-container' => true,
'not-for-mail' => true,
)
);
}
function wpcf7_count_form_tag_handler( $tag ) {
if ( empty( $tag->name ) ) {
return '';
}
$targets = wpcf7_scan_form_tags( array( 'name' => $tag->name ) );
$maxlength = $minlength = null;
while ( $targets ) {
$target = array_shift( $targets );
if ( 'count' != $target->type ) {
$maxlength = $target->get_maxlength_option();
$minlength = $target->get_minlength_option();
break;
}
}
if ( $maxlength and $minlength
and $maxlength < $minlength ) {
$maxlength = $minlength = null;
}
if ( $tag->has_option( 'down' ) ) {
$value = (int) $maxlength;
$class = 'wpcf7-character-count down';
} else {
$value = '0';
$class = 'wpcf7-character-count up';
}
$atts = array();
$atts['id'] = $tag->get_id_option();
$atts['class'] = $tag->get_class_option( $class );
$atts['data-target-name'] = $tag->name;
$atts['data-starting-value'] = $value;
$atts['data-current-value'] = $value;
$atts['data-maximum-value'] = $maxlength;
$atts['data-minimum-value'] = $minlength;
$atts = wpcf7_format_atts( $atts );
$html = sprintf( '<span %1$s>%2$s</span>', $atts, $value );
return $html;
}

View File

@ -0,0 +1,225 @@
<?php
/**
** A base module for the following types of tags:
** [date] and [date*] # Date
**/
/* form_tag handler */
add_action( 'wpcf7_init', 'wpcf7_add_form_tag_date', 10, 0 );
function wpcf7_add_form_tag_date() {
wpcf7_add_form_tag( array( 'date', 'date*' ),
'wpcf7_date_form_tag_handler', array( 'name-attr' => true ) );
}
function wpcf7_date_form_tag_handler( $tag ) {
if ( empty( $tag->name ) ) {
return '';
}
$validation_error = wpcf7_get_validation_error( $tag->name );
$class = wpcf7_form_controls_class( $tag->type );
$class .= ' wpcf7-validates-as-date';
if ( $validation_error ) {
$class .= ' wpcf7-not-valid';
}
$atts = array();
$atts['class'] = $tag->get_class_option( $class );
$atts['id'] = $tag->get_id_option();
$atts['tabindex'] = $tag->get_option( 'tabindex', 'signed_int', true );
$atts['min'] = $tag->get_date_option( 'min' );
$atts['max'] = $tag->get_date_option( 'max' );
$atts['step'] = $tag->get_option( 'step', 'int', true );
if ( $tag->has_option( 'readonly' ) ) {
$atts['readonly'] = 'readonly';
}
if ( $tag->is_required() ) {
$atts['aria-required'] = 'true';
}
$atts['aria-invalid'] = $validation_error ? 'true' : 'false';
$value = (string) reset( $tag->values );
if ( $tag->has_option( 'placeholder' )
or $tag->has_option( 'watermark' ) ) {
$atts['placeholder'] = $value;
$value = '';
}
$value = $tag->get_default_option( $value );
$value = wpcf7_get_hangover( $tag->name, $value );
$atts['value'] = $value;
if ( wpcf7_support_html5() ) {
$atts['type'] = $tag->basetype;
} else {
$atts['type'] = 'text';
}
$atts['name'] = $tag->name;
$atts = wpcf7_format_atts( $atts );
$html = sprintf(
'<span class="wpcf7-form-control-wrap %1$s"><input %2$s />%3$s</span>',
sanitize_html_class( $tag->name ), $atts, $validation_error );
return $html;
}
/* Validation filter */
add_filter( 'wpcf7_validate_date', 'wpcf7_date_validation_filter', 10, 2 );
add_filter( 'wpcf7_validate_date*', 'wpcf7_date_validation_filter', 10, 2 );
function wpcf7_date_validation_filter( $result, $tag ) {
$name = $tag->name;
$min = $tag->get_date_option( 'min' );
$max = $tag->get_date_option( 'max' );
$value = isset( $_POST[$name] )
? trim( strtr( (string) $_POST[$name], "\n", " " ) )
: '';
if ( $tag->is_required() and '' == $value ) {
$result->invalidate( $tag, wpcf7_get_message( 'invalid_required' ) );
} elseif ( '' != $value and ! wpcf7_is_date( $value ) ) {
$result->invalidate( $tag, wpcf7_get_message( 'invalid_date' ) );
} elseif ( '' != $value and ! empty( $min ) and $value < $min ) {
$result->invalidate( $tag, wpcf7_get_message( 'date_too_early' ) );
} elseif ( '' != $value and ! empty( $max ) and $max < $value ) {
$result->invalidate( $tag, wpcf7_get_message( 'date_too_late' ) );
}
return $result;
}
/* Messages */
add_filter( 'wpcf7_messages', 'wpcf7_date_messages', 10, 1 );
function wpcf7_date_messages( $messages ) {
return array_merge( $messages, array(
'invalid_date' => array(
'description' => __( "Date format that the sender entered is invalid", 'contact-form-7' ),
'default' => __( "The date format is incorrect.", 'contact-form-7' )
),
'date_too_early' => array(
'description' => __( "Date is earlier than minimum limit", 'contact-form-7' ),
'default' => __( "The date is before the earliest one allowed.", 'contact-form-7' )
),
'date_too_late' => array(
'description' => __( "Date is later than maximum limit", 'contact-form-7' ),
'default' => __( "The date is after the latest one allowed.", 'contact-form-7' )
),
) );
}
/* Tag generator */
add_action( 'wpcf7_admin_init', 'wpcf7_add_tag_generator_date', 19, 0 );
function wpcf7_add_tag_generator_date() {
$tag_generator = WPCF7_TagGenerator::get_instance();
$tag_generator->add( 'date', __( 'date', 'contact-form-7' ),
'wpcf7_tag_generator_date' );
}
function wpcf7_tag_generator_date( $contact_form, $args = '' ) {
$args = wp_parse_args( $args, array() );
$type = 'date';
$description = __( "Generate a form-tag for a date input field. For more details, see %s.", 'contact-form-7' );
$desc_link = wpcf7_link( __( 'https://contactform7.com/date-field/', 'contact-form-7' ), __( 'Date Field', 'contact-form-7' ) );
?>
<div class="control-box">
<fieldset>
<legend><?php echo sprintf( esc_html( $description ), $desc_link ); ?></legend>
<table class="form-table">
<tbody>
<tr>
<th scope="row"><?php echo esc_html( __( 'Field type', 'contact-form-7' ) ); ?></th>
<td>
<fieldset>
<legend class="screen-reader-text"><?php echo esc_html( __( 'Field type', 'contact-form-7' ) ); ?></legend>
<label><input type="checkbox" name="required" /> <?php echo esc_html( __( 'Required field', 'contact-form-7' ) ); ?></label>
</fieldset>
</td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-name' ); ?>"><?php echo esc_html( __( 'Name', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="name" class="tg-name oneline" id="<?php echo esc_attr( $args['content'] . '-name' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-values' ); ?>"><?php echo esc_html( __( 'Default value', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="values" class="oneline" id="<?php echo esc_attr( $args['content'] . '-values' ); ?>" /><br />
<label><input type="checkbox" name="placeholder" class="option" /> <?php echo esc_html( __( 'Use this text as the placeholder of the field', 'contact-form-7' ) ); ?></label></td>
</tr>
<tr>
<th scope="row"><?php echo esc_html( __( 'Range', 'contact-form-7' ) ); ?></th>
<td>
<fieldset>
<legend class="screen-reader-text"><?php echo esc_html( __( 'Range', 'contact-form-7' ) ); ?></legend>
<label>
<?php echo esc_html( __( 'Min', 'contact-form-7' ) ); ?>
<input type="date" name="min" class="date option" />
</label>
&ndash;
<label>
<?php echo esc_html( __( 'Max', 'contact-form-7' ) ); ?>
<input type="date" name="max" class="date option" />
</label>
</fieldset>
</td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-id' ); ?>"><?php echo esc_html( __( 'Id attribute', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="id" class="idvalue oneline option" id="<?php echo esc_attr( $args['content'] . '-id' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-class' ); ?>"><?php echo esc_html( __( 'Class attribute', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="class" class="classvalue oneline option" id="<?php echo esc_attr( $args['content'] . '-class' ); ?>" /></td>
</tr>
</tbody>
</table>
</fieldset>
</div>
<div class="insert-box">
<input type="text" name="<?php echo $type; ?>" class="tag code" readonly="readonly" onfocus="this.select()" />
<div class="submitbox">
<input type="button" class="button button-primary insert-tag" value="<?php echo esc_attr( __( 'Insert Tag', 'contact-form-7' ) ); ?>" />
</div>
<br class="clear" />
<p class="description mail-tag"><label for="<?php echo esc_attr( $args['content'] . '-mailtag' ); ?>"><?php echo sprintf( esc_html( __( "To use the value input through this field in a mail field, you need to insert the corresponding mail-tag (%s) into the field on the Mail tab.", 'contact-form-7' ) ), '<strong><span class="mail-tag"></span></strong>' ); ?><input type="text" class="mail-tag code hidden" readonly="readonly" id="<?php echo esc_attr( $args['content'] . '-mailtag' ); ?>" /></label></p>
</div>
<?php
}

View File

@ -0,0 +1,465 @@
<?php
/**
** A base module for [file] and [file*]
**/
/* form_tag handler */
add_action( 'wpcf7_init', 'wpcf7_add_form_tag_file', 10, 0 );
function wpcf7_add_form_tag_file() {
wpcf7_add_form_tag( array( 'file', 'file*' ),
'wpcf7_file_form_tag_handler', array( 'name-attr' => true ) );
}
function wpcf7_file_form_tag_handler( $tag ) {
if ( empty( $tag->name ) ) {
return '';
}
$validation_error = wpcf7_get_validation_error( $tag->name );
$class = wpcf7_form_controls_class( $tag->type );
if ( $validation_error ) {
$class .= ' wpcf7-not-valid';
}
$atts = array();
$atts['size'] = $tag->get_size_option( '40' );
$atts['class'] = $tag->get_class_option( $class );
$atts['id'] = $tag->get_id_option();
$atts['tabindex'] = $tag->get_option( 'tabindex', 'signed_int', true );
$atts['accept'] = wpcf7_acceptable_filetypes(
$tag->get_option( 'filetypes' ), 'attr' );
if ( $tag->is_required() ) {
$atts['aria-required'] = 'true';
}
$atts['aria-invalid'] = $validation_error ? 'true' : 'false';
$atts['type'] = 'file';
$atts['name'] = $tag->name;
$atts = wpcf7_format_atts( $atts );
$html = sprintf(
'<span class="wpcf7-form-control-wrap %1$s"><input %2$s />%3$s</span>',
sanitize_html_class( $tag->name ), $atts, $validation_error );
return $html;
}
/* Encode type filter */
add_filter( 'wpcf7_form_enctype', 'wpcf7_file_form_enctype_filter', 10, 1 );
function wpcf7_file_form_enctype_filter( $enctype ) {
$multipart = (bool) wpcf7_scan_form_tags(
array( 'type' => array( 'file', 'file*' ) ) );
if ( $multipart ) {
$enctype = 'multipart/form-data';
}
return $enctype;
}
/* Validation + upload handling filter */
add_filter( 'wpcf7_validate_file', 'wpcf7_file_validation_filter', 10, 2 );
add_filter( 'wpcf7_validate_file*', 'wpcf7_file_validation_filter', 10, 2 );
function wpcf7_file_validation_filter( $result, $tag ) {
$name = $tag->name;
$id = $tag->get_id_option();
$file = isset( $_FILES[$name] ) ? $_FILES[$name] : null;
if ( $file['error'] and UPLOAD_ERR_NO_FILE != $file['error'] ) {
$result->invalidate( $tag, wpcf7_get_message( 'upload_failed_php_error' ) );
return $result;
}
if ( empty( $file['tmp_name'] ) and $tag->is_required() ) {
$result->invalidate( $tag, wpcf7_get_message( 'invalid_required' ) );
return $result;
}
if ( ! is_uploaded_file( $file['tmp_name'] ) ) {
return $result;
}
/* File type validation */
$file_type_pattern = wpcf7_acceptable_filetypes(
$tag->get_option( 'filetypes' ), 'regex' );
$file_type_pattern = '/\.(' . $file_type_pattern . ')$/i';
if ( ! preg_match( $file_type_pattern, $file['name'] ) ) {
$result->invalidate( $tag,
wpcf7_get_message( 'upload_file_type_invalid' ) );
return $result;
}
/* File size validation */
$allowed_size = 1048576; // default size 1 MB
if ( $file_size_a = $tag->get_option( 'limit' ) ) {
$limit_pattern = '/^([1-9][0-9]*)([kKmM]?[bB])?$/';
foreach ( $file_size_a as $file_size ) {
if ( preg_match( $limit_pattern, $file_size, $matches ) ) {
$allowed_size = (int) $matches[1];
if ( ! empty( $matches[2] ) ) {
$kbmb = strtolower( $matches[2] );
if ( 'kb' == $kbmb ) {
$allowed_size *= 1024;
} elseif ( 'mb' == $kbmb ) {
$allowed_size *= 1024 * 1024;
}
}
break;
}
}
}
if ( $file['size'] > $allowed_size ) {
$result->invalidate( $tag, wpcf7_get_message( 'upload_file_too_large' ) );
return $result;
}
wpcf7_init_uploads(); // Confirm upload dir
$uploads_dir = wpcf7_upload_tmp_dir();
$uploads_dir = wpcf7_maybe_add_random_dir( $uploads_dir );
$filename = $file['name'];
$filename = wpcf7_canonicalize( $filename, 'as-is' );
$filename = wpcf7_antiscript_file_name( $filename );
$filename = apply_filters( 'wpcf7_upload_file_name', $filename,
$file['name'], $tag );
$filename = wp_unique_filename( $uploads_dir, $filename );
$new_file = path_join( $uploads_dir, $filename );
if ( false === @move_uploaded_file( $file['tmp_name'], $new_file ) ) {
$result->invalidate( $tag, wpcf7_get_message( 'upload_failed' ) );
return $result;
}
// Make sure the uploaded file is only readable for the owner process
chmod( $new_file, 0400 );
if ( $submission = WPCF7_Submission::get_instance() ) {
$submission->add_uploaded_file( $name, $new_file );
}
return $result;
}
/* Messages */
add_filter( 'wpcf7_messages', 'wpcf7_file_messages', 10, 1 );
function wpcf7_file_messages( $messages ) {
return array_merge( $messages, array(
'upload_failed' => array(
'description' => __( "Uploading a file fails for any reason", 'contact-form-7' ),
'default' => __( "There was an unknown error uploading the file.", 'contact-form-7' )
),
'upload_file_type_invalid' => array(
'description' => __( "Uploaded file is not allowed for file type", 'contact-form-7' ),
'default' => __( "You are not allowed to upload files of this type.", 'contact-form-7' )
),
'upload_file_too_large' => array(
'description' => __( "Uploaded file is too large", 'contact-form-7' ),
'default' => __( "The file is too big.", 'contact-form-7' )
),
'upload_failed_php_error' => array(
'description' => __( "Uploading a file fails for PHP error", 'contact-form-7' ),
'default' => __( "There was an error uploading the file.", 'contact-form-7' )
)
) );
}
/* Tag generator */
add_action( 'wpcf7_admin_init', 'wpcf7_add_tag_generator_file', 50, 0 );
function wpcf7_add_tag_generator_file() {
$tag_generator = WPCF7_TagGenerator::get_instance();
$tag_generator->add( 'file', __( 'file', 'contact-form-7' ),
'wpcf7_tag_generator_file' );
}
function wpcf7_tag_generator_file( $contact_form, $args = '' ) {
$args = wp_parse_args( $args, array() );
$type = 'file';
$description = __( "Generate a form-tag for a file uploading field. For more details, see %s.", 'contact-form-7' );
$desc_link = wpcf7_link( __( 'https://contactform7.com/file-uploading-and-attachment/', 'contact-form-7' ), __( 'File Uploading and Attachment', 'contact-form-7' ) );
?>
<div class="control-box">
<fieldset>
<legend><?php echo sprintf( esc_html( $description ), $desc_link ); ?></legend>
<table class="form-table">
<tbody>
<tr>
<th scope="row"><?php echo esc_html( __( 'Field type', 'contact-form-7' ) ); ?></th>
<td>
<fieldset>
<legend class="screen-reader-text"><?php echo esc_html( __( 'Field type', 'contact-form-7' ) ); ?></legend>
<label><input type="checkbox" name="required" /> <?php echo esc_html( __( 'Required field', 'contact-form-7' ) ); ?></label>
</fieldset>
</td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-name' ); ?>"><?php echo esc_html( __( 'Name', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="name" class="tg-name oneline" id="<?php echo esc_attr( $args['content'] . '-name' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-limit' ); ?>"><?php echo esc_html( __( "File size limit (bytes)", 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="limit" class="filesize oneline option" id="<?php echo esc_attr( $args['content'] . '-limit' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-filetypes' ); ?>"><?php echo esc_html( __( 'Acceptable file types', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="filetypes" class="filetype oneline option" id="<?php echo esc_attr( $args['content'] . '-filetypes' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-id' ); ?>"><?php echo esc_html( __( 'Id attribute', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="id" class="idvalue oneline option" id="<?php echo esc_attr( $args['content'] . '-id' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-class' ); ?>"><?php echo esc_html( __( 'Class attribute', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="class" class="classvalue oneline option" id="<?php echo esc_attr( $args['content'] . '-class' ); ?>" /></td>
</tr>
</tbody>
</table>
</fieldset>
</div>
<div class="insert-box">
<input type="text" name="<?php echo $type; ?>" class="tag code" readonly="readonly" onfocus="this.select()" />
<div class="submitbox">
<input type="button" class="button button-primary insert-tag" value="<?php echo esc_attr( __( 'Insert Tag', 'contact-form-7' ) ); ?>" />
</div>
<br class="clear" />
<p class="description mail-tag"><label for="<?php echo esc_attr( $args['content'] . '-mailtag' ); ?>"><?php echo sprintf( esc_html( __( "To attach the file uploaded through this field to mail, you need to insert the corresponding mail-tag (%s) into the File Attachments field on the Mail tab.", 'contact-form-7' ) ), '<strong><span class="mail-tag"></span></strong>' ); ?><input type="text" class="mail-tag code hidden" readonly="readonly" id="<?php echo esc_attr( $args['content'] . '-mailtag' ); ?>" /></label></p>
</div>
<?php
}
/* Warning message */
add_action( 'wpcf7_admin_warnings',
'wpcf7_file_display_warning_message', 10, 3 );
function wpcf7_file_display_warning_message( $page, $action, $object ) {
if ( $object instanceof WPCF7_ContactForm ) {
$contact_form = $object;
} else {
return;
}
$has_tags = (bool) $contact_form->scan_form_tags(
array( 'type' => array( 'file', 'file*' ) ) );
if ( ! $has_tags ) {
return;
}
$uploads_dir = wpcf7_upload_tmp_dir();
wpcf7_init_uploads();
if ( ! is_dir( $uploads_dir )
or ! wp_is_writable( $uploads_dir ) ) {
$message = sprintf( __( 'This contact form contains file uploading fields, but the temporary folder for the files (%s) does not exist or is not writable. You can create the folder or change its permission manually.', 'contact-form-7' ), $uploads_dir );
echo sprintf( '<div class="notice notice-warning"><p>%s</p></div>',
esc_html( $message ) );
}
}
/* File uploading functions */
function wpcf7_acceptable_filetypes( $types = 'default', $format = 'regex' ) {
if ( 'default' === $types
or empty( $types ) ) {
$types = array(
'jpg',
'jpeg',
'png',
'gif',
'pdf',
'doc',
'docx',
'ppt',
'pptx',
'odt',
'avi',
'ogg',
'm4a',
'mov',
'mp3',
'mp4',
'mpg',
'wav',
'wmv',
);
} else {
$types_tmp = (array) $types;
$types = array();
foreach ( $types_tmp as $val ) {
if ( is_string( $val ) ) {
$val = preg_split( '/[\s|,]+/', $val );
}
$types = array_merge( $types, (array) $val );
}
}
$types = array_unique( array_filter( $types ) );
$output = '';
foreach ( $types as $type ) {
$type = trim( $type, ' ,.|' );
$type = str_replace(
array( '.', '+', '*', '?' ),
array( '\.', '\+', '\*', '\?' ),
$type );
if ( '' === $type ) {
continue;
}
if ( 'attr' === $format
or 'attribute' === $format ) {
$output .= sprintf( '.%s', $type );
$output .= ',';
} else {
$output .= $type;
$output .= '|';
}
}
return trim( $output, ' ,|' );
}
function wpcf7_init_uploads() {
$dir = wpcf7_upload_tmp_dir();
wp_mkdir_p( $dir );
$htaccess_file = path_join( $dir, '.htaccess' );
if ( file_exists( $htaccess_file ) ) {
return;
}
if ( $handle = fopen( $htaccess_file, 'w' ) ) {
fwrite( $handle, "Deny from all\n" );
fclose( $handle );
}
}
function wpcf7_maybe_add_random_dir( $dir ) {
do {
$rand_max = mt_getrandmax();
$rand = zeroise( mt_rand( 0, $rand_max ), strlen( $rand_max ) );
$dir_new = path_join( $dir, $rand );
} while ( file_exists( $dir_new ) );
if ( wp_mkdir_p( $dir_new ) ) {
return $dir_new;
}
return $dir;
}
function wpcf7_upload_tmp_dir() {
if ( defined( 'WPCF7_UPLOADS_TMP_DIR' ) ) {
return WPCF7_UPLOADS_TMP_DIR;
} else {
return path_join( wpcf7_upload_dir( 'dir' ), 'wpcf7_uploads' );
}
}
add_action( 'template_redirect', 'wpcf7_cleanup_upload_files', 20, 0 );
function wpcf7_cleanup_upload_files( $seconds = 60, $max = 100 ) {
if ( is_admin()
or 'GET' != $_SERVER['REQUEST_METHOD']
or is_robots()
or is_feed()
or is_trackback() ) {
return;
}
$dir = trailingslashit( wpcf7_upload_tmp_dir() );
if ( ! is_dir( $dir )
or ! is_readable( $dir )
or ! wp_is_writable( $dir ) ) {
return;
}
$seconds = absint( $seconds );
$max = absint( $max );
$count = 0;
if ( $handle = opendir( $dir ) ) {
while ( false !== ( $file = readdir( $handle ) ) ) {
if ( '.' == $file
or '..' == $file
or '.htaccess' == $file ) {
continue;
}
$mtime = filemtime( path_join( $dir, $file ) );
if ( $mtime and time() < $mtime + $seconds ) { // less than $seconds old
continue;
}
wpcf7_rmdir_p( path_join( $dir, $file ) );
$count += 1;
if ( $max <= $count ) {
break;
}
}
closedir( $handle );
}
}

View File

@ -0,0 +1,270 @@
<?php
/**
** Module for Flamingo plugin.
** http://wordpress.org/extend/plugins/flamingo/
**/
add_action( 'wpcf7_submit', 'wpcf7_flamingo_submit', 10, 2 );
function wpcf7_flamingo_submit( $contact_form, $result ) {
if ( ! class_exists( 'Flamingo_Contact' )
or ! class_exists( 'Flamingo_Inbound_Message' ) ) {
return;
}
if ( $contact_form->in_demo_mode() ) {
return;
}
$cases = (array) apply_filters( 'wpcf7_flamingo_submit_if',
array( 'spam', 'mail_sent', 'mail_failed' ) );
if ( empty( $result['status'] )
or ! in_array( $result['status'], $cases ) ) {
return;
}
$submission = WPCF7_Submission::get_instance();
if ( ! $submission
or ! $posted_data = $submission->get_posted_data() ) {
return;
}
if ( $submission->get_meta( 'do_not_store' ) ) {
return;
}
$fields_senseless =
$contact_form->scan_form_tags( array( 'feature' => 'do-not-store' ) );
$exclude_names = array();
foreach ( $fields_senseless as $tag ) {
$exclude_names[] = $tag['name'];
}
$exclude_names[] = 'g-recaptcha-response';
foreach ( $posted_data as $key => $value ) {
if ( '_' == substr( $key, 0, 1 )
or in_array( $key, $exclude_names ) ) {
unset( $posted_data[$key] );
}
}
$email = wpcf7_flamingo_get_value( 'email', $contact_form );
$name = wpcf7_flamingo_get_value( 'name', $contact_form );
$subject = wpcf7_flamingo_get_value( 'subject', $contact_form );
$meta = array();
$special_mail_tags = array( 'serial_number', 'remote_ip',
'user_agent', 'url', 'date', 'time', 'post_id', 'post_name',
'post_title', 'post_url', 'post_author', 'post_author_email',
'site_title', 'site_description', 'site_url', 'site_admin_email',
'user_login', 'user_email', 'user_display_name' );
foreach ( $special_mail_tags as $smt ) {
$meta[$smt] = apply_filters( 'wpcf7_special_mail_tags', '',
sprintf( '_%s', $smt ), false );
}
$akismet = isset( $submission->akismet )
? (array) $submission->akismet : null;
if ( 'mail_sent' == $result['status'] ) {
$flamingo_contact = Flamingo_Contact::add( array(
'email' => $email,
'name' => $name,
) );
}
$post_meta = get_post_meta( $contact_form->id(), '_flamingo', true );
$channel_id = isset( $post_meta['channel'] )
? (int) $post_meta['channel']
: wpcf7_flamingo_add_channel(
$contact_form->name(), $contact_form->title() );
if ( $channel_id ) {
if ( ! isset( $post_meta['channel'] )
or $post_meta['channel'] !== $channel_id ) {
$post_meta = empty( $post_meta ) ? array() : (array) $post_meta;
$post_meta = array_merge( $post_meta, array(
'channel' => $channel_id,
) );
update_post_meta( $contact_form->id(), '_flamingo', $post_meta );
}
$channel = get_term( $channel_id,
Flamingo_Inbound_Message::channel_taxonomy );
if ( ! $channel or is_wp_error( $channel ) ) {
$channel = 'contact-form-7';
} else {
$channel = $channel->slug;
}
} else {
$channel = 'contact-form-7';
}
$args = array(
'channel' => $channel,
'subject' => $subject,
'from' => trim( sprintf( '%s <%s>', $name, $email ) ),
'from_name' => $name,
'from_email' => $email,
'fields' => $posted_data,
'meta' => $meta,
'akismet' => $akismet,
'spam' => ( 'spam' == $result['status'] ),
'consent' => $submission->collect_consent(),
);
$flamingo_inbound = Flamingo_Inbound_Message::add( $args );
$result += array(
'flamingo_contact_id' =>
empty( $flamingo_contact ) ? 0 : absint( $flamingo_contact->id ),
'flamingo_inbound_id' =>
empty( $flamingo_inbound ) ? 0 : absint( $flamingo_inbound->id ),
);
do_action( 'wpcf7_after_flamingo', $result );
}
function wpcf7_flamingo_get_value( $field, $contact_form ) {
if ( empty( $field )
or empty( $contact_form ) ) {
return false;
}
$value = '';
if ( in_array( $field, array( 'email', 'name', 'subject' ) ) ) {
$templates = $contact_form->additional_setting( 'flamingo_' . $field );
if ( empty( $templates[0] ) ) {
$template = sprintf( '[your-%s]', $field );
} else {
$template = trim( wpcf7_strip_quote( $templates[0] ) );
}
$value = wpcf7_mail_replace_tags( $template );
}
$value = apply_filters( 'wpcf7_flamingo_get_value', $value,
$field, $contact_form );
return $value;
}
function wpcf7_flamingo_add_channel( $slug, $name = '' ) {
if ( ! class_exists( 'Flamingo_Inbound_Message' ) ) {
return false;
}
$parent = term_exists( 'contact-form-7',
Flamingo_Inbound_Message::channel_taxonomy );
if ( ! $parent ) {
$parent = wp_insert_term( __( 'Contact Form 7', 'contact-form-7' ),
Flamingo_Inbound_Message::channel_taxonomy,
array( 'slug' => 'contact-form-7' ) );
if ( is_wp_error( $parent ) ) {
return false;
}
}
$parent = (int) $parent['term_id'];
if ( ! is_taxonomy_hierarchical( Flamingo_Inbound_Message::channel_taxonomy ) ) {
// backward compat for Flamingo 1.0.4 and lower
return $parent;
}
if ( empty( $name ) ) {
$name = $slug;
}
$channel = term_exists( $slug,
Flamingo_Inbound_Message::channel_taxonomy,
$parent );
if ( ! $channel ) {
$channel = wp_insert_term( $name,
Flamingo_Inbound_Message::channel_taxonomy,
array( 'slug' => $slug, 'parent' => $parent ) );
if ( is_wp_error( $channel ) ) {
return false;
}
}
return (int) $channel['term_id'];
}
add_action( 'wpcf7_after_update', 'wpcf7_flamingo_update_channel', 10, 1 );
function wpcf7_flamingo_update_channel( $contact_form ) {
if ( ! class_exists( 'Flamingo_Inbound_Message' ) ) {
return false;
}
$post_meta = get_post_meta( $contact_form->id(), '_flamingo', true );
$channel = isset( $post_meta['channel'] )
? get_term( $post_meta['channel'],
Flamingo_Inbound_Message::channel_taxonomy )
: get_term_by( 'slug', $contact_form->name(),
Flamingo_Inbound_Message::channel_taxonomy );
if ( ! $channel or is_wp_error( $channel ) ) {
return;
}
if ( $channel->name !== wp_unslash( $contact_form->title() ) ) {
wp_update_term( $channel->term_id,
Flamingo_Inbound_Message::channel_taxonomy,
array(
'name' => $contact_form->title(),
'slug' => $contact_form->name(),
'parent' => $channel->parent,
)
);
}
}
add_filter( 'wpcf7_special_mail_tags', 'wpcf7_flamingo_serial_number', 10, 3 );
function wpcf7_flamingo_serial_number( $output, $name, $html ) {
if ( '_serial_number' != $name ) {
return $output;
}
if ( ! class_exists( 'Flamingo_Inbound_Message' )
or ! method_exists( 'Flamingo_Inbound_Message', 'count' ) ) {
return $output;
}
if ( ! $contact_form = WPCF7_ContactForm::get_current() ) {
return $output;
}
$post_meta = get_post_meta( $contact_form->id(), '_flamingo', true );
$channel_id = isset( $post_meta['channel'] )
? (int) $post_meta['channel']
: wpcf7_flamingo_add_channel(
$contact_form->name(), $contact_form->title() );
if ( $channel_id ) {
return 1 + (int) Flamingo_Inbound_Message::count(
array( 'channel_id' => $channel_id ) );
}
return 0;
}

View File

@ -0,0 +1,36 @@
<?php
add_action( 'wpcf7_init', 'wpcf7_add_form_tag_hidden', 10, 0 );
function wpcf7_add_form_tag_hidden() {
wpcf7_add_form_tag( 'hidden',
'wpcf7_hidden_form_tag_handler',
array(
'name-attr' => true,
'display-hidden' => true,
)
);
}
function wpcf7_hidden_form_tag_handler( $tag ) {
if ( empty( $tag->name ) ) {
return '';
}
$atts = array();
$class = wpcf7_form_controls_class( $tag->type );
$atts['class'] = $tag->get_class_option( $class );
$atts['id'] = $tag->get_id_option();
$value = (string) reset( $tag->values );
$value = $tag->get_default_option( $value );
$atts['value'] = $value;
$atts['type'] = 'hidden';
$atts['name'] = $tag->name;
$atts = wpcf7_format_atts( $atts );
$html = sprintf( '<input %s />', $atts );
return $html;
}

View File

@ -0,0 +1,30 @@
<?php
/**
** Retrieve list data from the Listo plugin.
** Listo http://wordpress.org/plugins/listo/
**/
add_filter( 'wpcf7_form_tag_data_option', 'wpcf7_listo', 10, 3 );
function wpcf7_listo( $data, $options, $args ) {
if ( ! function_exists( 'listo' ) ) {
return $data;
}
$args = wp_parse_args( $args, array() );
$contact_form = wpcf7_get_current_contact_form();
$args['locale'] = $contact_form->locale();
foreach ( (array) $options as $option ) {
$option = explode( '.', $option );
$type = $option[0];
$args['group'] = isset( $option[1] ) ? $option[1] : null;
if ( $list = listo( $type, $args ) ) {
$data = array_merge( (array) $data, $list );
}
}
return $data;
}

View File

@ -0,0 +1,233 @@
<?php
/**
** A base module for the following types of tags:
** [number] and [number*] # Number
** [range] and [range*] # Range
**/
/* form_tag handler */
add_action( 'wpcf7_init', 'wpcf7_add_form_tag_number', 10, 0 );
function wpcf7_add_form_tag_number() {
wpcf7_add_form_tag( array( 'number', 'number*', 'range', 'range*' ),
'wpcf7_number_form_tag_handler', array( 'name-attr' => true ) );
}
function wpcf7_number_form_tag_handler( $tag ) {
if ( empty( $tag->name ) ) {
return '';
}
$validation_error = wpcf7_get_validation_error( $tag->name );
$class = wpcf7_form_controls_class( $tag->type );
$class .= ' wpcf7-validates-as-number';
if ( $validation_error ) {
$class .= ' wpcf7-not-valid';
}
$atts = array();
$atts['class'] = $tag->get_class_option( $class );
$atts['id'] = $tag->get_id_option();
$atts['tabindex'] = $tag->get_option( 'tabindex', 'signed_int', true );
$atts['min'] = $tag->get_option( 'min', 'signed_int', true );
$atts['max'] = $tag->get_option( 'max', 'signed_int', true );
$atts['step'] = $tag->get_option( 'step', 'int', true );
if ( $tag->has_option( 'readonly' ) ) {
$atts['readonly'] = 'readonly';
}
if ( $tag->is_required() ) {
$atts['aria-required'] = 'true';
}
$atts['aria-invalid'] = $validation_error ? 'true' : 'false';
$value = (string) reset( $tag->values );
if ( $tag->has_option( 'placeholder' )
or $tag->has_option( 'watermark' ) ) {
$atts['placeholder'] = $value;
$value = '';
}
$value = $tag->get_default_option( $value );
$value = wpcf7_get_hangover( $tag->name, $value );
$atts['value'] = $value;
if ( wpcf7_support_html5() ) {
$atts['type'] = $tag->basetype;
} else {
$atts['type'] = 'text';
}
$atts['name'] = $tag->name;
$atts = wpcf7_format_atts( $atts );
$html = sprintf(
'<span class="wpcf7-form-control-wrap %1$s"><input %2$s />%3$s</span>',
sanitize_html_class( $tag->name ), $atts, $validation_error );
return $html;
}
/* Validation filter */
add_filter( 'wpcf7_validate_number', 'wpcf7_number_validation_filter', 10, 2 );
add_filter( 'wpcf7_validate_number*', 'wpcf7_number_validation_filter', 10, 2 );
add_filter( 'wpcf7_validate_range', 'wpcf7_number_validation_filter', 10, 2 );
add_filter( 'wpcf7_validate_range*', 'wpcf7_number_validation_filter', 10, 2 );
function wpcf7_number_validation_filter( $result, $tag ) {
$name = $tag->name;
$value = isset( $_POST[$name] )
? trim( strtr( (string) $_POST[$name], "\n", " " ) )
: '';
$min = $tag->get_option( 'min', 'signed_int', true );
$max = $tag->get_option( 'max', 'signed_int', true );
if ( $tag->is_required() and '' == $value ) {
$result->invalidate( $tag, wpcf7_get_message( 'invalid_required' ) );
} elseif ( '' != $value and ! wpcf7_is_number( $value ) ) {
$result->invalidate( $tag, wpcf7_get_message( 'invalid_number' ) );
} elseif ( '' != $value and '' != $min and (float) $value < (float) $min ) {
$result->invalidate( $tag, wpcf7_get_message( 'number_too_small' ) );
} elseif ( '' != $value and '' != $max and (float) $max < (float) $value ) {
$result->invalidate( $tag, wpcf7_get_message( 'number_too_large' ) );
}
return $result;
}
/* Messages */
add_filter( 'wpcf7_messages', 'wpcf7_number_messages', 10, 1 );
function wpcf7_number_messages( $messages ) {
return array_merge( $messages, array(
'invalid_number' => array(
'description' => __( "Number format that the sender entered is invalid", 'contact-form-7' ),
'default' => __( "The number format is invalid.", 'contact-form-7' )
),
'number_too_small' => array(
'description' => __( "Number is smaller than minimum limit", 'contact-form-7' ),
'default' => __( "The number is smaller than the minimum allowed.", 'contact-form-7' )
),
'number_too_large' => array(
'description' => __( "Number is larger than maximum limit", 'contact-form-7' ),
'default' => __( "The number is larger than the maximum allowed.", 'contact-form-7' )
),
) );
}
/* Tag generator */
add_action( 'wpcf7_admin_init', 'wpcf7_add_tag_generator_number', 18, 0 );
function wpcf7_add_tag_generator_number() {
$tag_generator = WPCF7_TagGenerator::get_instance();
$tag_generator->add( 'number', __( 'number', 'contact-form-7' ),
'wpcf7_tag_generator_number' );
}
function wpcf7_tag_generator_number( $contact_form, $args = '' ) {
$args = wp_parse_args( $args, array() );
$type = 'number';
$description = __( "Generate a form-tag for a field for numeric value input. For more details, see %s.", 'contact-form-7' );
$desc_link = wpcf7_link( __( 'https://contactform7.com/number-fields/', 'contact-form-7' ), __( 'Number Fields', 'contact-form-7' ) );
?>
<div class="control-box">
<fieldset>
<legend><?php echo sprintf( esc_html( $description ), $desc_link ); ?></legend>
<table class="form-table">
<tbody>
<tr>
<th scope="row"><?php echo esc_html( __( 'Field type', 'contact-form-7' ) ); ?></th>
<td>
<fieldset>
<legend class="screen-reader-text"><?php echo esc_html( __( 'Field type', 'contact-form-7' ) ); ?></legend>
<select name="tagtype">
<option value="number" selected="selected"><?php echo esc_html( __( 'Spinbox', 'contact-form-7' ) ); ?></option>
<option value="range"><?php echo esc_html( __( 'Slider', 'contact-form-7' ) ); ?></option>
</select>
<br />
<label><input type="checkbox" name="required" /> <?php echo esc_html( __( 'Required field', 'contact-form-7' ) ); ?></label>
</fieldset>
</td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-name' ); ?>"><?php echo esc_html( __( 'Name', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="name" class="tg-name oneline" id="<?php echo esc_attr( $args['content'] . '-name' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-values' ); ?>"><?php echo esc_html( __( 'Default value', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="values" class="oneline" id="<?php echo esc_attr( $args['content'] . '-values' ); ?>" /><br />
<label><input type="checkbox" name="placeholder" class="option" /> <?php echo esc_html( __( 'Use this text as the placeholder of the field', 'contact-form-7' ) ); ?></label></td>
</tr>
<tr>
<th scope="row"><?php echo esc_html( __( 'Range', 'contact-form-7' ) ); ?></th>
<td>
<fieldset>
<legend class="screen-reader-text"><?php echo esc_html( __( 'Range', 'contact-form-7' ) ); ?></legend>
<label>
<?php echo esc_html( __( 'Min', 'contact-form-7' ) ); ?>
<input type="number" name="min" class="numeric option" />
</label>
&ndash;
<label>
<?php echo esc_html( __( 'Max', 'contact-form-7' ) ); ?>
<input type="number" name="max" class="numeric option" />
</label>
</fieldset>
</td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-id' ); ?>"><?php echo esc_html( __( 'Id attribute', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="id" class="idvalue oneline option" id="<?php echo esc_attr( $args['content'] . '-id' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-class' ); ?>"><?php echo esc_html( __( 'Class attribute', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="class" class="classvalue oneline option" id="<?php echo esc_attr( $args['content'] . '-class' ); ?>" /></td>
</tr>
</tbody>
</table>
</fieldset>
</div>
<div class="insert-box">
<input type="text" name="<?php echo $type; ?>" class="tag code" readonly="readonly" onfocus="this.select()" />
<div class="submitbox">
<input type="button" class="button button-primary insert-tag" value="<?php echo esc_attr( __( 'Insert Tag', 'contact-form-7' ) ); ?>" />
</div>
<br class="clear" />
<p class="description mail-tag"><label for="<?php echo esc_attr( $args['content'] . '-mailtag' ); ?>"><?php echo sprintf( esc_html( __( "To use the value input through this field in a mail field, you need to insert the corresponding mail-tag (%s) into the field on the Mail tab.", 'contact-form-7' ) ), '<strong><span class="mail-tag"></span></strong>' ); ?><input type="text" class="mail-tag code hidden" readonly="readonly" id="<?php echo esc_attr( $args['content'] . '-mailtag' ); ?>" /></label></p>
</div>
<?php
}

View File

@ -0,0 +1,238 @@
<?php
/**
** A base module for [quiz]
**/
/* form_tag handler */
add_action( 'wpcf7_init', 'wpcf7_add_form_tag_quiz', 10, 0 );
function wpcf7_add_form_tag_quiz() {
wpcf7_add_form_tag( 'quiz',
'wpcf7_quiz_form_tag_handler',
array(
'name-attr' => true,
'do-not-store' => true,
'not-for-mail' => true,
)
);
}
function wpcf7_quiz_form_tag_handler( $tag ) {
if ( empty( $tag->name ) ) {
return '';
}
$validation_error = wpcf7_get_validation_error( $tag->name );
$class = wpcf7_form_controls_class( $tag->type );
if ( $validation_error ) {
$class .= ' wpcf7-not-valid';
}
$atts = array();
$atts['size'] = $tag->get_size_option( '40' );
$atts['maxlength'] = $tag->get_maxlength_option();
$atts['minlength'] = $tag->get_minlength_option();
if ( $atts['maxlength'] and $atts['minlength']
and $atts['maxlength'] < $atts['minlength'] ) {
unset( $atts['maxlength'], $atts['minlength'] );
}
$atts['class'] = $tag->get_class_option( $class );
$atts['id'] = $tag->get_id_option();
$atts['tabindex'] = $tag->get_option( 'tabindex', 'signed_int', true );
$atts['autocomplete'] = 'off';
$atts['aria-required'] = 'true';
$atts['aria-invalid'] = $validation_error ? 'true' : 'false';
$pipes = $tag->pipes;
if ( $pipes instanceof WPCF7_Pipes
and ! $pipes->zero() ) {
$pipe = $pipes->random_pipe();
$question = $pipe->before;
$answer = $pipe->after;
} else {
// default quiz
$question = '1+1=?';
$answer = '2';
}
$answer = wpcf7_canonicalize( $answer );
$atts['type'] = 'text';
$atts['name'] = $tag->name;
$atts = wpcf7_format_atts( $atts );
$html = sprintf(
'<span class="wpcf7-form-control-wrap %1$s"><label><span class="wpcf7-quiz-label">%2$s</span> <input %3$s /></label><input type="hidden" name="_wpcf7_quiz_answer_%4$s" value="%5$s" />%6$s</span>',
sanitize_html_class( $tag->name ),
esc_html( $question ), $atts, $tag->name,
wp_hash( $answer, 'wpcf7_quiz' ), $validation_error );
return $html;
}
/* Validation filter */
add_filter( 'wpcf7_validate_quiz', 'wpcf7_quiz_validation_filter', 10, 2 );
function wpcf7_quiz_validation_filter( $result, $tag ) {
$name = $tag->name;
$answer = isset( $_POST[$name] ) ? wpcf7_canonicalize( $_POST[$name] ) : '';
$answer = wp_unslash( $answer );
$answer_hash = wp_hash( $answer, 'wpcf7_quiz' );
$expected_hash = isset( $_POST['_wpcf7_quiz_answer_' . $name] )
? (string) $_POST['_wpcf7_quiz_answer_' . $name]
: '';
if ( $answer_hash != $expected_hash ) {
$result->invalidate( $tag, wpcf7_get_message( 'quiz_answer_not_correct' ) );
}
return $result;
}
/* Ajax echo filter */
add_filter( 'wpcf7_ajax_onload', 'wpcf7_quiz_ajax_refill', 10, 1 );
add_filter( 'wpcf7_ajax_json_echo', 'wpcf7_quiz_ajax_refill', 10, 1 );
function wpcf7_quiz_ajax_refill( $items ) {
if ( ! is_array( $items ) ) {
return $items;
}
$fes = wpcf7_scan_form_tags( array( 'type' => 'quiz' ) );
if ( empty( $fes ) ) {
return $items;
}
$refill = array();
foreach ( $fes as $fe ) {
$name = $fe['name'];
$pipes = $fe['pipes'];
if ( empty( $name ) ) {
continue;
}
if ( $pipes instanceof WPCF7_Pipes
and ! $pipes->zero() ) {
$pipe = $pipes->random_pipe();
$question = $pipe->before;
$answer = $pipe->after;
} else {
// default quiz
$question = '1+1=?';
$answer = '2';
}
$answer = wpcf7_canonicalize( $answer );
$refill[$name] = array( $question, wp_hash( $answer, 'wpcf7_quiz' ) );
}
if ( ! empty( $refill ) ) {
$items['quiz'] = $refill;
}
return $items;
}
/* Messages */
add_filter( 'wpcf7_messages', 'wpcf7_quiz_messages', 10, 1 );
function wpcf7_quiz_messages( $messages ) {
$messages = array_merge( $messages, array(
'quiz_answer_not_correct' => array(
'description' =>
__( "Sender doesn't enter the correct answer to the quiz", 'contact-form-7' ),
'default' =>
__( "The answer to the quiz is incorrect.", 'contact-form-7' ),
),
) );
return $messages;
}
/* Tag generator */
add_action( 'wpcf7_admin_init', 'wpcf7_add_tag_generator_quiz', 40, 0 );
function wpcf7_add_tag_generator_quiz() {
$tag_generator = WPCF7_TagGenerator::get_instance();
$tag_generator->add( 'quiz', __( 'quiz', 'contact-form-7' ),
'wpcf7_tag_generator_quiz' );
}
function wpcf7_tag_generator_quiz( $contact_form, $args = '' ) {
$args = wp_parse_args( $args, array() );
$type = 'quiz';
$description = __( "Generate a form-tag for a question-answer pair. For more details, see %s.", 'contact-form-7' );
$desc_link = wpcf7_link( __( 'https://contactform7.com/quiz/', 'contact-form-7' ), __( 'Quiz', 'contact-form-7' ) );
?>
<div class="control-box">
<fieldset>
<legend><?php echo sprintf( esc_html( $description ), $desc_link ); ?></legend>
<table class="form-table">
<tbody>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-name' ); ?>"><?php echo esc_html( __( 'Name', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="name" class="tg-name oneline" id="<?php echo esc_attr( $args['content'] . '-name' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><?php echo esc_html( __( 'Questions and answers', 'contact-form-7' ) ); ?></th>
<td>
<fieldset>
<legend class="screen-reader-text"><?php echo esc_html( __( 'Questions and answers', 'contact-form-7' ) ); ?></legend>
<textarea name="values" class="values" id="<?php echo esc_attr( $args['content'] . '-values' ); ?>"></textarea><br />
<label for="<?php echo esc_attr( $args['content'] . '-values' ); ?>"><span class="description"><?php echo esc_html( __( "One pipe-separated question-answer pair (e.g. The capital of Brazil?|Rio) per line.", 'contact-form-7' ) ); ?></span></label>
</fieldset>
</td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-id' ); ?>"><?php echo esc_html( __( 'Id attribute', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="id" class="idvalue oneline option" id="<?php echo esc_attr( $args['content'] . '-id' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-class' ); ?>"><?php echo esc_html( __( 'Class attribute', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="class" class="classvalue oneline option" id="<?php echo esc_attr( $args['content'] . '-class' ); ?>" /></td>
</tr>
</tbody>
</table>
</fieldset>
</div>
<div class="insert-box">
<input type="text" name="<?php echo $type; ?>" class="tag code" readonly="readonly" onfocus="this.select()" />
<div class="submitbox">
<input type="button" class="button button-primary insert-tag" value="<?php echo esc_attr( __( 'Insert Tag', 'contact-form-7' ) ); ?>" />
</div>
</div>
<?php
}

View File

@ -0,0 +1,655 @@
<?php
/**
** A base module for [captchac] and [captchar]
**/
/* form_tag handler */
add_action( 'wpcf7_init', 'wpcf7_add_form_tag_captcha', 10, 0 );
function wpcf7_add_form_tag_captcha() {
// CAPTCHA-Challenge (image)
wpcf7_add_form_tag( 'captchac',
'wpcf7_captchac_form_tag_handler',
array(
'name-attr' => true,
'zero-controls-container' => true,
'not-for-mail' => true,
)
);
// CAPTCHA-Response (input)
wpcf7_add_form_tag( 'captchar',
'wpcf7_captchar_form_tag_handler',
array(
'name-attr' => true,
'do-not-store' => true,
'not-for-mail' => true,
)
);
}
function wpcf7_captchac_form_tag_handler( $tag ) {
if ( ! class_exists( 'ReallySimpleCaptcha' ) ) {
$error = sprintf(
/* translators: %s: link labeled 'Really Simple CAPTCHA' */
esc_html( __( "To use CAPTCHA, you need %s plugin installed.", 'contact-form-7' ) ),
wpcf7_link( 'https://wordpress.org/plugins/really-simple-captcha/', 'Really Simple CAPTCHA' ) );
return sprintf( '<em>%s</em>', $error );
}
if ( empty( $tag->name ) ) {
return '';
}
$class = wpcf7_form_controls_class( $tag->type );
$class .= ' wpcf7-captcha-' . $tag->name;
$atts = array();
$atts['class'] = $tag->get_class_option( $class );
$atts['id'] = $tag->get_id_option();
$op = array( // Default
'img_size' => array( 72, 24 ),
'base' => array( 6, 18 ),
'font_size' => 14,
'font_char_width' => 15,
);
$op = array_merge( $op, wpcf7_captchac_options( $tag->options ) );
if ( ! $filename = wpcf7_generate_captcha( $op ) ) {
return '';
}
if ( ! empty( $op['img_size'] ) ) {
if ( isset( $op['img_size'][0] ) ) {
$atts['width'] = $op['img_size'][0];
}
if ( isset( $op['img_size'][1] ) ) {
$atts['height'] = $op['img_size'][1];
}
}
$atts['alt'] = 'captcha';
$atts['src'] = wpcf7_captcha_url( $filename );
$atts = wpcf7_format_atts( $atts );
$prefix = substr( $filename, 0, strrpos( $filename, '.' ) );
$html = sprintf(
'<input type="hidden" name="_wpcf7_captcha_challenge_%1$s" value="%2$s" /><img %3$s />',
$tag->name, esc_attr( $prefix ), $atts );
return $html;
}
function wpcf7_captchar_form_tag_handler( $tag ) {
if ( empty( $tag->name ) ) {
return '';
}
$validation_error = wpcf7_get_validation_error( $tag->name );
$class = wpcf7_form_controls_class( $tag->type );
if ( $validation_error ) {
$class .= ' wpcf7-not-valid';
}
$atts = array();
$atts['size'] = $tag->get_size_option( '40' );
$atts['maxlength'] = $tag->get_maxlength_option();
$atts['minlength'] = $tag->get_minlength_option();
if ( $atts['maxlength'] and $atts['minlength']
and $atts['maxlength'] < $atts['minlength'] ) {
unset( $atts['maxlength'], $atts['minlength'] );
}
$atts['class'] = $tag->get_class_option( $class );
$atts['id'] = $tag->get_id_option();
$atts['tabindex'] = $tag->get_option( 'tabindex', 'signed_int', true );
$atts['autocomplete'] = 'off';
$atts['aria-invalid'] = $validation_error ? 'true' : 'false';
$value = (string) reset( $tag->values );
if ( wpcf7_is_posted() ) {
$value = '';
}
if ( $tag->has_option( 'placeholder' )
or $tag->has_option( 'watermark' ) ) {
$atts['placeholder'] = $value;
$value = '';
}
$atts['value'] = $value;
$atts['type'] = 'text';
$atts['name'] = $tag->name;
$atts = wpcf7_format_atts( $atts );
$html = sprintf(
'<span class="wpcf7-form-control-wrap %1$s"><input %2$s />%3$s</span>',
sanitize_html_class( $tag->name ), $atts, $validation_error );
return $html;
}
/* Validation filter */
add_filter( 'wpcf7_validate_captchar',
'wpcf7_captcha_validation_filter', 10, 2 );
function wpcf7_captcha_validation_filter( $result, $tag ) {
$type = $tag->type;
$name = $tag->name;
$captchac = '_wpcf7_captcha_challenge_' . $name;
$prefix = isset( $_POST[$captchac] ) ? (string) $_POST[$captchac] : '';
$response = isset( $_POST[$name] ) ? (string) $_POST[$name] : '';
$response = wpcf7_canonicalize( $response );
if ( 0 == strlen( $prefix )
or ! wpcf7_check_captcha( $prefix, $response ) ) {
$result->invalidate( $tag, wpcf7_get_message( 'captcha_not_match' ) );
}
if ( 0 != strlen( $prefix ) ) {
wpcf7_remove_captcha( $prefix );
}
return $result;
}
/* Ajax echo filter */
add_filter( 'wpcf7_ajax_onload', 'wpcf7_captcha_ajax_refill', 10, 1 );
add_filter( 'wpcf7_ajax_json_echo', 'wpcf7_captcha_ajax_refill', 10, 1 );
function wpcf7_captcha_ajax_refill( $items ) {
if ( ! is_array( $items ) ) {
return $items;
}
$tags = wpcf7_scan_form_tags( array( 'type' => 'captchac' ) );
if ( empty( $tags ) ) {
return $items;
}
$refill = array();
foreach ( $tags as $tag ) {
$name = $tag->name;
$options = $tag->options;
if ( empty( $name ) ) {
continue;
}
$op = wpcf7_captchac_options( $options );
if ( $filename = wpcf7_generate_captcha( $op ) ) {
$captcha_url = wpcf7_captcha_url( $filename );
$refill[$name] = $captcha_url;
}
}
if ( ! empty( $refill ) ) {
$items['captcha'] = $refill;
}
return $items;
}
/* Messages */
add_filter( 'wpcf7_messages', 'wpcf7_captcha_messages', 10, 1 );
function wpcf7_captcha_messages( $messages ) {
$messages = array_merge( $messages, array(
'captcha_not_match' => array(
'description' =>
__( "The code that sender entered does not match the CAPTCHA", 'contact-form-7' ),
'default' =>
__( 'Your entered code is incorrect.', 'contact-form-7' ),
),
) );
return $messages;
}
/* Tag generator */
add_action( 'wpcf7_admin_init', 'wpcf7_add_tag_generator_captcha', 46, 0 );
function wpcf7_add_tag_generator_captcha() {
if ( ! wpcf7_use_really_simple_captcha() ) {
return;
}
$tag_generator = WPCF7_TagGenerator::get_instance();
$tag_generator->add( 'captcha',
__( 'CAPTCHA (Really Simple CAPTCHA)', 'contact-form-7' ),
'wpcf7_tag_generator_captcha' );
}
function wpcf7_tag_generator_captcha( $contact_form, $args = '' ) {
$args = wp_parse_args( $args, array() );
if ( ! class_exists( 'ReallySimpleCaptcha' ) ) {
?>
<div class="control-box">
<fieldset>
<legend><?php
echo sprintf(
/* translators: %s: link labeled 'Really Simple CAPTCHA' */
esc_html( __( "To use CAPTCHA, you first need to install and activate %s plugin.", 'contact-form-7' ) ),
wpcf7_link( 'https://wordpress.org/plugins/really-simple-captcha/', 'Really Simple CAPTCHA' )
);
?></legend>
</fieldset>
</div>
<?php
return;
}
$description = __( "Generate form-tags for a CAPTCHA image and corresponding response input field. For more details, see %s.", 'contact-form-7' );
$desc_link = wpcf7_link( __( 'https://contactform7.com/captcha/', 'contact-form-7' ), __( 'CAPTCHA', 'contact-form-7' ) );
?>
<div class="control-box">
<fieldset>
<legend><?php echo sprintf( esc_html( $description ), $desc_link ); ?></legend>
<table class="form-table">
<tbody>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-name' ); ?>"><?php echo esc_html( __( 'Name', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="name" class="tg-name oneline" id="<?php echo esc_attr( $args['content'] . '-name' ); ?>" /></td>
</tr>
</tbody>
</table>
<table class="form-table scope captchac">
<caption><?php echo esc_html( __( "Image settings", 'contact-form-7' ) ); ?></caption>
<tbody>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-captchac-id' ); ?>"><?php echo esc_html( __( 'Id attribute', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="id" class="idvalue oneline option" id="<?php echo esc_attr( $args['content'] . '-captchac-id' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-captchac-class' ); ?>"><?php echo esc_html( __( 'Class attribute', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="class" class="classvalue oneline option" id="<?php echo esc_attr( $args['content'] . '-captchac-class' ); ?>" /></td>
</tr>
</tbody>
</table>
<table class="form-table scope captchar">
<caption><?php echo esc_html( __( "Input field settings", 'contact-form-7' ) ); ?></caption>
<tbody>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-captchar-id' ); ?>"><?php echo esc_html( __( 'Id attribute', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="id" class="idvalue oneline option" id="<?php echo esc_attr( $args['content'] . '-captchar-id' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-captchar-class' ); ?>"><?php echo esc_html( __( 'Class attribute', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="class" class="classvalue oneline option" id="<?php echo esc_attr( $args['content'] . '-captchar-class' ); ?>" /></td>
</tr>
</tbody>
</table>
</fieldset>
</div>
<div class="insert-box">
<input type="text" name="captcha" class="tag code" readonly="readonly" onfocus="this.select()" />
<div class="submitbox">
<input type="button" class="button button-primary insert-tag" value="<?php echo esc_attr( __( 'Insert Tag', 'contact-form-7' ) ); ?>" />
</div>
</div>
<?php
}
/* Warning message */
add_action( 'wpcf7_admin_warnings',
'wpcf7_captcha_display_warning_message', 10, 3 );
function wpcf7_captcha_display_warning_message( $page, $action, $object ) {
if ( $object instanceof WPCF7_ContactForm ) {
$contact_form = $object;
} else {
return;
}
$has_tags = (bool) $contact_form->scan_form_tags(
array( 'type' => array( 'captchac' ) ) );
if ( ! $has_tags ) {
return;
}
if ( ! class_exists( 'ReallySimpleCaptcha' ) ) {
return;
}
$uploads_dir = wpcf7_captcha_tmp_dir();
wpcf7_init_captcha();
if ( ! is_dir( $uploads_dir )
or ! wp_is_writable( $uploads_dir ) ) {
$message = sprintf( __( 'This contact form contains CAPTCHA fields, but the temporary folder for the files (%s) does not exist or is not writable. You can create the folder or change its permission manually.', 'contact-form-7' ), $uploads_dir );
echo '<div class="notice notice-warning"><p>' . esc_html( $message ) . '</p></div>';
}
if ( ! function_exists( 'imagecreatetruecolor' )
or ! function_exists( 'imagettftext' ) ) {
$message = __( "This contact form contains CAPTCHA fields, but the necessary libraries (GD and FreeType) are not available on your server.", 'contact-form-7' );
echo '<div class="notice notice-warning"><p>' . esc_html( $message ) . '</p></div>';
}
}
/* CAPTCHA functions */
function wpcf7_init_captcha() {
static $captcha = null;
if ( $captcha ) {
return $captcha;
}
if ( class_exists( 'ReallySimpleCaptcha' ) ) {
$captcha = new ReallySimpleCaptcha();
} else {
return false;
}
$dir = trailingslashit( wpcf7_captcha_tmp_dir() );
$captcha->tmp_dir = $dir;
if ( is_callable( array( $captcha, 'make_tmp_dir' ) ) ) {
$result = $captcha->make_tmp_dir();
if ( ! $result ) {
return false;
}
return $captcha;
}
if ( wp_mkdir_p( $dir ) ) {
$htaccess_file = path_join( $dir, '.htaccess' );
if ( file_exists( $htaccess_file ) ) {
return $captcha;
}
if ( $handle = fopen( $htaccess_file, 'w' ) ) {
fwrite( $handle, 'Order deny,allow' . "\n" );
fwrite( $handle, 'Deny from all' . "\n" );
fwrite( $handle, '<Files ~ "^[0-9A-Za-z]+\\.(jpeg|gif|png)$">' . "\n" );
fwrite( $handle, ' Allow from all' . "\n" );
fwrite( $handle, '</Files>' . "\n" );
fclose( $handle );
}
} else {
return false;
}
return $captcha;
}
function wpcf7_captcha_tmp_dir() {
if ( defined( 'WPCF7_CAPTCHA_TMP_DIR' ) ) {
return WPCF7_CAPTCHA_TMP_DIR;
} else {
return path_join( wpcf7_upload_dir( 'dir' ), 'wpcf7_captcha' );
}
}
function wpcf7_captcha_tmp_url() {
if ( defined( 'WPCF7_CAPTCHA_TMP_URL' ) ) {
return WPCF7_CAPTCHA_TMP_URL;
} else {
return path_join( wpcf7_upload_dir( 'url' ), 'wpcf7_captcha' );
}
}
function wpcf7_captcha_url( $filename ) {
$url = path_join( wpcf7_captcha_tmp_url(), $filename );
if ( is_ssl()
and 'http:' == substr( $url, 0, 5 ) ) {
$url = 'https:' . substr( $url, 5 );
}
return apply_filters( 'wpcf7_captcha_url', esc_url_raw( $url ) );
}
function wpcf7_generate_captcha( $options = null ) {
if ( ! $captcha = wpcf7_init_captcha() ) {
return false;
}
if ( ! is_dir( $captcha->tmp_dir )
or ! wp_is_writable( $captcha->tmp_dir ) ) {
return false;
}
$img_type = imagetypes();
if ( $img_type & IMG_PNG ) {
$captcha->img_type = 'png';
} elseif ( $img_type & IMG_GIF ) {
$captcha->img_type = 'gif';
} elseif ( $img_type & IMG_JPG ) {
$captcha->img_type = 'jpeg';
} else {
return false;
}
if ( is_array( $options ) ) {
if ( isset( $options['img_size'] ) ) {
$captcha->img_size = $options['img_size'];
}
if ( isset( $options['base'] ) ) {
$captcha->base = $options['base'];
}
if ( isset( $options['font_size'] ) ) {
$captcha->font_size = $options['font_size'];
}
if ( isset( $options['font_char_width'] ) ) {
$captcha->font_char_width = $options['font_char_width'];
}
if ( isset( $options['fg'] ) ) {
$captcha->fg = $options['fg'];
}
if ( isset( $options['bg'] ) ) {
$captcha->bg = $options['bg'];
}
}
$prefix = wp_rand();
$captcha_word = $captcha->generate_random_word();
return $captcha->generate_image( $prefix, $captcha_word );
}
function wpcf7_check_captcha( $prefix, $response ) {
if ( ! $captcha = wpcf7_init_captcha() ) {
return false;
}
return $captcha->check( $prefix, $response );
}
function wpcf7_remove_captcha( $prefix ) {
if ( ! $captcha = wpcf7_init_captcha() ) {
return false;
}
// Contact Form 7 generates $prefix with wp_rand()
if ( preg_match( '/[^0-9]/', $prefix ) ) {
return false;
}
$captcha->remove( $prefix );
}
add_action( 'template_redirect', 'wpcf7_cleanup_captcha_files', 20, 0 );
function wpcf7_cleanup_captcha_files() {
if ( ! $captcha = wpcf7_init_captcha() ) {
return false;
}
if ( is_callable( array( $captcha, 'cleanup' ) ) ) {
return $captcha->cleanup();
}
$dir = trailingslashit( wpcf7_captcha_tmp_dir() );
if ( ! is_dir( $dir )
or ! is_readable( $dir )
or ! wp_is_writable( $dir ) ) {
return false;
}
if ( $handle = opendir( $dir ) ) {
while ( false !== ( $file = readdir( $handle ) ) ) {
if ( ! preg_match( '/^[0-9]+\.(php|txt|png|gif|jpeg)$/', $file ) ) {
continue;
}
$stat = stat( path_join( $dir, $file ) );
if ( $stat['mtime'] + 3600 < time() ) { // 3600 secs == 1 hour
@unlink( path_join( $dir, $file ) );
}
}
closedir( $handle );
}
}
function wpcf7_captchac_options( $options ) {
if ( ! is_array( $options ) ) {
return array();
}
$op = array();
$image_size_array = preg_grep( '%^size:[smlSML]$%', $options );
if ( $image_size = array_shift( $image_size_array ) ) {
preg_match( '%^size:([smlSML])$%', $image_size, $is_matches );
switch ( strtolower( $is_matches[1] ) ) {
case 's':
$op['img_size'] = array( 60, 20 );
$op['base'] = array( 6, 15 );
$op['font_size'] = 11;
$op['font_char_width'] = 13;
break;
case 'l':
$op['img_size'] = array( 84, 28 );
$op['base'] = array( 6, 20 );
$op['font_size'] = 17;
$op['font_char_width'] = 19;
break;
case 'm':
default:
$op['img_size'] = array( 72, 24 );
$op['base'] = array( 6, 18 );
$op['font_size'] = 14;
$op['font_char_width'] = 15;
}
}
$fg_color_array = preg_grep(
'%^fg:#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$%', $options );
if ( $fg_color = array_shift( $fg_color_array ) ) {
preg_match( '%^fg:#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$%',
$fg_color, $fc_matches );
if ( 3 == strlen( $fc_matches[1] ) ) {
$r = substr( $fc_matches[1], 0, 1 );
$g = substr( $fc_matches[1], 1, 1 );
$b = substr( $fc_matches[1], 2, 1 );
$op['fg'] = array(
hexdec( $r . $r ),
hexdec( $g . $g ),
hexdec( $b . $b ),
);
} elseif ( 6 == strlen( $fc_matches[1] ) ) {
$r = substr( $fc_matches[1], 0, 2 );
$g = substr( $fc_matches[1], 2, 2 );
$b = substr( $fc_matches[1], 4, 2 );
$op['fg'] = array(
hexdec( $r ),
hexdec( $g ),
hexdec( $b ),
);
}
}
$bg_color_array = preg_grep(
'%^bg:#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$%', $options );
if ( $bg_color = array_shift( $bg_color_array ) ) {
preg_match( '%^bg:#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$%',
$bg_color, $bc_matches );
if ( 3 == strlen( $bc_matches[1] ) ) {
$r = substr( $bc_matches[1], 0, 1 );
$g = substr( $bc_matches[1], 1, 1 );
$b = substr( $bc_matches[1], 2, 1 );
$op['bg'] = array(
hexdec( $r . $r ),
hexdec( $g . $g ),
hexdec( $b . $b ),
);
} elseif ( 6 == strlen( $bc_matches[1] ) ) {
$r = substr( $bc_matches[1], 0, 2 );
$g = substr( $bc_matches[1], 2, 2 );
$b = substr( $bc_matches[1], 4, 2 );
$op['bg'] = array(
hexdec( $r ),
hexdec( $g ),
hexdec( $b ),
);
}
}
return $op;
}

View File

@ -0,0 +1,446 @@
<?php
add_action( 'wpcf7_init', 'wpcf7_recaptcha_register_service', 10, 0 );
function wpcf7_recaptcha_register_service() {
$integration = WPCF7_Integration::get_instance();
$integration->add_category( 'captcha',
__( 'CAPTCHA', 'contact-form-7' )
);
$integration->add_service( 'recaptcha',
WPCF7_RECAPTCHA::get_instance()
);
}
add_action( 'wp_enqueue_scripts', 'wpcf7_recaptcha_enqueue_scripts', 10, 0 );
function wpcf7_recaptcha_enqueue_scripts() {
$service = WPCF7_RECAPTCHA::get_instance();
if ( ! $service->is_active() ) {
return;
}
$url = add_query_arg(
array(
'render' => $service->get_sitekey(),
),
'https://www.google.com/recaptcha/api.js'
);
wp_enqueue_script( 'google-recaptcha', $url, array(), '3.0', true );
}
add_filter( 'wpcf7_form_hidden_fields',
'wpcf7_recaptcha_add_hidden_fields', 100, 1 );
function wpcf7_recaptcha_add_hidden_fields( $fields ) {
return array_merge( $fields, array(
'g-recaptcha-response' => '',
) );
}
add_action( 'wp_footer', 'wpcf7_recaptcha_onload_script', 40, 0 );
function wpcf7_recaptcha_onload_script() {
$service = WPCF7_RECAPTCHA::get_instance();
if ( ! $service->is_active() ) {
return;
}
if ( ! wp_script_is( 'google-recaptcha', 'done' ) ) {
return;
}
?>
<script type="text/javascript">
( function( grecaptcha, sitekey ) {
var wpcf7recaptcha = {
execute: function() {
grecaptcha.execute(
sitekey,
{ action: 'homepage' }
).then( function( token ) {
var forms = document.getElementsByTagName( 'form' );
for ( var i = 0; i < forms.length; i++ ) {
var fields = forms[ i ].getElementsByTagName( 'input' );
for ( var j = 0; j < fields.length; j++ ) {
var field = fields[ j ];
if ( 'g-recaptcha-response' === field.getAttribute( 'name' ) ) {
field.setAttribute( 'value', token );
break;
}
}
}
} );
}
};
grecaptcha.ready( wpcf7recaptcha.execute );
document.addEventListener( 'wpcf7submit', wpcf7recaptcha.execute, false );
} )( grecaptcha, '<?php echo esc_js( $service->get_sitekey() ); ?>' );
</script>
<?php
}
add_filter( 'wpcf7_spam', 'wpcf7_recaptcha_verify_response', 9, 1 );
function wpcf7_recaptcha_verify_response( $spam ) {
if ( $spam ) {
return $spam;
}
$service = WPCF7_RECAPTCHA::get_instance();
if ( ! $service->is_active() ) {
return $spam;
}
$token = isset( $_POST['g-recaptcha-response'] )
? trim( $_POST['g-recaptcha-response'] ) : '';
return ! $service->verify( $token );
}
add_action( 'wpcf7_init', 'wpcf7_recaptcha_add_form_tag_recaptcha', 10, 0 );
function wpcf7_recaptcha_add_form_tag_recaptcha() {
$service = WPCF7_RECAPTCHA::get_instance();
if ( ! $service->is_active() ) {
return;
}
wpcf7_add_form_tag( 'recaptcha',
'__return_empty_string', // no output
array( 'display-block' => true )
);
}
add_action( 'wpcf7_upgrade', 'wpcf7_upgrade_recaptcha_v2_v3', 10, 2 );
function wpcf7_upgrade_recaptcha_v2_v3( $new_ver, $old_ver ) {
if ( version_compare( '5.1-dev', $old_ver, '<=' ) ) {
return;
}
$service = WPCF7_RECAPTCHA::get_instance();
if ( ! $service->is_active() ) {
return;
}
// Maybe v2 keys are used now. Warning necessary.
WPCF7::update_option( 'recaptcha_v2_v3_warning', true );
WPCF7::update_option( 'recaptcha', null );
}
add_action( 'wpcf7_admin_menu', 'wpcf7_admin_init_recaptcha_v2_v3', 10, 0 );
function wpcf7_admin_init_recaptcha_v2_v3() {
if ( ! WPCF7::get_option( 'recaptcha_v2_v3_warning' ) ) {
return;
}
add_filter( 'wpcf7_admin_menu_change_notice',
'wpcf7_admin_menu_change_notice_recaptcha_v2_v3', 10, 1 );
add_action( 'wpcf7_admin_warnings',
'wpcf7_admin_warnings_recaptcha_v2_v3', 5, 3 );
}
function wpcf7_admin_menu_change_notice_recaptcha_v2_v3( $counts ) {
$counts['wpcf7-integration'] += 1;
return $counts;
}
function wpcf7_admin_warnings_recaptcha_v2_v3( $page, $action, $object ) {
if ( 'wpcf7-integration' !== $page ) {
return;
}
$message = sprintf(
esc_html( __( "API keys for reCAPTCHA v3 are different from those for v2; keys for v2 don&#8217;t work with the v3 API. You need to register your sites again to get new keys for v3. For details, see %s.", 'contact-form-7' ) ),
wpcf7_link(
__( 'https://contactform7.com/recaptcha/', 'contact-form-7' ),
__( 'reCAPTCHA (v3)', 'contact-form-7' )
)
);
echo sprintf(
'<div class="notice notice-warning"><p>%s</p></div>',
$message
);
}
if ( ! class_exists( 'WPCF7_Service' ) ) {
return;
}
class WPCF7_RECAPTCHA extends WPCF7_Service {
private static $instance;
private $sitekeys;
public static function get_instance() {
if ( empty( self::$instance ) ) {
self::$instance = new self;
}
return self::$instance;
}
private function __construct() {
$this->sitekeys = WPCF7::get_option( 'recaptcha' );
}
public function get_title() {
return __( 'reCAPTCHA', 'contact-form-7' );
}
public function is_active() {
$sitekey = $this->get_sitekey();
$secret = $this->get_secret( $sitekey );
return $sitekey && $secret;
}
public function get_categories() {
return array( 'captcha' );
}
public function icon() {
}
public function link() {
echo wpcf7_link(
'https://www.google.com/recaptcha/intro/index.html',
'google.com/recaptcha'
);
}
public function get_sitekey() {
if ( empty( $this->sitekeys )
or ! is_array( $this->sitekeys ) ) {
return false;
}
$sitekeys = array_keys( $this->sitekeys );
return $sitekeys[0];
}
public function get_secret( $sitekey ) {
$sitekeys = (array) $this->sitekeys;
if ( isset( $sitekeys[$sitekey] ) ) {
return $sitekeys[$sitekey];
} else {
return false;
}
}
protected function log( $url, $request, $response ) {
wpcf7_log_remote_request( $url, $request, $response );
}
public function verify( $token ) {
$is_human = false;
if ( empty( $token ) or ! $this->is_active() ) {
return $is_human;
}
$endpoint = 'https://www.google.com/recaptcha/api/siteverify';
$sitekey = $this->get_sitekey();
$secret = $this->get_secret( $sitekey );
$request = array(
'body' => array(
'secret' => $secret,
'response' => $token,
),
);
$response = wp_remote_post( esc_url_raw( $endpoint ), $request );
if ( 200 != wp_remote_retrieve_response_code( $response ) ) {
if ( WP_DEBUG ) {
$this->log( $endpoint, $request, $response );
}
return $is_human;
}
$response_body = wp_remote_retrieve_body( $response );
$response_body = json_decode( $response_body, true );
$score = isset( $response_body['score'] ) ? $response_body['score'] : 0;
$threshold = 0.5;
$is_human = $threshold < $score;
$is_human = apply_filters( 'wpcf7_recaptcha_verify_response',
$is_human, $response_body );
return $is_human;
}
protected function menu_page_url( $args = '' ) {
$args = wp_parse_args( $args, array() );
$url = menu_page_url( 'wpcf7-integration', false );
$url = add_query_arg( array( 'service' => 'recaptcha' ), $url );
if ( ! empty( $args) ) {
$url = add_query_arg( $args, $url );
}
return $url;
}
protected function save_data() {
WPCF7::update_option( 'recaptcha', $this->sitekeys );
}
protected function reset_data() {
$this->sitekeys = null;
$this->save_data();
}
public function load( $action = '' ) {
if ( 'setup' == $action and 'POST' == $_SERVER['REQUEST_METHOD'] ) {
check_admin_referer( 'wpcf7-recaptcha-setup' );
if ( ! empty( $_POST['reset'] ) ) {
$this->reset_data();
$redirect_to = $this->menu_page_url( 'action=setup' );
} else {
$sitekey = isset( $_POST['sitekey'] ) ? trim( $_POST['sitekey'] ) : '';
$secret = isset( $_POST['secret'] ) ? trim( $_POST['secret'] ) : '';
if ( $sitekey and $secret ) {
$this->sitekeys = array( $sitekey => $secret );
$this->save_data();
$redirect_to = $this->menu_page_url( array(
'message' => 'success',
) );
} else {
$redirect_to = $this->menu_page_url( array(
'action' => 'setup',
'message' => 'invalid',
) );
}
}
if ( WPCF7::get_option( 'recaptcha_v2_v3_warning' ) ) {
WPCF7::update_option( 'recaptcha_v2_v3_warning', false );
}
wp_safe_redirect( $redirect_to );
exit();
}
}
public function admin_notice( $message = '' ) {
if ( 'invalid' == $message ) {
echo sprintf(
'<div class="error notice notice-error is-dismissible"><p><strong>%1$s</strong>: %2$s</p></div>',
esc_html( __( "ERROR", 'contact-form-7' ) ),
esc_html( __( "Invalid key values.", 'contact-form-7' ) ) );
}
if ( 'success' == $message ) {
echo sprintf( '<div class="updated notice notice-success is-dismissible"><p>%s</p></div>',
esc_html( __( 'Settings saved.', 'contact-form-7' ) ) );
}
}
public function display( $action = '' ) {
echo '<p>' . sprintf(
esc_html( __( 'reCAPTCHA protects you against spam and other types of automated abuse. With Contact Form 7&#8217;s reCAPTCHA integration module, you can block abusive form submissions by spam bots. For details, see %s.', 'contact-form-7' ) ),
wpcf7_link(
__( 'https://contactform7.com/recaptcha/', 'contact-form-7' ),
__( 'reCAPTCHA (v3)', 'contact-form-7' )
)
) . '</p>';
if ( $this->is_active() or 'setup' == $action ) {
$this->display_setup();
} else {
echo sprintf(
'<p><a href="%1$s" class="button">%2$s</a></p>',
esc_url( $this->menu_page_url( 'action=setup' ) ),
esc_html( __( 'Setup Integration', 'contact-form-7' ) )
);
}
}
private function display_setup() {
$sitekey = $this->is_active() ? $this->get_sitekey() : '';
$secret = $this->is_active() ? $this->get_secret( $sitekey ) : '';
?>
<form method="post" action="<?php echo esc_url( $this->menu_page_url( 'action=setup' ) ); ?>">
<?php wp_nonce_field( 'wpcf7-recaptcha-setup' ); ?>
<table class="form-table">
<tbody>
<tr>
<th scope="row"><label for="sitekey"><?php echo esc_html( __( 'Site Key', 'contact-form-7' ) ); ?></label></th>
<td><?php
if ( $this->is_active() ) {
echo esc_html( $sitekey );
echo sprintf(
'<input type="hidden" value="%1$s" id="sitekey" name="sitekey" />',
esc_attr( $sitekey )
);
} else {
echo sprintf(
'<input type="text" aria-required="true" value="%1$s" id="sitekey" name="sitekey" class="regular-text code" />',
esc_attr( $sitekey )
);
}
?></td>
</tr>
<tr>
<th scope="row"><label for="secret"><?php echo esc_html( __( 'Secret Key', 'contact-form-7' ) ); ?></label></th>
<td><?php
if ( $this->is_active() ) {
echo esc_html( wpcf7_mask_password( $secret ) );
echo sprintf(
'<input type="hidden" value="%1$s" id="secret" name="secret" />',
esc_attr( $secret )
);
} else {
echo sprintf(
'<input type="text" aria-required="true" value="%1$s" id="secret" name="secret" class="regular-text code" />',
esc_attr( $secret )
);
}
?></td>
</tr>
</tbody>
</table>
<?php
if ( $this->is_active() ) {
submit_button(
_x( 'Remove Keys', 'API keys', 'contact-form-7' ),
'small', 'reset'
);
} else {
submit_button( __( 'Save Changes', 'contact-form-7' ) );
}
?>
</form>
<?php
}
}

View File

@ -0,0 +1,19 @@
<?php
/**
** A base module for [response]
**/
/* form_tag handler */
add_action( 'wpcf7_init', 'wpcf7_add_form_tag_response', 10, 0 );
function wpcf7_add_form_tag_response() {
wpcf7_add_form_tag( 'response', 'wpcf7_response_form_tag_handler',
array( 'display-block' => true ) );
}
function wpcf7_response_form_tag_handler( $tag ) {
if ( $contact_form = wpcf7_get_current_contact_form() ) {
return $contact_form->form_response_output();
}
}

View File

@ -0,0 +1,227 @@
<?php
/**
** A base module for [select] and [select*]
**/
/* form_tag handler */
add_action( 'wpcf7_init', 'wpcf7_add_form_tag_select', 10, 0 );
function wpcf7_add_form_tag_select() {
wpcf7_add_form_tag( array( 'select', 'select*' ),
'wpcf7_select_form_tag_handler',
array(
'name-attr' => true,
'selectable-values' => true,
)
);
}
function wpcf7_select_form_tag_handler( $tag ) {
if ( empty( $tag->name ) ) {
return '';
}
$validation_error = wpcf7_get_validation_error( $tag->name );
$class = wpcf7_form_controls_class( $tag->type );
if ( $validation_error ) {
$class .= ' wpcf7-not-valid';
}
$atts = array();
$atts['class'] = $tag->get_class_option( $class );
$atts['id'] = $tag->get_id_option();
$atts['tabindex'] = $tag->get_option( 'tabindex', 'signed_int', true );
if ( $tag->is_required() ) {
$atts['aria-required'] = 'true';
}
$atts['aria-invalid'] = $validation_error ? 'true' : 'false';
$multiple = $tag->has_option( 'multiple' );
$include_blank = $tag->has_option( 'include_blank' );
$first_as_label = $tag->has_option( 'first_as_label' );
if ( $tag->has_option( 'size' ) ) {
$size = $tag->get_option( 'size', 'int', true );
if ( $size ) {
$atts['size'] = $size;
} elseif ( $multiple ) {
$atts['size'] = 4;
} else {
$atts['size'] = 1;
}
}
if ( $data = (array) $tag->get_data_option() ) {
$tag->values = array_merge( $tag->values, array_values( $data ) );
$tag->labels = array_merge( $tag->labels, array_values( $data ) );
}
$values = $tag->values;
$labels = $tag->labels;
$default_choice = $tag->get_default_option( null, array(
'multiple' => $multiple,
'shifted' => $include_blank,
) );
if ( $include_blank
or empty( $values ) ) {
array_unshift( $labels, '---' );
array_unshift( $values, '' );
} elseif ( $first_as_label ) {
$values[0] = '';
}
$html = '';
$hangover = wpcf7_get_hangover( $tag->name );
foreach ( $values as $key => $value ) {
if ( $hangover ) {
$selected = in_array( $value, (array) $hangover, true );
} else {
$selected = in_array( $value, (array) $default_choice, true );
}
$item_atts = array(
'value' => $value,
'selected' => $selected ? 'selected' : '',
);
$item_atts = wpcf7_format_atts( $item_atts );
$label = isset( $labels[$key] ) ? $labels[$key] : $value;
$html .= sprintf( '<option %1$s>%2$s</option>',
$item_atts, esc_html( $label ) );
}
if ( $multiple ) {
$atts['multiple'] = 'multiple';
}
$atts['name'] = $tag->name . ( $multiple ? '[]' : '' );
$atts = wpcf7_format_atts( $atts );
$html = sprintf(
'<span class="wpcf7-form-control-wrap %1$s"><select %2$s>%3$s</select>%4$s</span>',
sanitize_html_class( $tag->name ), $atts, $html, $validation_error );
return $html;
}
/* Validation filter */
add_filter( 'wpcf7_validate_select', 'wpcf7_select_validation_filter', 10, 2 );
add_filter( 'wpcf7_validate_select*', 'wpcf7_select_validation_filter', 10, 2 );
function wpcf7_select_validation_filter( $result, $tag ) {
$name = $tag->name;
if ( isset( $_POST[$name] )
and is_array( $_POST[$name] ) ) {
foreach ( $_POST[$name] as $key => $value ) {
if ( '' === $value ) {
unset( $_POST[$name][$key] );
}
}
}
$empty = ! isset( $_POST[$name] ) || empty( $_POST[$name] ) && '0' !== $_POST[$name];
if ( $tag->is_required() and $empty ) {
$result->invalidate( $tag, wpcf7_get_message( 'invalid_required' ) );
}
return $result;
}
/* Tag generator */
add_action( 'wpcf7_admin_init', 'wpcf7_add_tag_generator_menu', 25, 0 );
function wpcf7_add_tag_generator_menu() {
$tag_generator = WPCF7_TagGenerator::get_instance();
$tag_generator->add( 'menu', __( 'drop-down menu', 'contact-form-7' ),
'wpcf7_tag_generator_menu' );
}
function wpcf7_tag_generator_menu( $contact_form, $args = '' ) {
$args = wp_parse_args( $args, array() );
$description = __( "Generate a form-tag for a drop-down menu. For more details, see %s.", 'contact-form-7' );
$desc_link = wpcf7_link( __( 'https://contactform7.com/checkboxes-radio-buttons-and-menus/', 'contact-form-7' ), __( 'Checkboxes, Radio Buttons and Menus', 'contact-form-7' ) );
?>
<div class="control-box">
<fieldset>
<legend><?php echo sprintf( esc_html( $description ), $desc_link ); ?></legend>
<table class="form-table">
<tbody>
<tr>
<th scope="row"><?php echo esc_html( __( 'Field type', 'contact-form-7' ) ); ?></th>
<td>
<fieldset>
<legend class="screen-reader-text"><?php echo esc_html( __( 'Field type', 'contact-form-7' ) ); ?></legend>
<label><input type="checkbox" name="required" /> <?php echo esc_html( __( 'Required field', 'contact-form-7' ) ); ?></label>
</fieldset>
</td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-name' ); ?>"><?php echo esc_html( __( 'Name', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="name" class="tg-name oneline" id="<?php echo esc_attr( $args['content'] . '-name' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><?php echo esc_html( __( 'Options', 'contact-form-7' ) ); ?></th>
<td>
<fieldset>
<legend class="screen-reader-text"><?php echo esc_html( __( 'Options', 'contact-form-7' ) ); ?></legend>
<textarea name="values" class="values" id="<?php echo esc_attr( $args['content'] . '-values' ); ?>"></textarea>
<label for="<?php echo esc_attr( $args['content'] . '-values' ); ?>"><span class="description"><?php echo esc_html( __( "One option per line.", 'contact-form-7' ) ); ?></span></label><br />
<label><input type="checkbox" name="multiple" class="option" /> <?php echo esc_html( __( 'Allow multiple selections', 'contact-form-7' ) ); ?></label><br />
<label><input type="checkbox" name="include_blank" class="option" /> <?php echo esc_html( __( 'Insert a blank item as the first option', 'contact-form-7' ) ); ?></label>
</fieldset>
</td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-id' ); ?>"><?php echo esc_html( __( 'Id attribute', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="id" class="idvalue oneline option" id="<?php echo esc_attr( $args['content'] . '-id' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-class' ); ?>"><?php echo esc_html( __( 'Class attribute', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="class" class="classvalue oneline option" id="<?php echo esc_attr( $args['content'] . '-class' ); ?>" /></td>
</tr>
</tbody>
</table>
</fieldset>
</div>
<div class="insert-box">
<input type="text" name="select" class="tag code" readonly="readonly" onfocus="this.select()" />
<div class="submitbox">
<input type="button" class="button button-primary insert-tag" value="<?php echo esc_attr( __( 'Insert Tag', 'contact-form-7' ) ); ?>" />
</div>
<br class="clear" />
<p class="description mail-tag"><label for="<?php echo esc_attr( $args['content'] . '-mailtag' ); ?>"><?php echo sprintf( esc_html( __( "To use the value input through this field in a mail field, you need to insert the corresponding mail-tag (%s) into the field on the Mail tab.", 'contact-form-7' ) ), '<strong><span class="mail-tag"></span></strong>' ); ?><input type="text" class="mail-tag code hidden" readonly="readonly" id="<?php echo esc_attr( $args['content'] . '-mailtag' ); ?>" /></label></p>
</div>
<?php
}

View File

@ -0,0 +1,92 @@
<?php
/**
** A base module for [submit]
**/
/* form_tag handler */
add_action( 'wpcf7_init', 'wpcf7_add_form_tag_submit', 10, 0 );
function wpcf7_add_form_tag_submit() {
wpcf7_add_form_tag( 'submit', 'wpcf7_submit_form_tag_handler' );
}
function wpcf7_submit_form_tag_handler( $tag ) {
$class = wpcf7_form_controls_class( $tag->type );
$atts = array();
$atts['class'] = $tag->get_class_option( $class );
$atts['id'] = $tag->get_id_option();
$atts['tabindex'] = $tag->get_option( 'tabindex', 'signed_int', true );
$value = isset( $tag->values[0] ) ? $tag->values[0] : '';
if ( empty( $value ) ) {
$value = __( 'Send', 'contact-form-7' );
}
$atts['type'] = 'submit';
$atts['value'] = $value;
$atts = wpcf7_format_atts( $atts );
$html = sprintf( '<input %1$s />', $atts );
return $html;
}
/* Tag generator */
add_action( 'wpcf7_admin_init', 'wpcf7_add_tag_generator_submit', 55, 0 );
function wpcf7_add_tag_generator_submit() {
$tag_generator = WPCF7_TagGenerator::get_instance();
$tag_generator->add( 'submit', __( 'submit', 'contact-form-7' ),
'wpcf7_tag_generator_submit', array( 'nameless' => 1 ) );
}
function wpcf7_tag_generator_submit( $contact_form, $args = '' ) {
$args = wp_parse_args( $args, array() );
$description = __( "Generate a form-tag for a submit button. For more details, see %s.", 'contact-form-7' );
$desc_link = wpcf7_link( __( 'https://contactform7.com/submit-button/', 'contact-form-7' ), __( 'Submit Button', 'contact-form-7' ) );
?>
<div class="control-box">
<fieldset>
<legend><?php echo sprintf( esc_html( $description ), $desc_link ); ?></legend>
<table class="form-table">
<tbody>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-values' ); ?>"><?php echo esc_html( __( 'Label', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="values" class="oneline" id="<?php echo esc_attr( $args['content'] . '-values' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-id' ); ?>"><?php echo esc_html( __( 'Id attribute', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="id" class="idvalue oneline option" id="<?php echo esc_attr( $args['content'] . '-id' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-class' ); ?>"><?php echo esc_html( __( 'Class attribute', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="class" class="classvalue oneline option" id="<?php echo esc_attr( $args['content'] . '-class' ); ?>" /></td>
</tr>
</tbody>
</table>
</fieldset>
</div>
<div class="insert-box">
<input type="text" name="submit" class="tag code" readonly="readonly" onfocus="this.select()" />
<div class="submitbox">
<input type="button" class="button button-primary insert-tag" value="<?php echo esc_attr( __( 'Insert Tag', 'contact-form-7' ) ); ?>" />
</div>
</div>
<?php
}

View File

@ -0,0 +1,320 @@
<?php
/**
** A base module for the following types of tags:
** [text] and [text*] # Single-line text
** [email] and [email*] # Email address
** [url] and [url*] # URL
** [tel] and [tel*] # Telephone number
**/
/* form_tag handler */
add_action( 'wpcf7_init', 'wpcf7_add_form_tag_text', 10, 0 );
function wpcf7_add_form_tag_text() {
wpcf7_add_form_tag(
array( 'text', 'text*', 'email', 'email*', 'url', 'url*', 'tel', 'tel*' ),
'wpcf7_text_form_tag_handler', array( 'name-attr' => true ) );
}
function wpcf7_text_form_tag_handler( $tag ) {
if ( empty( $tag->name ) ) {
return '';
}
$validation_error = wpcf7_get_validation_error( $tag->name );
$class = wpcf7_form_controls_class( $tag->type, 'wpcf7-text' );
if ( in_array( $tag->basetype, array( 'email', 'url', 'tel' ) ) ) {
$class .= ' wpcf7-validates-as-' . $tag->basetype;
}
if ( $validation_error ) {
$class .= ' wpcf7-not-valid';
}
$atts = array();
$atts['size'] = $tag->get_size_option( '40' );
$atts['maxlength'] = $tag->get_maxlength_option();
$atts['minlength'] = $tag->get_minlength_option();
if ( $atts['maxlength'] and $atts['minlength']
and $atts['maxlength'] < $atts['minlength'] ) {
unset( $atts['maxlength'], $atts['minlength'] );
}
$atts['class'] = $tag->get_class_option( $class );
$atts['id'] = $tag->get_id_option();
$atts['tabindex'] = $tag->get_option( 'tabindex', 'signed_int', true );
$atts['autocomplete'] = $tag->get_option( 'autocomplete',
'[-0-9a-zA-Z]+', true );
if ( $tag->has_option( 'readonly' ) ) {
$atts['readonly'] = 'readonly';
}
if ( $tag->is_required() ) {
$atts['aria-required'] = 'true';
}
$atts['aria-invalid'] = $validation_error ? 'true' : 'false';
$value = (string) reset( $tag->values );
if ( $tag->has_option( 'placeholder' )
or $tag->has_option( 'watermark' ) ) {
$atts['placeholder'] = $value;
$value = '';
}
$value = $tag->get_default_option( $value );
$value = wpcf7_get_hangover( $tag->name, $value );
$atts['value'] = $value;
if ( wpcf7_support_html5() ) {
$atts['type'] = $tag->basetype;
} else {
$atts['type'] = 'text';
}
$atts['name'] = $tag->name;
$atts = wpcf7_format_atts( $atts );
$html = sprintf(
'<span class="wpcf7-form-control-wrap %1$s"><input %2$s />%3$s</span>',
sanitize_html_class( $tag->name ), $atts, $validation_error );
return $html;
}
/* Validation filter */
add_filter( 'wpcf7_validate_text', 'wpcf7_text_validation_filter', 10, 2 );
add_filter( 'wpcf7_validate_text*', 'wpcf7_text_validation_filter', 10, 2 );
add_filter( 'wpcf7_validate_email', 'wpcf7_text_validation_filter', 10, 2 );
add_filter( 'wpcf7_validate_email*', 'wpcf7_text_validation_filter', 10, 2 );
add_filter( 'wpcf7_validate_url', 'wpcf7_text_validation_filter', 10, 2 );
add_filter( 'wpcf7_validate_url*', 'wpcf7_text_validation_filter', 10, 2 );
add_filter( 'wpcf7_validate_tel', 'wpcf7_text_validation_filter', 10, 2 );
add_filter( 'wpcf7_validate_tel*', 'wpcf7_text_validation_filter', 10, 2 );
function wpcf7_text_validation_filter( $result, $tag ) {
$name = $tag->name;
$value = isset( $_POST[$name] )
? trim( wp_unslash( strtr( (string) $_POST[$name], "\n", " " ) ) )
: '';
if ( 'text' == $tag->basetype ) {
if ( $tag->is_required() and '' == $value ) {
$result->invalidate( $tag, wpcf7_get_message( 'invalid_required' ) );
}
}
if ( 'email' == $tag->basetype ) {
if ( $tag->is_required() and '' == $value ) {
$result->invalidate( $tag, wpcf7_get_message( 'invalid_required' ) );
} elseif ( '' != $value and ! wpcf7_is_email( $value ) ) {
$result->invalidate( $tag, wpcf7_get_message( 'invalid_email' ) );
}
}
if ( 'url' == $tag->basetype ) {
if ( $tag->is_required() and '' == $value ) {
$result->invalidate( $tag, wpcf7_get_message( 'invalid_required' ) );
} elseif ( '' != $value and ! wpcf7_is_url( $value ) ) {
$result->invalidate( $tag, wpcf7_get_message( 'invalid_url' ) );
}
}
if ( 'tel' == $tag->basetype ) {
if ( $tag->is_required() and '' == $value ) {
$result->invalidate( $tag, wpcf7_get_message( 'invalid_required' ) );
} elseif ( '' != $value and ! wpcf7_is_tel( $value ) ) {
$result->invalidate( $tag, wpcf7_get_message( 'invalid_tel' ) );
}
}
if ( '' !== $value ) {
$maxlength = $tag->get_maxlength_option();
$minlength = $tag->get_minlength_option();
if ( $maxlength and $minlength and $maxlength < $minlength ) {
$maxlength = $minlength = null;
}
$code_units = wpcf7_count_code_units( stripslashes( $value ) );
if ( false !== $code_units ) {
if ( $maxlength and $maxlength < $code_units ) {
$result->invalidate( $tag, wpcf7_get_message( 'invalid_too_long' ) );
} elseif ( $minlength and $code_units < $minlength ) {
$result->invalidate( $tag, wpcf7_get_message( 'invalid_too_short' ) );
}
}
}
return $result;
}
/* Messages */
add_filter( 'wpcf7_messages', 'wpcf7_text_messages', 10, 1 );
function wpcf7_text_messages( $messages ) {
$messages = array_merge( $messages, array(
'invalid_email' => array(
'description' =>
__( "Email address that the sender entered is invalid", 'contact-form-7' ),
'default' =>
__( "The e-mail address entered is invalid.", 'contact-form-7' ),
),
'invalid_url' => array(
'description' =>
__( "URL that the sender entered is invalid", 'contact-form-7' ),
'default' =>
__( "The URL is invalid.", 'contact-form-7' ),
),
'invalid_tel' => array(
'description' =>
__( "Telephone number that the sender entered is invalid", 'contact-form-7' ),
'default' =>
__( "The telephone number is invalid.", 'contact-form-7' ),
),
) );
return $messages;
}
/* Tag generator */
add_action( 'wpcf7_admin_init', 'wpcf7_add_tag_generator_text', 15, 0 );
function wpcf7_add_tag_generator_text() {
$tag_generator = WPCF7_TagGenerator::get_instance();
$tag_generator->add( 'text', __( 'text', 'contact-form-7' ),
'wpcf7_tag_generator_text' );
$tag_generator->add( 'email', __( 'email', 'contact-form-7' ),
'wpcf7_tag_generator_text' );
$tag_generator->add( 'url', __( 'URL', 'contact-form-7' ),
'wpcf7_tag_generator_text' );
$tag_generator->add( 'tel', __( 'tel', 'contact-form-7' ),
'wpcf7_tag_generator_text' );
}
function wpcf7_tag_generator_text( $contact_form, $args = '' ) {
$args = wp_parse_args( $args, array() );
$type = $args['id'];
if ( ! in_array( $type, array( 'email', 'url', 'tel' ) ) ) {
$type = 'text';
}
if ( 'text' == $type ) {
$description = __( "Generate a form-tag for a single-line plain text input field. For more details, see %s.", 'contact-form-7' );
} elseif ( 'email' == $type ) {
$description = __( "Generate a form-tag for a single-line email address input field. For more details, see %s.", 'contact-form-7' );
} elseif ( 'url' == $type ) {
$description = __( "Generate a form-tag for a single-line URL input field. For more details, see %s.", 'contact-form-7' );
} elseif ( 'tel' == $type ) {
$description = __( "Generate a form-tag for a single-line telephone number input field. For more details, see %s.", 'contact-form-7' );
}
$desc_link = wpcf7_link( __( 'https://contactform7.com/text-fields/', 'contact-form-7' ), __( 'Text Fields', 'contact-form-7' ) );
?>
<div class="control-box">
<fieldset>
<legend><?php echo sprintf( esc_html( $description ), $desc_link ); ?></legend>
<table class="form-table">
<tbody>
<tr>
<th scope="row"><?php echo esc_html( __( 'Field type', 'contact-form-7' ) ); ?></th>
<td>
<fieldset>
<legend class="screen-reader-text"><?php echo esc_html( __( 'Field type', 'contact-form-7' ) ); ?></legend>
<label><input type="checkbox" name="required" /> <?php echo esc_html( __( 'Required field', 'contact-form-7' ) ); ?></label>
</fieldset>
</td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-name' ); ?>"><?php echo esc_html( __( 'Name', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="name" class="tg-name oneline" id="<?php echo esc_attr( $args['content'] . '-name' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-values' ); ?>"><?php echo esc_html( __( 'Default value', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="values" class="oneline" id="<?php echo esc_attr( $args['content'] . '-values' ); ?>" /><br />
<label><input type="checkbox" name="placeholder" class="option" /> <?php echo esc_html( __( 'Use this text as the placeholder of the field', 'contact-form-7' ) ); ?></label></td>
</tr>
<?php if ( in_array( $type, array( 'text', 'email', 'url' ) ) ) : ?>
<tr>
<th scope="row"><?php echo esc_html( __( 'Akismet', 'contact-form-7' ) ); ?></th>
<td>
<fieldset>
<legend class="screen-reader-text"><?php echo esc_html( __( 'Akismet', 'contact-form-7' ) ); ?></legend>
<?php if ( 'text' == $type ) : ?>
<label>
<input type="checkbox" name="akismet:author" class="option" />
<?php echo esc_html( __( "This field requires author's name", 'contact-form-7' ) ); ?>
</label>
<?php elseif ( 'email' == $type ) : ?>
<label>
<input type="checkbox" name="akismet:author_email" class="option" />
<?php echo esc_html( __( "This field requires author's email address", 'contact-form-7' ) ); ?>
</label>
<?php elseif ( 'url' == $type ) : ?>
<label>
<input type="checkbox" name="akismet:author_url" class="option" />
<?php echo esc_html( __( "This field requires author's URL", 'contact-form-7' ) ); ?>
</label>
<?php endif; ?>
</fieldset>
</td>
</tr>
<?php endif; ?>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-id' ); ?>"><?php echo esc_html( __( 'Id attribute', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="id" class="idvalue oneline option" id="<?php echo esc_attr( $args['content'] . '-id' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-class' ); ?>"><?php echo esc_html( __( 'Class attribute', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="class" class="classvalue oneline option" id="<?php echo esc_attr( $args['content'] . '-class' ); ?>" /></td>
</tr>
</tbody>
</table>
</fieldset>
</div>
<div class="insert-box">
<input type="text" name="<?php echo $type; ?>" class="tag code" readonly="readonly" onfocus="this.select()" />
<div class="submitbox">
<input type="button" class="button button-primary insert-tag" value="<?php echo esc_attr( __( 'Insert Tag', 'contact-form-7' ) ); ?>" />
</div>
<br class="clear" />
<p class="description mail-tag"><label for="<?php echo esc_attr( $args['content'] . '-mailtag' ); ?>"><?php echo sprintf( esc_html( __( "To use the value input through this field in a mail field, you need to insert the corresponding mail-tag (%s) into the field on the Mail tab.", 'contact-form-7' ) ), '<strong><span class="mail-tag"></span></strong>' ); ?><input type="text" class="mail-tag code hidden" readonly="readonly" id="<?php echo esc_attr( $args['content'] . '-mailtag' ); ?>" /></label></p>
</div>
<?php
}

View File

@ -0,0 +1,198 @@
<?php
/**
** A base module for [textarea] and [textarea*]
**/
/* form_tag handler */
add_action( 'wpcf7_init', 'wpcf7_add_form_tag_textarea', 10, 0 );
function wpcf7_add_form_tag_textarea() {
wpcf7_add_form_tag( array( 'textarea', 'textarea*' ),
'wpcf7_textarea_form_tag_handler', array( 'name-attr' => true ) );
}
function wpcf7_textarea_form_tag_handler( $tag ) {
if ( empty( $tag->name ) ) {
return '';
}
$validation_error = wpcf7_get_validation_error( $tag->name );
$class = wpcf7_form_controls_class( $tag->type );
if ( $validation_error ) {
$class .= ' wpcf7-not-valid';
}
$atts = array();
$atts['cols'] = $tag->get_cols_option( '40' );
$atts['rows'] = $tag->get_rows_option( '10' );
$atts['maxlength'] = $tag->get_maxlength_option();
$atts['minlength'] = $tag->get_minlength_option();
if ( $atts['maxlength'] and $atts['minlength']
and $atts['maxlength'] < $atts['minlength'] ) {
unset( $atts['maxlength'], $atts['minlength'] );
}
$atts['class'] = $tag->get_class_option( $class );
$atts['id'] = $tag->get_id_option();
$atts['tabindex'] = $tag->get_option( 'tabindex', 'signed_int', true );
$atts['autocomplete'] = $tag->get_option( 'autocomplete',
'[-0-9a-zA-Z]+', true );
if ( $tag->has_option( 'readonly' ) ) {
$atts['readonly'] = 'readonly';
}
if ( $tag->is_required() ) {
$atts['aria-required'] = 'true';
}
$atts['aria-invalid'] = $validation_error ? 'true' : 'false';
$value = empty( $tag->content )
? (string) reset( $tag->values )
: $tag->content;
if ( $tag->has_option( 'placeholder' )
or $tag->has_option( 'watermark' ) ) {
$atts['placeholder'] = $value;
$value = '';
}
$value = $tag->get_default_option( $value );
$value = wpcf7_get_hangover( $tag->name, $value );
$atts['name'] = $tag->name;
$atts = wpcf7_format_atts( $atts );
$html = sprintf(
'<span class="wpcf7-form-control-wrap %1$s"><textarea %2$s>%3$s</textarea>%4$s</span>',
sanitize_html_class( $tag->name ), $atts,
esc_textarea( $value ), $validation_error );
return $html;
}
/* Validation filter */
add_filter( 'wpcf7_validate_textarea',
'wpcf7_textarea_validation_filter', 10, 2 );
add_filter( 'wpcf7_validate_textarea*',
'wpcf7_textarea_validation_filter', 10, 2 );
function wpcf7_textarea_validation_filter( $result, $tag ) {
$type = $tag->type;
$name = $tag->name;
$value = isset( $_POST[$name] ) ? (string) $_POST[$name] : '';
if ( $tag->is_required() and '' == $value ) {
$result->invalidate( $tag, wpcf7_get_message( 'invalid_required' ) );
}
if ( '' !== $value ) {
$maxlength = $tag->get_maxlength_option();
$minlength = $tag->get_minlength_option();
if ( $maxlength and $minlength
and $maxlength < $minlength ) {
$maxlength = $minlength = null;
}
$code_units = wpcf7_count_code_units( stripslashes( $value ) );
if ( false !== $code_units ) {
if ( $maxlength and $maxlength < $code_units ) {
$result->invalidate( $tag, wpcf7_get_message( 'invalid_too_long' ) );
} elseif ( $minlength and $code_units < $minlength ) {
$result->invalidate( $tag, wpcf7_get_message( 'invalid_too_short' ) );
}
}
}
return $result;
}
/* Tag generator */
add_action( 'wpcf7_admin_init', 'wpcf7_add_tag_generator_textarea', 20, 0 );
function wpcf7_add_tag_generator_textarea() {
$tag_generator = WPCF7_TagGenerator::get_instance();
$tag_generator->add( 'textarea', __( 'text area', 'contact-form-7' ),
'wpcf7_tag_generator_textarea' );
}
function wpcf7_tag_generator_textarea( $contact_form, $args = '' ) {
$args = wp_parse_args( $args, array() );
$type = 'textarea';
$description = __( "Generate a form-tag for a multi-line text input field. For more details, see %s.", 'contact-form-7' );
$desc_link = wpcf7_link( __( 'https://contactform7.com/text-fields/', 'contact-form-7' ), __( 'Text Fields', 'contact-form-7' ) );
?>
<div class="control-box">
<fieldset>
<legend><?php echo sprintf( esc_html( $description ), $desc_link ); ?></legend>
<table class="form-table">
<tbody>
<tr>
<th scope="row"><?php echo esc_html( __( 'Field type', 'contact-form-7' ) ); ?></th>
<td>
<fieldset>
<legend class="screen-reader-text"><?php echo esc_html( __( 'Field type', 'contact-form-7' ) ); ?></legend>
<label><input type="checkbox" name="required" /> <?php echo esc_html( __( 'Required field', 'contact-form-7' ) ); ?></label>
</fieldset>
</td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-name' ); ?>"><?php echo esc_html( __( 'Name', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="name" class="tg-name oneline" id="<?php echo esc_attr( $args['content'] . '-name' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-values' ); ?>"><?php echo esc_html( __( 'Default value', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="values" class="oneline" id="<?php echo esc_attr( $args['content'] . '-values' ); ?>" /><br />
<label><input type="checkbox" name="placeholder" class="option" /> <?php echo esc_html( __( 'Use this text as the placeholder of the field', 'contact-form-7' ) ); ?></label></td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-id' ); ?>"><?php echo esc_html( __( 'Id attribute', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="id" class="idvalue oneline option" id="<?php echo esc_attr( $args['content'] . '-id' ); ?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $args['content'] . '-class' ); ?>"><?php echo esc_html( __( 'Class attribute', 'contact-form-7' ) ); ?></label></th>
<td><input type="text" name="class" class="classvalue oneline option" id="<?php echo esc_attr( $args['content'] . '-class' ); ?>" /></td>
</tr>
</tbody>
</table>
</fieldset>
</div>
<div class="insert-box">
<input type="text" name="<?php echo $type; ?>" class="tag code" readonly="readonly" onfocus="this.select()" />
<div class="submitbox">
<input type="button" class="button button-primary insert-tag" value="<?php echo esc_attr( __( 'Insert Tag', 'contact-form-7' ) ); ?>" />
</div>
<br class="clear" />
<p class="description mail-tag"><label for="<?php echo esc_attr( $args['content'] . '-mailtag' ); ?>"><?php echo sprintf( esc_html( __( "To use the value input through this field in a mail field, you need to insert the corresponding mail-tag (%s) into the field on the Mail tab.", 'contact-form-7' ) ), '<strong><span class="mail-tag"></span></strong>' ); ?><input type="text" class="mail-tag code hidden" readonly="readonly" id="<?php echo esc_attr( $args['content'] . '-mailtag' ); ?>" /></label></p>
</div>
<?php
}

View File

@ -0,0 +1,150 @@
=== Contact Form 7 ===
Contributors: takayukister
Donate link: https://contactform7.com/donate/
Tags: contact, form, contact form, feedback, email, ajax, captcha, akismet, multilingual
Requires at least: 4.9
Tested up to: 5.0
Stable tag: 5.1.1
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Just another contact form plugin. Simple but flexible.
== Description ==
Contact Form 7 can manage multiple contact forms, plus you can customize the form and the mail contents flexibly with simple markup. The form supports Ajax-powered submitting, CAPTCHA, Akismet spam filtering and so on.
= Docs & Support =
You can find [docs](https://contactform7.com/docs/), [FAQ](https://contactform7.com/faq/) and more detailed information about Contact Form 7 on [contactform7.com](https://contactform7.com/). If you were unable to find the answer to your question on the FAQ or in any of the documentation, you should check the [support forum](https://wordpress.org/support/plugin/contact-form-7/) on WordPress.org. If you can't locate any topics that pertain to your particular issue, post a new topic for it.
= Contact Form 7 Needs Your Support =
It is hard to continue development and support for this free plugin without contributions from users like you. If you enjoy using Contact Form 7 and find it useful, please consider [__making a donation__](https://contactform7.com/donate/). Your donation will help encourage and support the plugin's continued development and better user support.
= Privacy Notices =
With the default configuration, this plugin, in itself, does not:
* track users by stealth;
* write any user personal data to the database;
* send any data to external servers;
* use cookies.
If you activate certain features in this plugin, the contact form submitter's personal data, including their IP address, may be sent to the service provider. Thus, confirming the provider's privacy policy is recommended. These features include:
* reCAPTCHA ([Google](https://policies.google.com/?hl=en))
* Akismet ([Automattic](https://automattic.com/privacy/))
* Constant Contact ([Endurance International Group](https://www.endurance.com/privacy))
= Recommended Plugins =
The following plugins are recommended for Contact Form 7 users:
* [Flamingo](https://wordpress.org/plugins/flamingo/) by Takayuki Miyoshi - With Flamingo, you can save submitted messages via contact forms in the database.
* [Bogo](https://wordpress.org/plugins/bogo/) by Takayuki Miyoshi - Bogo is a straight-forward multilingual plugin that doesn't cause headaches.
= Translations =
You can [translate Contact Form 7](https://contactform7.com/translating-contact-form-7/) on [__translate.wordpress.org__](https://translate.wordpress.org/projects/wp-plugins/contact-form-7).
== Installation ==
1. Upload the entire `contact-form-7` folder to the `/wp-content/plugins/` directory.
1. Activate the plugin through the 'Plugins' menu in WordPress.
You will find 'Contact' menu in your WordPress admin panel.
For basic usage, you can also have a look at the [plugin web site](https://contactform7.com/).
== Frequently Asked Questions ==
Do you have questions or issues with Contact Form 7? Use these support channels appropriately.
1. [Docs](https://contactform7.com/docs/)
1. [FAQ](https://contactform7.com/faq/)
1. [Support Forum](https://wordpress.org/support/plugin/contact-form-7/)
[Support](https://contactform7.com/support/)
== Screenshots ==
1. screenshot-1.png
== Changelog ==
For more information, see [Releases](https://contactform7.com/category/releases/).
= 5.1.1 =
* reCAPTCHA: Modifies the reaction to empty response tokens.
= 5.1 =
* Introduces the Constant Contact integration module.
* Updates the reCAPTCHA module to support reCAPTCHA v3.
* Adds Dark Mode style rules.
= 5.0.5 =
* Fixes the inconsistency problem between get_data_option() and get_default_option() in the WPCF7_FormTag class.
* Suppresses PHP errors occur on unlink() calls.
* Introduces wpcf7_is_file_path_in_content_dir() to support the use of the UPLOADS constant.
= 5.0.4 =
* Specifies the capability_type argument explicitly in the register_post_type() call to fix the privilege escalation vulnerability issue.
* Local File Attachment disallows the specifying of absolute file paths referring to files outside the wp-content directory.
* Config Validator adds a test item to detect invalid file attachment settings.
* Fixes a bug in the JavaScript fallback function for legacy browsers that do not support the HTML5 placeholder attribute.
* Acceptance Checkbox unsets the form-tag's do-not-store feature.
= 5.0.3 =
* CSS: Applies the "not-allowed" cursor style to submit buttons in the "disabled" state.
* Acceptance Checkbox: Revises the tag-generator UI to encourage the use of better options in terms of personal data protection.
* Introduces wpcf7_anonymize_ip_addr() function.
* Introduces the consent_for:storage option for all types of form-tags.
= 5.0.2 =
* Added the Privacy Notices section to the readme.txt file.
* Updated the Information meta-box content.
* Use get_user_locale() instead of get_locale() where it is more appropriate.
* Acceptance Checkbox: Reset submit buttons disabled status after a successful submission.
= 5.0.1 =
* Fixed incorrect uses of _n().
* Config validation: Fixed incorrect count of alerts in the Additional Settings tab panel.
* Config validation: Fixed improper treatment for the [_site_admin_email] special mail-tag in the From mail header field.
* Acceptance checkbox: The class and id attributes specified were applied to the wrong HTML element.
* Config validation: When there is an additional mail header for mailboxes like Cc or Reply-To, but it has a possible empty value, “Invalid mailbox syntax is used” error will be returned.
* Explicitly specify the fourth parameter of add_action() to avoid passing unintended parameter values.
* Check if the target directory is empty before removing the directory.
= 5.0 =
* Additional settings: on_sent_ok and on_submit have been removed.
* New additional setting: skip_mail
* Flamingo: Inbound channel title changes in conjunction with a change in the title of the corresponding contact form.
* DOM events: Make an entire API response object accessible through the event.detail.apiResponse property.
* HTML mail: Adds language-related attributes to the HTML header.
* File upload: Sets the accept attribute to an uploading field.
* Introduces the WPCF7_MailTag class.
* Allows aborting a mail-sending attempt using the wpcf7_before_send_mail action hook. Also, you can set a custom status and a message through the action hook.
* Acceptance checkbox: Allows the specifying of a statement of conditions in the form-tags content part.
* Acceptance checkbox: Supports the optional option.
* New special mail tags: [_site_title], [_site_description], [_site_url], [_site_admin_email], [_invalid_fields], [_user_login], [_user_email], [_user_url], [_user_first_name], [_user_last_name], [_user_nickname], and [_user_display_name]
* New filter hooks: wpcf7_upload_file_name, wpcf7_autop_or_not, wpcf7_posted_data_{$type}, and wpcf7_mail_tag_replaced_{$type}
* New form-tag features: zero-controls-container and not-for-mail
== Upgrade Notice ==
= 5.1.1 =
Read the [release announcement post](https://contactform7.com/category/releases/) before upgrading. There is an important notice.
= 5.0.4 =
This is a security and maintenance release and we strongly encourage you to update to it immediately. For more information, refer to the [release announcement post](https://contactform7.com/category/releases/).

View File

@ -0,0 +1,158 @@
<?php
require_once WPCF7_PLUGIN_DIR . '/includes/functions.php';
require_once WPCF7_PLUGIN_DIR . '/includes/l10n.php';
require_once WPCF7_PLUGIN_DIR . '/includes/formatting.php';
require_once WPCF7_PLUGIN_DIR . '/includes/pipe.php';
require_once WPCF7_PLUGIN_DIR . '/includes/form-tag.php';
require_once WPCF7_PLUGIN_DIR . '/includes/form-tags-manager.php';
require_once WPCF7_PLUGIN_DIR . '/includes/shortcodes.php';
require_once WPCF7_PLUGIN_DIR . '/includes/capabilities.php';
require_once WPCF7_PLUGIN_DIR . '/includes/contact-form-template.php';
require_once WPCF7_PLUGIN_DIR . '/includes/contact-form.php';
require_once WPCF7_PLUGIN_DIR . '/includes/contact-form-functions.php';
require_once WPCF7_PLUGIN_DIR . '/includes/mail.php';
require_once WPCF7_PLUGIN_DIR . '/includes/special-mail-tags.php';
require_once WPCF7_PLUGIN_DIR . '/includes/submission.php';
require_once WPCF7_PLUGIN_DIR . '/includes/upgrade.php';
require_once WPCF7_PLUGIN_DIR . '/includes/integration.php';
require_once WPCF7_PLUGIN_DIR . '/includes/config-validator.php';
require_once WPCF7_PLUGIN_DIR . '/includes/rest-api.php';
if ( is_admin() ) {
require_once WPCF7_PLUGIN_DIR . '/admin/admin.php';
} else {
require_once WPCF7_PLUGIN_DIR . '/includes/controller.php';
}
class WPCF7 {
public static function load_modules() {
self::load_module( 'acceptance' );
self::load_module( 'akismet' );
self::load_module( 'checkbox' );
self::load_module( 'constant-contact' );
self::load_module( 'count' );
self::load_module( 'date' );
self::load_module( 'file' );
self::load_module( 'flamingo' );
self::load_module( 'hidden' );
self::load_module( 'listo' );
self::load_module( 'number' );
self::load_module( 'quiz' );
self::load_module( 'really-simple-captcha' );
self::load_module( 'recaptcha' );
self::load_module( 'response' );
self::load_module( 'select' );
self::load_module( 'submit' );
self::load_module( 'text' );
self::load_module( 'textarea' );
}
protected static function load_module( $mod ) {
$dir = WPCF7_PLUGIN_MODULES_DIR;
if ( empty( $dir ) or ! is_dir( $dir ) ) {
return false;
}
$file = path_join( $dir, $mod . '.php' );
if ( file_exists( $file ) ) {
include_once $file;
}
}
public static function get_option( $name, $default = false ) {
$option = get_option( 'wpcf7' );
if ( false === $option ) {
return $default;
}
if ( isset( $option[$name] ) ) {
return $option[$name];
} else {
return $default;
}
}
public static function update_option( $name, $value ) {
$option = get_option( 'wpcf7' );
$option = ( false === $option ) ? array() : (array) $option;
$option = array_merge( $option, array( $name => $value ) );
update_option( 'wpcf7', $option );
}
}
add_action( 'plugins_loaded', 'wpcf7', 10, 0 );
function wpcf7() {
wpcf7_load_textdomain();
WPCF7::load_modules();
/* Shortcodes */
add_shortcode( 'contact-form-7', 'wpcf7_contact_form_tag_func' );
add_shortcode( 'contact-form', 'wpcf7_contact_form_tag_func' );
}
add_action( 'init', 'wpcf7_init', 10, 0 );
function wpcf7_init() {
wpcf7_get_request_uri();
wpcf7_register_post_types();
do_action( 'wpcf7_init' );
}
add_action( 'admin_init', 'wpcf7_upgrade', 10, 0 );
function wpcf7_upgrade() {
$old_ver = WPCF7::get_option( 'version', '0' );
$new_ver = WPCF7_VERSION;
if ( $old_ver == $new_ver ) {
return;
}
do_action( 'wpcf7_upgrade', $new_ver, $old_ver );
WPCF7::update_option( 'version', $new_ver );
}
/* Install and default settings */
add_action( 'activate_' . WPCF7_PLUGIN_BASENAME, 'wpcf7_install', 10, 0 );
function wpcf7_install() {
if ( $opt = get_option( 'wpcf7' ) ) {
return;
}
wpcf7_load_textdomain();
wpcf7_register_post_types();
wpcf7_upgrade();
if ( get_posts( array( 'post_type' => 'wpcf7_contact_form' ) ) ) {
return;
}
$contact_form = WPCF7_ContactForm::get_template(
array(
'title' =>
/* translators: title of your first contact form. %d: number fixed to '1' */
sprintf( __( 'Contact form %d', 'contact-form-7' ), 1 ),
)
);
$contact_form->save();
WPCF7::update_option( 'bulk_validate',
array(
'timestamp' => current_time( 'timestamp' ),
'version' => WPCF7_VERSION,
'count_valid' => 1,
'count_invalid' => 0,
)
);
}

View File

@ -0,0 +1,28 @@
<?php
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
exit();
}
function wpcf7_delete_plugin() {
global $wpdb;
delete_option( 'wpcf7' );
$posts = get_posts(
array(
'numberposts' => -1,
'post_type' => 'wpcf7_contact_form',
'post_status' => 'any',
)
);
foreach ( $posts as $post ) {
wp_delete_post( $post->ID, true );
}
$wpdb->query( sprintf( "DROP TABLE IF EXISTS %s",
$wpdb->prefix . 'contact_form_7' ) );
}
wpcf7_delete_plugin();

View File

@ -0,0 +1,67 @@
<?php
/*
Plugin Name: Contact Form 7
Plugin URI: https://contactform7.com/
Description: Just another contact form plugin. Simple but flexible.
Author: Takayuki Miyoshi
Author URI: https://ideasilo.wordpress.com/
Text Domain: contact-form-7
Domain Path: /languages/
Version: 5.1.1
*/
define( 'WPCF7_VERSION', '5.1.1' );
define( 'WPCF7_REQUIRED_WP_VERSION', '4.9' );
define( 'WPCF7_PLUGIN', __FILE__ );
define( 'WPCF7_PLUGIN_BASENAME', plugin_basename( WPCF7_PLUGIN ) );
define( 'WPCF7_PLUGIN_NAME', trim( dirname( WPCF7_PLUGIN_BASENAME ), '/' ) );
define( 'WPCF7_PLUGIN_DIR', untrailingslashit( dirname( WPCF7_PLUGIN ) ) );
define( 'WPCF7_PLUGIN_MODULES_DIR', WPCF7_PLUGIN_DIR . '/modules' );
if ( ! defined( 'WPCF7_LOAD_JS' ) ) {
define( 'WPCF7_LOAD_JS', true );
}
if ( ! defined( 'WPCF7_LOAD_CSS' ) ) {
define( 'WPCF7_LOAD_CSS', true );
}
if ( ! defined( 'WPCF7_AUTOP' ) ) {
define( 'WPCF7_AUTOP', true );
}
if ( ! defined( 'WPCF7_USE_PIPE' ) ) {
define( 'WPCF7_USE_PIPE', true );
}
if ( ! defined( 'WPCF7_ADMIN_READ_CAPABILITY' ) ) {
define( 'WPCF7_ADMIN_READ_CAPABILITY', 'edit_posts' );
}
if ( ! defined( 'WPCF7_ADMIN_READ_WRITE_CAPABILITY' ) ) {
define( 'WPCF7_ADMIN_READ_WRITE_CAPABILITY', 'publish_pages' );
}
if ( ! defined( 'WPCF7_VERIFY_NONCE' ) ) {
define( 'WPCF7_VERIFY_NONCE', false );
}
if ( ! defined( 'WPCF7_USE_REALLY_SIMPLE_CAPTCHA' ) ) {
define( 'WPCF7_USE_REALLY_SIMPLE_CAPTCHA', false );
}
if ( ! defined( 'WPCF7_VALIDATE_CONFIGURATION' ) ) {
define( 'WPCF7_VALIDATE_CONFIGURATION', true );
}
// Deprecated, not used in the plugin core. Use wpcf7_plugin_url() instead.
define( 'WPCF7_PLUGIN_URL',
untrailingslashit( plugins_url( '', WPCF7_PLUGIN ) ) );
require_once WPCF7_PLUGIN_DIR . '/settings.php';