wordpress站点中的自定义表单和操作属性

时间:2018-04-02 22:53:28

标签: wordpress forms

我已经陷入了wordpress中自定义表单和自定义表单处理程序(我不知道)的深渊。 我只需要一个工作的联系表单,而无需安装任何插件。 我通常会使用$ _SESSION superglobal(传递错误和成功消息)和post-redirect-get模式(避免使用页面重新加载的双重发送)来执行此操作。代码看起来像这样

<form class="di-contact" method="post" action="<?php echo get_template_directory_uri() ?>/contact.php" style="width: 50%; margin: 0 auto">
<h3 id="titulo-single"><?php the_title() ?></h3>
<label for="di-name"><?php _e('Name', 'di-news-blog'); ?>:</label>
<input class="uk-input" type="text" id="di-name"  name="di-name"><br>
<label for="di-email"><?php _e('E-mail', 'di-news-blog'); ?>:</label>
<input class="uk-input" type="email" id="di-email"  name="di-email"><br>
<label for="di-message"><?php _e('Message', 'di-news-blog'); ?>:</label>
<textarea class="uk-textarea" id="di-message"  name="di-message"></textarea><br>
<input type="submit" name="di-submit" value="<?php _e('Submit', 'di-news-blog'); ?>">
</form>

然后我会在contact.php中编写类似的东西:

<?php
////////////////////   MAIL PROPERTIES      ///////////////////

$to = get_option('admin_email');
$from = htmlentities($_POST['di-email']);   
$subject = __('Message from ','di-news-blog'). get_bloginfo('blogname');

////////////////////////   HEADERS   ////////////////////////

$headers = "From:" . $from . "\r\n";
$headers .= "Reply-To:" . $from . "\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";

////////////////////////   MESSAGE  ////////////////////////

$message = '<p>You got a message from <strong>'  . 
htmlentities($_POST['di-name']) . '</strong><p/>';
$message .= '<p><strong>Email:</strong> ' . $from . '</p>';
$message .= '<strong>Message:</strong><br/>' . 
htmlentities($_POST['di-message']);

//////////////////////////////////////////////////////////////
if ( isset( $_POST['di-submit'] ) ) {
if (  ! empty( $_POST['di-email'] ) || ! empty( $_POST['di-email'] ) ||  ! empty( $_POST['di-message'] ) ) {
    mail($to, $subject, $message, $headers); 
    $_SESSION['success'] = '<p class="success">' . __('Message sent succesfully', 'di-news-blog') . '</p>';

    wp_redirect(get_template_directory_uri() . '/contact'); exit;
} else {
    $_SESSION['error'] = '<p class="failed">' . __('Please enter all the requested data and try again', 'di-news-blog') . '</p>';

   wp_redirect(get_template_directory_uri() . '/contact'); exit;
  }
}

但是没有我,我发现像get_option()__('','')这样的wordpress函数在contact.php这样的页面中不起作用,而且$ _SESSION超全局,我被告知我可以制作它适用于functions.php文件中的类似内容:

// SESSIONS //////
function register_my_session(){
    if( ! session_id() ) {
        session_start();
    }
}

add_action('init', 'register_my_session', 1);

function cyb_session_start() {
    if( ! session_id() ) {
        session_start();
    }
}

function cyb_session_end() {
    session_destroy();
}

add_action( 'init', 'cyb_session_start', 1 );
add_action( 'wp_logout', 'cyb_session_end' );
add_action( 'wp_login', 'cyb_session_end' );

哪个不起作用。
对不起我的无知,但我找不到文件(据我所知,不是nijna php dev)如何实现。

1 个答案:

答案 0 :(得分:1)

我会将表单POST发送回/contact(联系表单页面)并处理从那里发送的表单。

为了保持模板清洁,我通常会在functions.php中创建一个函数,然后您可以从模板中调用该函数,并在主题中创建一个名为page-contact.php的特定联系页面模板(这将自动用于具有slug contact)的页面。这将是唯一需要调用联系表单处理函数的模板。

您实际上可以在自己的自定义(非模板)文件中包含Wordpress,以便您可以使用wordpress功能,但我认为这不是您要做的事情所必需的。

一个非常小的例子:

页-contact.php

<?php get_header(); ?>

<?php if(have_posts()) : ?>
<?php while(have_posts()) : the_post(); ?>

<h1><?php the_title(); ?></h1>
<?php the_content(); ?>
<?php contact_form_handler(); ?>

<?php endwhile; ?>

<?php else : ?>
<?php include_once 'templates/no-posts-found.php'; ?>
<?php endif; ?>

<?php get_footer(); ?>

<强>的functions.php

function contact_form_handler() {

  /* If this is a postback, handle the contact form */
  if(isset($_POST['message'])) {

    //Try to send the message and set $successful to true or false

    echo ($successful ? "Message sent!" : "An error occurred");

  } 

  /* Otherwise display the form itself */
  else {
    include_once 'templates/contact-form.php';
  }
}

<强>模板/接触form.php的

<form method="POST" action="/contact">
  <textarea name="message"></textarea>
  <input type="submit" value="Submit" />
</form>