web-dev-qa-db-ja.com

PHP 連絡フォームがテキストウィジェットで警告を返す

私は連絡フォームを作成しました(あなたからのたくさんの助けを借りてここに)そして私はそれをページやテキストウィジェットで(サイドバーなどのための)ショートコードを通して使用できるようにしたいです。フォームが送信されたときを除いて、それは両方で完璧に動作します、私はサイドバーウィジェットフォームでIllegal string offsetを得ます。ただし、ページフォームは問題なく機能します。私がやろうとしているのは、フォームが正常に送信されたときにユーザー名をエコーするためにフォームから 'name'フィールドを取得することです。警告をスローするコード行は次のとおりです。

echo '<p>Thank you for contacting us '.$_POST['cf-name'].', a member of our team will be in touch with you shortly.</p>';

私も試してみました:

echo '<p>Thank you for contacting us '.(isset($_POST[ 'cf-name' ])).', a member of our team will be in touch with you shortly.</p>';

2番目の例を使用すると、警告は削除されますが、フォームの送信時にユーザー名は表示されず、後者のオプションでは、作業前のページ連絡フォームに1が表示されます。これを修正する方法はありますか?

全機能は次のとおりです。

function my_form_message()
{
    global $errors;
    if (is_wp_error($errors) && empty($errors->errors)) {
        echo '<section class="alertbox-success">';
        echo '<div class="cf-success">';
        echo '<p>Thank you for contacting us '.$_POST['cf-name'].', a member of our team will be in touch with you shortly.</p>';
        echo '</div>';
        echo '</section>';

    //Empty $_POST because we already sent email
    $_POST = '';
    } else {
        if (is_wp_error($errors) && !empty($errors->errors)) {
            $error_messages = $errors->get_error_messages();
            foreach ($error_messages as $k => $message) {
                echo '<section class="alertbox-error">';
                echo '<div class="cf-error '.$k.'">';
                echo '<p>'.$message.'</p>';
                echo '</div>';
                echo '</section>';
            }
        }
    }
}

それが役立つかどうかわからない。任意のアイデアは大歓迎です。前もって感謝します

編集:これは完全な警告です:

/Applications/MAMP/htdocs/centenary-framework/wp-content/themes/cent_framework/assets/inc/core/contact-form.php on line 113

Notice: Uninitialized string offset: 0 in /Applications/MAMP/htdocs/centenary-framework/wp-content/themes/cent_framework/assets/inc/core/contact-form.php on line 113
Thank you for contacting us , a member of our team will be in touch with you shortly.

編集:

フルコード:

<?php

// Form markup
 function cf_form_code()
 {
     ?>
<div class="cf-contact-form">
 <form action="<?php esc_url($_SERVER['REQUEST_URI']);
     ?>" method="post">
   <p>
     <input type="text" name="cf-name" placeholder="Name (required)" pattern="[a-zA-Z0-9 ]+" value="<?php isset($_POST['cf-name']) ? esc_attr($_POST['cf-name']) : '';
     ?><?php if (isset($_POST['cf-name'])) {
    echo htmlentities($_POST['cf-name']);
}
     ?>" size="40" />
   </p>
   <p>
     <input type="email" name="cf-email" placeholder="Email (required)" value="<?php isset($_POST['cf-email']) ? esc_attr($_POST['cf-email']) : '';
     ?><?php if (isset($_POST['cf-email'])) {
    echo htmlentities($_POST['cf-email']);
}
     ?>" size="40" />
   </p>
   <p>
     <input type="tel" name="cf-tel" placeholder="Telephone" pattern="^\s*\(?(020[7,8]{1}\)?[ ]?[1-9]{1}[0-9{2}[ ]?[0-9]{4})|(0[1-8]{1}[0-9]{3}\)?[ ]?[1-9]{1}[0-9]{2}[ ]?[0-9]{3})\s*$" value="<?php isset($_POST['cf-tel']) ? esc_attr($_POST['cf-tel']) : '';
     ?><?php if (isset($_POST['cf-tel'])) {
    echo htmlentities($_POST['cf-tel']);
}
     ?>" size="40" />
   </p>
   <p>
     <textarea class="cf-message" rows="10" cols="35" name="cf-message" placeholder="Message (required)" onkeyup="adjust_textarea(this)"><?php isset($_POST['cf-message']) ? esc_attr($_POST['cf-message']) : '';
     ?><?php if (isset($_POST['cf-message'])) {
    echo htmlentities($_POST['cf-message']);
}
     ?></textarea>
   </p>
   <p><input type="text" name="content" id="content" value="" class="hpot" /></p>
   <p><input type="submit" name="cf-submitted" value="Send"/></p>
 </form>
</div>
 <?php

 }

// Form validation
 function cf_validate_form()
 {
     $errors = new WP_Error();

     if (isset($_POST[ 'content' ]) && $_POST[ 'content' ] !== '') {
         $errors->add('bot', 'Sorry, this field should not be filled in. Robots only');
     }

     if (isset($_POST[ 'cf-name' ]) && $_POST[ 'cf-name' ] == '') {
         $errors->add('name_error', 'Please fill in a valid name.');
     }

     if (isset($_POST[ 'cf-email' ]) && $_POST[ 'cf-email' ] == '') {
         $errors->add('email_error', 'Please fill in a valid email.');
     }

     if (isset($_POST[ 'cf-message' ]) && $_POST[ 'cf-message' ] == '') {
         $errors->add('message_error', 'Please fill in a valid message.');
     }

     return $errors;
 }

// Form delivery
 function deliver_mail($args = array())
 {

  // This $default array is a way to initialize some default values that will be overwritten by our $args array.
  // We could add more keys as we see fit and it's a Nice way to see what parameter we are using in our function.
  // It will only be overwritten with the values of our $args array if the keys are present in $args.
  // This uses WP wp_parse_args() function.
  $defaults = array(
    'name' => '',
    'email' => '',
    'tel' => '',
    'message' => '',
    'to' => get_option('admin_email'), // get the administrator's email address
  );

     $args = wp_parse_args($args, $defaults);

     $headers = "From: {$args['name']}  <{$args['email']}>"."\r\n";

  // Send email returns true on success, false otherwise
  if (wp_mail($args['to'], $args['tel'], $args['message'], $headers)) {
      return;
  } else {
      return false;
  }
 }

// Form sanitize
function cf_sanitize_field($input)
{
    return trim(stripslashes(sanitize_text_field($input)));
}

// Form succsess message
function cf_form_message()
{
    global $errors;
    if (is_wp_error($errors) && empty($errors->errors)) {
        echo '<section class="alertbox-success">';
        echo '<div class="cf-success">';
        echo '<p>Thank you for contacting us '.$_POST['cf-name'].', a member of our team will be in touch with you shortly.</p>';
        echo '</div>';
        echo '</section>';

    //Empty $_POST because we already sent email
    $_POST = '';
    } else {
        if (is_wp_error($errors) && !empty($errors->errors)) {
            $error_messages = $errors->get_error_messages();
            foreach ($error_messages as $k => $message) {
                echo '<section class="alertbox-error">';
                echo '<div class="cf-error '.$k.'">';
                echo '<p>'.$message.'</p>';
                echo '</div>';
                echo '</section>';
            }
        }
    }
}

// Form shortcode
add_shortcode('contact_form', 'cf_contact_form');
function cf_contact_form()
{
    ob_start();

    cf_form_message();
    cf_form_code();

    return ob_get_clean();
}

// Error validation
add_action('init', 'cf_cf_form');
function cf_cf_form()
{
    if (isset($_POST['cf-submitted'])) {
        global $errors;
        $errors = cf_validate_form();
        if (empty($errors->errors)) {
            $args = array(
         'name' => cf_sanitize_field($_POST['cf-name']),
         'email' => cf_sanitize_field($_POST['cf-email']),
         'tel' => cf_sanitize_field($_POST['cf-tel']),
         'message' => cf_sanitize_field($_POST['cf-message']),
       );
            deliver_mail($args);
        } else {
            return $errors;
        }
    }
}
2
user53340

未初期化文字列オフセット:0

空の値があるため、このエラーが表示されています。最初に値が!empty()(空でない)かどうか確認してみてください。これはあなたが私のアップデートであなたの質問で提供するソースコードです。

function cf_form_message() {
    global $errors;
    if ( is_wp_error( $errors ) && empty( $errors -> errors ) ) {
        ?>
        <section class="alertbox-success">
            <div class="cf-success">
                <p>Thank you for contacting us <?php if ( isset( $_POST['cf-name'] ) && !empty( $_POST['cf-name'] ) ) { echo $_POST['cf-name']; } else { echo 'NO_NAME'; } ?>, a member of our team will be in touch with you shortly.</p>
            </div>
        </section>
        <?php
        //Empty $_POST because we already sent email
        $_POST = '';
    }
    else {
        if ( is_wp_error( $errors ) && !empty( $errors -> errors ) ) {
            $error_messages = $errors -> get_error_messages();
            foreach ( $error_messages as $k => $message ) {
                ?>
                <section class="alertbox-error">
                    <div class="cf-error <?php echo $k; ?>">
                        <p><?php echo $message ?></p>
                    </div>
                </section>
                <?php
            }
        }
    }
}