before = $this->after = $text; } else { $this->before = substr( $text, 0, $pipe_pos ); $this->after = substr( $text, $pipe_pos + 1 ); } } } class WPCF7_Pipes { var $pipes = array(); function WPCF7_Pipes( $texts ) { if ( ! is_array( $texts ) ) return; foreach ( $texts as $text ) { $this->add_pipe( $text ); } } function add_pipe( $text ) { $pipe = new WPCF7_Pipe( $text ); $this->pipes[] = $pipe; } function do_pipe( $before ) { foreach ( $this->pipes as $pipe ) { if ( $pipe->before == $before ) return $pipe->after; } return $before; } function collect_befores() { $befores = array(); foreach ( $this->pipes as $pipe ) { $befores[] = $pipe->before; } return $befores; } function zero() { return empty( $this->pipes ); } function random_pipe() { if ( $this->zero() ) return null; return $this->pipes[array_rand( $this->pipes )]; } } ?> shortcode_tags[$tag] = array( 'function' => $func, 'has_name' => (boolean) $has_name ); } function remove_shortcode( $tag ) { unset( $this->shortcode_tags[$tag] ); } function do_shortcode( $content, $exec = true ) { $this->exec = (bool) $exec; $this->scanned_tags = array(); if ( empty( $this->shortcode_tags ) || ! is_array( $this->shortcode_tags) ) return $content; $pattern = $this->get_shortcode_regex(); return preg_replace_callback( '/' . $pattern . '/s', array(&$this, 'do_shortcode_tag'), $content ); } function scan_shortcode( $content ) { $this->do_shortcode( $content, false ); return $this->scanned_tags; } function get_shortcode_regex() { $tagnames = array_keys( $this->shortcode_tags ); $tagregexp = join( '|', array_map( 'preg_quote', $tagnames ) ); return '(\[?)\[(' . $tagregexp . ')(?:\s(.*?))?(?:\s(\/))?\](?:(.+?)\[\/\2\])?(\]?)'; } function do_shortcode_tag( $m ) { // allow [[foo]] syntax for escaping a tag if ( $m[1] == '[' && $m[6] == ']' ) { return substr( $m[0], 1, -1 ); } $tag = $m[2]; $attr = $this->shortcode_parse_atts( $m[3] ); $scanned_tag = array(); $scanned_tag['type'] = $tag; if ( is_array( $attr ) ) { if ( is_array( $attr['options'] ) ) { if ( $this->shortcode_tags[$tag]['has_name'] && ! 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; } $content = trim( $m[5] ); $content = preg_replace( "/$/m", '', $content ); $scanned_tag['content'] = $content; $scanned_tag = apply_filters( 'wpcf7_form_tag', $scanned_tag, $this->exec ); $this->scanned_tags[] = $scanned_tag; if ( $this->exec ) { $func = $this->shortcode_tags[$tag]['function']; return $m[1] . call_user_func( $func, $scanned_tag ) . $m[6]; } else { return $m[0]; } } function shortcode_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:.!?#$&@_/|\%\s]*?)((?:\s*"[^"]*"|\s*\'[^\']*\')*)$%'; if ( preg_match( $pattern, $text, $match ) ) { if ( ! empty( $match[1] ) ) { $atts['options'] = preg_split( '/[\s]+/', 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; } } $wpcf7_shortcode_manager = new WPCF7_ShortcodeManager(); function wpcf7_add_shortcode( $tag, $func, $has_name = false ) { global $wpcf7_shortcode_manager; return $wpcf7_shortcode_manager->add_shortcode( $tag, $func, $has_name ); } function wpcf7_remove_shortcode( $tag ) { global $wpcf7_shortcode_manager; return $wpcf7_shortcode_manager->remove_shortcode( $tag ); } function wpcf7_do_shortcode( $content ) { global $wpcf7_shortcode_manager; return $wpcf7_shortcode_manager->do_shortcode( $content ); } function wpcf7_get_shortcode_regex() { global $wpcf7_shortcode_manager; return $wpcf7_shortcode_manager->get_shortcode_regex(); } ?> unit_tag == $_POST['_wpcf7_unit_tag'] ) return true; return false; } /* Generating Form HTML */ function form_html() { $form = '
'; $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 ); $url = esc_url_raw( $url ); $enctype = apply_filters( 'wpcf7_form_enctype', '' ); $form .= '
' . "\n"; $form .= '
' . "\n"; $form .= '' . "\n"; $form .= '' . "\n"; $form .= '' . "\n"; $form .= '
' . "\n"; $form .= $this->form_elements(); if ( ! $this->responses_count ) $form .= $this->form_response_output(); $form .= '
'; $form .= '
'; return $form; } function form_response_output() { $class = 'wpcf7-response-output'; $content = ''; if ( $this->is_posted() ) { // Post response output for non-AJAX if ( isset( $_POST['_wpcf7_mail_sent'] ) && $_POST['_wpcf7_mail_sent']['id'] == $this->id ) { if ( $_POST['_wpcf7_mail_sent']['ok'] ) { $class .= ' wpcf7-mail-sent-ok'; $content = $_POST['_wpcf7_mail_sent']['message']; } else { $class .= ' wpcf7-mail-sent-ng'; if ( $_POST['_wpcf7_mail_sent']['spam'] ) $class .= ' wpcf7-spam-blocked'; $content = $_POST['_wpcf7_mail_sent']['message']; } } elseif ( isset( $_POST['_wpcf7_validation_errors'] ) && $_POST['_wpcf7_validation_errors']['id'] == $this->id ) { $class .= ' wpcf7-validation-errors'; $content = $this->message( 'validation_error' ); } } else { $class .= ' wpcf7-display-none'; } $class = ' class="' . $class . '"'; return '' . $content . ''; } function validation_error( $name ) { if ( $this->is_posted() && $ve = $_POST['_wpcf7_validation_errors']['messages'][$name] ) return apply_filters( 'wpcf7_validation_error', '' . esc_html( $ve ) . '', $name, $this ); return ''; } /* Form Elements */ function form_do_shortcode() { global $wpcf7_shortcode_manager; $form = $this->form; $form = $wpcf7_shortcode_manager->do_shortcode( $form ); $this->scanned_form_tags = $wpcf7_shortcode_manager->scanned_tags; if ( WPCF7_AUTOP ) $form = wpcf7_autop( $form ); return $form; } function form_scan_shortcode( $cond = null ) { global $wpcf7_shortcode_manager; if ( ! empty( $this->scanned_form_tags ) ) { $scanned = $this->scanned_form_tags; } else { $scanned = $wpcf7_shortcode_manager->scan_shortcode( $this->form ); $this->scanned_form_tags = $scanned; } if ( empty( $scanned ) ) return null; if ( ! is_array( $cond ) || empty( $cond ) ) return $scanned; for ( $i = 0, $size = count( $scanned ); $i < $size; $i++ ) { if ( is_string( $cond['type'] ) && ! empty( $cond['type'] ) ) { if ( $scanned[$i]['type'] != $cond['type'] ) { unset( $scanned[$i] ); continue; } } elseif ( is_array( $cond['type'] ) ) { if ( ! in_array( $scanned[$i]['type'], $cond['type'] ) ) { unset( $scanned[$i] ); continue; } } if ( is_string( $cond['name'] ) && ! empty( $cond['name'] ) ) { if ( $scanned[$i]['name'] != $cond['name'] ) { unset ( $scanned[$i] ); continue; } } elseif ( is_array( $cond['name'] ) ) { if ( ! in_array( $scanned[$i]['name'], $cond['name'] ) ) { unset( $scanned[$i] ); continue; } } } return array_values( $scanned ); } function form_elements() { $form = apply_filters( 'wpcf7_form_elements', $this->form_do_shortcode() ); // Response output $response_regex = '%\[\s*response\s*\]%'; $form = preg_replace_callback( $response_regex, array( &$this, 'response_replace_callback' ), $form ); return $form; } function response_replace_callback( $matches ) { $this->responses_count += 1; return $this->form_response_output(); } /* Validate */ function validate() { $fes = $this->form_scan_shortcode(); $result = array( 'valid' => true, 'reason' => array() ); foreach ( $fes as $fe ) { $result = apply_filters( 'wpcf7_validate_' . $fe['type'], $result, $fe ); } return $result; } /* Acceptance */ function accepted() { $accepted = true; return apply_filters( 'wpcf7_acceptance', $accepted ); } /* Akismet */ function akismet() { global $akismet_api_host, $akismet_api_port; if ( ! function_exists( 'akismet_http_post' ) || ! ( get_option( 'wordpress_api_key' ) || $wpcom_api_key ) ) return false; $akismet_ready = false; $author = $author_email = $author_url = $content = ''; $fes = $this->form_scan_shortcode(); foreach ( $fes as $fe ) { if ( ! is_array( $fe['options'] ) ) continue; if ( preg_grep( '%^akismet:author$%', $fe['options'] ) && '' == $author ) { $author = $_POST[$fe['name']]; $akismet_ready = true; } if ( preg_grep( '%^akismet:author_email$%', $fe['options'] ) && '' == $author_email ) { $author_email = $_POST[$fe['name']]; $akismet_ready = true; } if ( preg_grep( '%^akismet:author_url$%', $fe['options'] ) && '' == $author_url ) { $author_url = $_POST[$fe['name']]; $akismet_ready = true; } if ( '' != $content ) $content .= "\n\n"; $content .= $_POST[$fe['name']]; } if ( ! $akismet_ready ) return false; $c['blog'] = get_option( 'home' ); $c['user_ip'] = preg_replace( '/[^0-9., ]/', '', $_SERVER['REMOTE_ADDR'] ); $c['user_agent'] = $_SERVER['HTTP_USER_AGENT']; $c['referrer'] = $_SERVER['HTTP_REFERER']; $c['comment_type'] = 'contactform7'; if ( $permalink = get_permalink() ) $c['permalink'] = $permalink; if ( '' != $author ) $c['comment_author'] = $author; if ( '' != $author_email ) $c['comment_author_email'] = $author_email; if ( '' != $author_url ) $c['comment_author_url'] = $author_url; if ( '' != $content ) $c['comment_content'] = $content; $ignore = array( 'HTTP_COOKIE' ); foreach ( $_SERVER as $key => $value ) if ( ! in_array( $key, (array) $ignore ) ) $c["$key"] = $value; $query_string = ''; foreach ( $c as $key => $data ) $query_string .= $key . '=' . urlencode( stripslashes( $data ) ) . '&'; $response = akismet_http_post( $query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port ); if ( 'true' == $response[1] ) return true; else return false; } /* Mail */ function mail() { $fes = $this->form_scan_shortcode(); foreach ( $fes as $fe ) { $name = $fe['name']; $pipes = $fe['pipes']; if ( empty( $name ) ) continue; $value = $_POST[$name]; if ( WPCF7_USE_PIPE && is_a( $pipes, 'WPCF7_Pipes' ) && ! $pipes->zero() ) { if ( is_array( $value) ) { $new_value = array(); foreach ( $value as $v ) { $new_value[] = $pipes->do_pipe( $v ); } $value = $new_value; } else { $value = $pipes->do_pipe( $value ); } } $this->posted_data[$name] = $value; } if ( $this->in_demo_mode() ) $this->skip_mail = true; do_action_ref_array( 'wpcf7_before_send_mail', array( &$this ) ); if ( $this->skip_mail ) return true; if ( $this->compose_and_send_mail( $this->mail ) ) { if ( $this->mail_2['active'] ) $this->compose_and_send_mail( $this->mail_2 ); return true; } return false; } function compose_and_send_mail( $mail_template ) { $regex = '/\[\s*([a-zA-Z_][0-9a-zA-Z:._-]*)\s*\]/'; $callback = array( &$this, 'mail_callback' ); $subject = preg_replace_callback( $regex, $callback, $mail_template['subject'] ); $sender = preg_replace_callback( $regex, $callback, $mail_template['sender'] ); $body = preg_replace_callback( $regex, $callback, $mail_template['body'] ); $recipient = preg_replace_callback( $regex, $callback, $mail_template['recipient'] ); $additional_headers = preg_replace_callback( $regex, $callback, $mail_template['additional_headers'] ); extract( apply_filters( 'wpcf7_mail_components', compact( 'subject', 'sender', 'body', 'recipient', 'additional_headers' ) ) ); $headers = "From: $sender\n"; if ( $mail_template['use_html'] ) $headers .= "Content-Type: text/html\n"; $headers .= trim( $additional_headers ) . "\n"; if ( $this->uploaded_files ) { $for_this_mail = array(); foreach ( $this->uploaded_files as $name => $path ) { if ( false === strpos( $mail_template['attachments'], "[${name}]" ) ) continue; $for_this_mail[] = $path; } return @wp_mail( $recipient, $subject, $body, $headers, $for_this_mail ); } else { return @wp_mail( $recipient, $subject, $body, $headers ); } } function mail_callback( $matches ) { if ( isset( $this->posted_data[$matches[1]] ) ) { $submitted = $this->posted_data[$matches[1]]; if ( is_array( $submitted ) ) $replaced = join( ', ', $submitted ); else $replaced = $submitted; $replaced = apply_filters( 'wpcf7_mail_tag_replaced', $replaced, $submitted ); return stripslashes( $replaced ); } if ( $special = apply_filters( 'wpcf7_special_mail_tags', '', $matches[1] ) ) return $special; return $matches[0]; } /* Message */ function message( $status ) { $messages = $this->messages; $message = $messages[$status]; return apply_filters( 'wpcf7_display_message', $message ); } /* Additional settings */ function additional_setting( $name, $max = 1 ) { $tmp_settings = (array) explode( "\n", $this->additional_settings ); $count = 0; $values = array(); foreach ( $tmp_settings as $setting ) { if ( preg_match('/^([a-zA-Z0-9_]+)\s*:(.*)$/', $setting, $matches ) ) { if ( $matches[1] != $name ) continue; if ( ! $max || $count < (int) $max ) { $values[] = trim( $matches[2] ); $count += 1; } } } return $values; } function in_demo_mode() { $settings = $this->additional_setting( 'demo_mode', false ); foreach ( $settings as $setting ) { if ( in_array( $setting, array( 'on', 'true', '1' ) ) ) return true; } return false; } /* Upgrade */ function upgrade() { if ( ! isset( $this->mail['recipient'] ) ) $this->mail['recipient'] = get_option( 'admin_email' ); if ( ! is_array( $this->messages ) ) $this->messages = array(); foreach ( wpcf7_messages() as $key => $arr ) { if ( ! isset( $this->messages[$key] ) ) $this->messages[$key] = $arr['default']; } } /* Save */ function save() { global $wpdb, $wpcf7; $fields = array( 'title' => maybe_serialize( stripslashes_deep( $this->title ) ), 'form' => maybe_serialize( stripslashes_deep( $this->form ) ), 'mail' => maybe_serialize( stripslashes_deep( $this->mail ) ), 'mail_2' => maybe_serialize ( stripslashes_deep( $this->mail_2 ) ), 'messages' => maybe_serialize( stripslashes_deep( $this->messages ) ), 'additional_settings' => maybe_serialize( stripslashes_deep( $this->additional_settings ) ) ); if ( $this->initial ) { $result = $wpdb->insert( $wpcf7->contactforms, $fields ); if ( $result ) { $this->initial = false; $this->id = $wpdb->insert_id; do_action_ref_array( 'wpcf7_after_create', array( &$this ) ); } else { return false; // Failed to save } } else { // Update if ( ! (int) $this->id ) return false; // Missing ID $result = $wpdb->update( $wpcf7->contactforms, $fields, array( 'cf7_unit_id' => absint( $this->id ) ) ); if ( false !== $result ) { do_action_ref_array( 'wpcf7_after_update', array( &$this ) ); } else { return false; // Failed to save } } do_action_ref_array( 'wpcf7_after_save', array( &$this ) ); return true; // Succeeded to save } function copy() { $new = new WPCF7_ContactForm(); $new->initial = true; $new->title = $this->title . '_copy'; $new->form = $this->form; $new->mail = $this->mail; $new->mail_2 = $this->mail_2; $new->messages = $this->messages; $new->additional_settings = $this->additional_settings; return $new; } function delete() { global $wpdb, $wpcf7; if ( $this->initial ) return; $query = $wpdb->prepare( "DELETE FROM $wpcf7->contactforms WHERE cf7_unit_id = %d LIMIT 1", absint( $this->id ) ); $wpdb->query( $query ); $this->initial = true; $this->id = null; } } function wpcf7_contact_form( $id ) { global $wpdb, $wpcf7; $query = $wpdb->prepare( "SELECT * FROM $wpcf7->contactforms WHERE cf7_unit_id = %d", $id ); if ( ! $row = $wpdb->get_row( $query ) ) return false; // No data $contact_form = new WPCF7_ContactForm(); $contact_form->id = $row->cf7_unit_id; $contact_form->title = maybe_unserialize( $row->title ); $contact_form->form = maybe_unserialize( $row->form ); $contact_form->mail = maybe_unserialize( $row->mail ); $contact_form->mail_2 = maybe_unserialize( $row->mail_2 ); $contact_form->messages = maybe_unserialize( $row->messages ); $contact_form->additional_settings = maybe_unserialize( $row->additional_settings ); $contact_form->upgrade(); return $contact_form; } function wpcf7_contact_form_default_pack( $locale = null ) { global $l10n; if ( $locale && $locale != get_locale() ) { $mo_orig = $l10n['wpcf7']; unset( $l10n['wpcf7'] ); if ( 'en_US' != $locale ) { $mofile = wpcf7_plugin_path( 'languages/wpcf7-' . $locale . '.mo' ); if ( ! load_textdomain( 'wpcf7', $mofile ) ) { $l10n['wpcf7'] = $mo_orig; unset( $mo_orig ); } } } $contact_form = new WPCF7_ContactForm(); $contact_form->initial = true; $contact_form->title = __( 'Untitled', 'wpcf7' ); $contact_form->form = wpcf7_default_form_template(); $contact_form->mail = wpcf7_default_mail_template(); $contact_form->mail_2 = wpcf7_default_mail_2_template(); $contact_form->messages = wpcf7_default_messages_template(); if ( isset( $mo_orig ) ) $l10n['wpcf7'] = $mo_orig; return $contact_form; } /* Default Filters */ add_filter( 'wpcf7_special_mail_tags', 'wpcf7_special_mail_tag', 10, 2 ); function wpcf7_special_mail_tag( $output, $name ) { // For backwards compat. $name = preg_replace( '/^wpcf7\./', '_', $name ); if ( '_remote_ip' == $name ) $output = preg_replace( '/[^0-9a-f.:, ]/', '', $_SERVER['REMOTE_ADDR'] ); elseif ( '_url' == $name ) $output = get_option( 'home' ) . wpcf7_get_request_uri(); elseif ( '_date' == $name ) $output = date_i18n( get_option( 'date_format' ) ); elseif ( '_time' == $name ) $output = date_i18n( get_option( 'time_format' ) ); return $output; } add_filter( 'wpcf7_special_mail_tags', 'wpcf7_special_mail_tag_for_post_data', 10, 2 ); function wpcf7_special_mail_tag_for_post_data( $output, $name ) { if ( ! isset( $_POST['_wpcf7_unit_tag'] ) || empty( $_POST['_wpcf7_unit_tag'] ) ) return $output; if ( ! preg_match( '/^wpcf7-f(\d+)-p(\d+)-o(\d+)$/', $_POST['_wpcf7_unit_tag'], $matches ) ) return $output; $post_id = (int) $matches[2]; if ( ! $post = get_post( $post_id ) ) return $output; $user = new WP_User( $post->post_author ); // For backwards compat. $name = preg_replace( '/^wpcf7\./', '_', $name ); if ( '_post_id' == $name ) $output = (string) $post->ID; elseif ( '_post_name' == $name ) $output = $post->post_name; elseif ( '_post_title' == $name ) $output = $post->post_title; elseif ( '_post_url' == $name ) $output = get_permalink( $post->ID ); elseif ( '_post_author' == $name ) $output = $user->display_name; elseif ( '_post_author_email' == $name ) $output = $user->user_email; return $output; } ?>