wordpress form submission and the 404 error page

2019-02-10 12:24发布

问题:

I have the following form on a wordpress template page. I'm getting a 404 error each time i submit the form but I'm not using any of the reserved workpress parameter names in the form.

<?php
/**
 * Template Name: Registration Template
 */
if(isset($_POST['form-submitted'])) 
{
    if(trim($_POST['runner']) === '') {
        $runnerError = 'Please enter runner runner.';
        $hasError = true;
    } else {
        $runner = trim($_POST['runner']);
    }

    if(trim($_POST['racenumber']) === '')  {
        $numberError = 'Please enter a race number.';
        $hasError = true;
    } else {
        $racenumber = trim($_POST['racenumber']);
    }

    $race = trim($_POST['race']);
    error_log($race.' '.$runner.' '.$racenumber);
    $registrationSubmitted = true;
}
get_header();
echo "<pre>GET "; print_r($_GET); echo "</pre>";
echo "<pre>POST "; print_r($_POST); echo "</pre>";
?>

<div id="container">

    <?php 
    if(isset($registrationSubmitted) && $registrationSubmitted == true) 
    {
        echo '<div class="thanks"><p>The runner has been registered.</p></div>';
    }
    else
    {
        $races = // magic array
        $selectRaces = '<select name="race" id="race">';
        foreach($races as $racez)
        {
            $selectRaces .= sprintf('<option value=%d>%s</option>',$race->id,$race->name);
        }
        $selectRaces .= '</select>';

        echo apply_filters('the_content','
            <form action="'.get_permalink().'" id="form" method="POST">
                [one_half last="no"]
                <b>Race Details</b><br/>
                RaceNumber<input type="text" name="racenumber" id="racenumber"/><br/>
                Race'.$selectRaces.'<br/>
                [/one_half]
                [one_half last="yes"]
                <b>Runner Details</b><br/>
                ID<input type="text" name="runner" id="runner"/><br/>
                Firstname<input type="text" name="first" id="first"/><br/>
                Surname<input type="text" name="last" id="last"/><br/>
                Gender<input type="text" name="gender" id="gender"/><br/>
                DOB<input type="text" name="dob" id="dob"/><br/>
                Standard<input type="text" name="standard" id="standard"/><br/>
                Company<input type="text" name="company" id="company"/><br/>
                [/one_half]
                <input type="submit" value="Register Runner"/>
                <input type="hidden" name="form-submitted" id="bhaa-submitted" value="true" />
            </form>');
    }
    echo '</div>';
?>
<?php get_footer(); ?>

I've customised my 404 page to dump the $_POST values so i'm sure the parameter values are being submitted.

[racenumber] => 5
[race] => 2596
[runner] => 5
[first] => 
[last] => 
[gender] => 
[dob] => 
[standard] => 
[company] => 
[form-submitted] => true

Can anyone explain my the logic in my 'isset($_POST['form-submitted'])' is not being exercised?

The generated html

<form action="http://localhost/registration/" id="form" method="POST">
<div class="one_half">
                <b>Race Details</b><br><br>
                RaceNumber<input name="number" id="number" type="text"><br><br>
                Race<br>
<select name="race" id="race">
<option value="2596" id="2596">4-Mile-M</option>
<option value="2595" id="2595">2-Mile-W</option>
</select>

EDIT

I've changed the code where is set the values of the select dropdown to use an incrementing int value rather than using sprintf to map a string value to an int value. When the first element is selected the form submits, if the second option is picked i get a 404!

$races = // magic array
$selectRaces = '<select name="race" id="race">';
$i=0;
foreach($races as $racez)
{
    $selectRaces .= sprintf('<option value=%d>%s</option>',$i++,$race->name);
}

回答1:

Problem is that wordpress have some words reserved and it will throw that error when submitting forms:

Some of the words that i found myseld and surfing the web are:

  • Custom post type names
  • taxonomy names
  • "name"
  • "day"
  • "month"
  • "year"
  • "category"
  • "title"

So be careful when creating a a custom form and try to name your inputs with some prefix. In my case i had a custom post type called "history" and i was naming the input the same way.



回答2:

Have you tried resetting your permalinks? Could be an issue there somewhere. It doesn't seem or look like the issue is isset($_POST['form-submitted'])'

It's possible your page name is being used another plugin.



回答3:

WordPress's get_permalink() is generating a URL that is being injected into your output HTML's form tag.

If you look at the HTML source, as it appears in your browser (eg right-click, view-source or right-click, inspect element), find this:

<form action='some_url_here' ...>.

I would expect that this URL should probably be the same as the one that you're currently browsing... ie it tells the browser to send the details back to that same PHP file to process its results.



回答4:

Type unique Name and ID try this form

<form action="'.get_permalink().'" id="form" method="POST">
                [one_half last="no"]
                <b>Race Details</b><br/>
                RaceNumber<input type="text" name="racenumber" id="racenumber"/><br/>
                Race'.$selectRaces.'<br/>
                [/one_half]
                [one_half last="yes"]
                <b>Runner Details</b><br/>
                ID<input type="text" name="runner_id" id="runner_id"/><br/>
                Firstname<input type="text" name="runner_first" id="runner_first"/><br/>
                Surname<input type="text" name="runner_last" id="runner_last"/><br/>
                Gender<input type="text" name="runner_gender" id="runner_gender"/><br/>
                DOB<input type="text" name="runner_dob" id="runner_dob"/><br/>
                Standard<input type="text" name="runner_standard" id="runner_standard"/><br/>
                Company<input type="text" name="runner_company" id="runner_company"/><br/>
                [/one_half]
                <input type="submit" value="Register Runner"/>
                <input type="hidden" name="form-submitted" id="bhaa-submitted" value="true" />
            </form> 


回答5:

You can't use this variables in POST FORM

_ajax_nonce _page _per_page _signup_form _total _url _wp_http_referer _wp_original_http_referer _wp_unfiltered_html_comment _wpnonce _wpnonce-custom-header-upload

aa action action2 active_post_lock add_new add_new_users addmeta admin_bar_front admin_color admin_email admin_password admin_password2 ajax align allblogs allusers alt approve_parent approved attachment attachment_id attachments auth_cookie author author_name autocomplete_type auto_draft auto-add-pages autosave

background-attachment background-color background-position-x background-repeat banned_email_domains blog blog_name blog_public blog_upload_space blogname bulk_edit

c calendar cat category_base category_name catslist changeit changes charset checkbox checked clear-recent-list closed comment comment_approved comment_author comment_author_email comment_author_url comment_content comment_date comment_ID comment_parent comment_post_ID comment_shortcuts comment_status comments_listing comments_popup confirmdelete connection_type content context cpage create-new-attachment createuser customize_messenger_channel customized customlink-tab

date date_format date_format_custom day default-header delete delete_all delete_all2 delete_comments delete_option delete_tags delete_widget deletebookmarks deletecomment deleted deletemeta deletepost description detached dismiss display_name do

edit_date email error exact excerpt

features feed fetch fheight file fileupload_maxk filter find_detached first_comment first_comment_author first_comment_url first_name first_page first_post found_post_id fwidth

global_terms_enabled GLOBALS gmt_offset guid

height hh hidden hidden_aa hidden_jj hidden_mm hidden_mn hidden_hh history hostname hour html-upload

id ID ids id_base illegal_names insert-gallery insertonlybutton interim-login item-object item-type

jj json json_data

key

last_name limited_email_domains link_id link_image link_name link_rss link_url link_visible linkcheck locale locked log logged_in_cookie

m media media_type menu menu_items menu-item menu-item-attr-title menu-item-classes menu-item-db-id menu-item-description menu-item-object menu-item-object-id menu-item-parent-id menu-item-position menu-item-target menu-item-title menu-item-type menu-item-url menu-item-xfn menu-locations menu-name message meta metakeyinput metakeyselect metavalue minute mm mn mode monthnum more move multi_number

name nav-menu-locations new new_role new_slug new_title newcat newcomment_author newcomment_author_email newcomment_author_url newcontent newuser nickname no_placeholder noapi noconfirmation noredir number

offset oitar option option_page order orderby

p pb page page_columns page_id page_options paged pagegen_timestamp pagename parent_id pass1 pass2 password permalink_structure photo_description photo_src phperror ping_status plugin plugin_status pointer position post post_category post_data post_format post_ID post_id post_mime_type post_password post_status post_title post_type post_view postid posts preview primary_blog private_key ps public_key publish pwd

query

reassign_user reauth redirect redirect_to ref referredby registration registrationnotification rememberme remove-background removeheader removewidget reset-background resetheader review rich_editing robots role

s same save savewidget savewidgets screen scrollto search second section selectall selection send send_password sentence short show_sticky sidebar sidebars signup_for signup_form_id site_id site_name sitename size skip-cropping spam spammed src ss stage start static status sticky subdomain_install submit subpost subpost_id super_admin

tab tag tag_ID tag-name tag_base tags_input tax tax_input tag-name target taxonomy tb term text-color the-widget-id theme theme_status thumb timezone_string time_format time_format_custom title thumbnail_id trash trashed type

undismiss unspam unspammed untrash untrashed url update_home_url updated upgrade upload_filetypes upload_space_check_disabled use_ssl user user_id user_login user_name username users

verify-delete version visibility visible

w weblog_title welcome_email welcome_user_email widget_id widget_number widget-id widget-recent-comments widget-rss width withcomments withoutcomments wp_customize wp_http_referer wp_screen_options wp-preview WPLANG

x1

y1 year



回答6:

I had the same issue but I found when I submitted empty input fields (without any value in input field) that's working fine then I leave few input fields remain empty and place value in others which was also working fine.

That's means the issue was one of my input field not in wordpress or in my code.



标签: wordpress