【问题标题】:Wordpress custom shortcode form can't post to same pageWordpress 自定义简码表单无法发布到同一页面
【发布时间】:2017-07-23 12:51:44
【问题描述】:

我在将表单数据发布到同一页面以在 Wordpress 中进行处理时遇到问题。 我创建了一个名为 [lwCSForm] 的简码,它可以工作并在其添加到的页面上吐出表单。问题是当我按下提交时,页面不会注意到 $_POST['submit'] 变量并且我的代码无法处理数据。

我已测试以下列形式使用这些操作:

  • action="php echo $_SERVER['PHP_SELF']"(我无法让php标签在这里工作)

  • action="php echo $post->post_title"(我无法让php标签在这里工作)

  • 甚至直接写页面名:action="about"

这是在页面上通过简码显示表单的功能:

function DisplayCustomSettingsForm_shortcode() {
global $post;

if( !is_user_logged_in() ){
    echo '<div class="lwCSForm-notloggedin">
            <p> Please login to view the content! </p>
          </div>';
    return;
}

if( isset( $_POST['submit'] ) )
{
    echo "The submit button is pressed and has data";
    /* Code to update customers settings, like avatar, email, username */

} else {
$phpself = $post->post_title; // get the current page

  ?><br />
        <!-- LwCSForm Plugin-->
        <section id="lwCSForm-wrapper">
            <form name="lwCSForm" id="lwCSForm" method="post" action="<?php $phpself ?>" autocomplete="on">
                Name: <input type="text" name="realname" placeholder="Your Name" >
                Sitename: <input type="text" name="username" placeholder="Username" >
                E-mail: <input type="text" name="email" placeholder="E-mail" >
                Avatar: <input type="text" name="avatar" placeholder="Avatar" >
                <input type="submit" >
            </form>
        </section>
        <!-- END LwCSForm Plugin-->
    <br /> <?php
 }
}
add_shortcode( 'lwCSForm', 'DisplayCustomSettingsForm_shortcode');

带有简码的添加表单的图片

为什么 wordpress 不处理这些信息?并再次声明。我无法在此处打印 php 标签,但它们在源代码中。

【问题讨论】:

  • 您的简码实现不正确。根据the documentation“请注意,短代码调用的函数应该永远产生任何类型的输出。短代码函数应该返回用于替换短代码的文本。”
  • 你找到解决办法了吗。我也卡在这里了。看起来手动创建的页面不像我们写的 .php 页面那样执行?

标签: php html wordpress forms


【解决方案1】:

我发现你可以编写如下函数,这样会更容易进行表单验证和数据处理。请注意action="" 正在使用 Wordpress 中的“the_permalink()”函数。这使我们能够在同一个函数中编写发布数据的所有验证和处理,而不是将其单独挂钩到 Wordpress 的“INIT”函数。

if( isset( $_POST[ 'lwCSFormSubmit' ] ) )
{

}

以下新功能:

function DisplayCustomSettingsForm_shortcode() {
    global $post;

    if( !is_user_logged_in() ){
        echo '<div class="lwCSForm-notloggedin">
                <p> Please login to view the content! </p>
              </div>';
        return;
    }

    if( isset( $_POST['lwCSFormSubmit'] ) )
    {
        echo "The submit button is pressed and has data";
        var_dump($_POST);
    } 
    ?>
         <!-- LwCSForm Plugin-->
         <br />
                <section id="lwCSForm-wrapper">
                    <form name="lwCSForm" id="lwCSForm" method="post" action="<?php the_permalink(); ?>" autocomplete="on">
                        Name: <input type="text" name="realname" placeholder="Your Name" >

                        Sitename: <input type="text" name="username" placeholder="Username" >

                        Email: <input type="text" name="email" placeholder="E-mail" >

                        Avatar: <input type="text" name="avatar" placeholder="Avatar" >

                        <input type="submit" name="lwCSFormSubmit">
                    </form>
                </section>
         <br /> 
         <!-- END LwCSForm Plugin-->
<?php
}
add_shortcode( 'lwCSForm', 'DisplayCustomSettingsForm_shortcode');

Nick Duncans 都回答了,这很有效,这取决于使用什么情况。

【讨论】:

  • 您的简码实现不正确。根据the documentation“请注意,短代码调用的函数应该产生任何类型的输出。短代码函数应该返回用于替换短代码的文本。”
【解决方案2】:

把你的代码改成

function DisplayCustomSettingsForm_shortcode() {
    global $post;

    if( !is_user_logged_in() ){
        echo '<div class="lwCSForm-notloggedin">
                <p> Please login to view the content! </p>
              </div>';
        return;
    }


    ?><br />
        <!-- LwCSForm Plugin-->
        <section id="lwCSForm-wrapper">
            <form name="lwCSForm" id="lwCSForm" method="post" action="" autocomplete="on">
                Name: <input type="text" name="realname" placeholder="Your Name" >
                Sitename: <input type="text" name="username" placeholder="Username" >
                E-mail: <input type="text" name="email" placeholder="E-mail" >
                Avatar: <input type="text" name="avatar" placeholder="Avatar" >
                <input name='WCSPostSubmitButton' type="submit" >
            </form>
        </section>
        <!-- END LwCSForm Plugin-->
    <br /> <?php

}
add_shortcode( 'lwCSForm', 'DisplayCustomSettingsForm_shortcode');

add_action( 'init', 'WCSGetPostData' );
function WCSGetPostData() {
    if ( isset( $_POST['WCSPostSubmitButton'] ) ) {
        // dump out the POST data
        var_dump($_POST);

    }
}

我已将 POST 处理移至 init 挂钩,并为您的表单命名,以便我们可以通过 $_POST 数组识别它。

【讨论】:

  • 为什么我没有想到,在页面的初始化中加载它?!我一回家就测试这个!谢谢
  • 这完美解决了问题,标记为正确。就一个问题。如果我们在 'init' 钩子中获取数据,我该如何在短代码函数中进行回调并打印出“数据已保存”?
  • 您的简码实现不正确。根据the documentation“请注意,短代码调用的函数应该产生任何类型的输出。短代码函数应该返回用于替换短代码的文本。”
猜你喜欢
  • 2016-09-25
  • 2014-10-12
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
相关资源
最近更新 更多