通过admin-ajax.php提交表单返回0

时间:2017-08-04 作者:WordyDudeGuyMan

正在尝试:

使用管理ajax提交表单。php将post数据从“草稿”状态更新为“发布”状态,并为过滤器类型添加自定义元字段。

表单内容:

<form action="<?php echo admin_url( \'admin-ajax.php\' ) ?>" method="post">

        <?php wp_nonce_field( \'submit_filter\', \'my_filter_nonce\' ); ?>

        <div class="small-6 medium-3 large-3 columns">
            <div class="card">
                <img src="<?php echo get_the_post_thumbnail_url( $posts[0]->ID, \'thumbnail\' ); ?>" class="" id="normal">
                    <div class="card-section">
                        <input type="submit" value="No Filter" name="normal">
                    </div>
            </div>
        </div>
</form>
表单操作:

// process form actions
add_action( \'wp_ajax_nopriv_submit_filter\', \'my_submission_filter\' );
add_action( \'wp_ajax_submit_filter\', \'my_submission_filter\' );


function my_submission_filter() {

    $postid = get_the_ID();
    $post_data = array(
          \'ID\'              => $postid,
          \'post_status\'     => \'publish\'

     );


// add filter meta data
add_post_meta($postid, \'filter\', $_POST[\'filter\']); 

// Update the post into the database
wp_update_post( $my_post );

// redirect back to site to see post
wp_redirect( site_url());

die();

}
结果:

空白页,右上角为“0”,没有要发布的更新。

希望:

帮助完成此操作:)

3 个回复
SO网友:Milo

您没有在表单中设置操作,因此不会执行任何操作。

添加隐藏字段action 至表格:

<input type="hidden" value="submit_filter" name="action">
还请注意:

$postid = get_the_ID();
行不通。这是一个新请求,因此没有帖子可以从中获取ID。您还必须将其与表单数据一起传递。

SO网友:Tom J Nowell

admin-ajax.php 用于AJAX请求,但这不是AJAX请求,而是表单提交!如果这是一个基于javascript的提交,可能会比较合适,但是,您应该避免管理AJAX的怪癖,并创建一个标准的表单处理程序。

提交表单时,请将其提交到表单所在的页面。通过这种方式,表单处理和显示彼此相邻,验证更容易显示。

例如:

if ( ! empty( $_POST[\'submission\'] )) {
    // the form was submitted!

    $success = false;
    // fetch the parameters, do some validation, etc

    // ... handle the form submission

    // all done, if successful say so else load the form
    if ( true === $success ) {
        get_template_part( \'theform\', \'success\' ); // theform-success.php
    } else {
        // show the form again with whatever validation errors there were
        get_template_part( \'theform\' ); 
    }
} else {
    // the form was not submitted, DISPLAY THE FORM!!! First page
    get_template_part( \'theform\' );
}
theform.php 将包含您的表单,对于表单的操作,您只需将其保留为空,例如。<form method="POST" action="">

处理多个页面

您可以添加一个名为page, 然后根据其值加载不同的模板,并在最后一页+1时进行处理。但需要记住的是,当您提交第2页时,第1页中的值将不存在,因此您需要将它们带到隐藏字段中。

SO网友:Boris Kuzmanov

您没有使用AJAX提交数据,因此不需要使用admin-ajax.php 以及wp_ajax 钩相反,您需要admin_post

您需要对代码进行一些更改才能使其正常工作。首先,将窗体操作更改为<?php echo esc_url( admin_url(\'admin-post.php\') ); ?> 并在表单末尾添加隐藏的操作字段<input type="hidden" name="action" value="submit_filter">.

这样,无论何时向WordPress发送请求,并且操作参数设置为“submit\\u filter”,钩子admin_post_submit_filter 将执行。

以下是表单代码的外观:

<form action="<?php echo esc_url( admin_url(\'admin-post.php\') ); ?>" method="post">
   <?php wp_nonce_field( \'submit_filter\', \'my_filter_nonce\' ); ?>
   <div class="small-6 medium-3 large-3 columns">
      <div class="card">
          <img src="<?php echo get_the_post_thumbnail_url( $posts[0]->ID, \'thumbnail\' ); ?>" class="" id="normal">
          <div class="card-section">
              <input type="submit" value="No Filter" name="normal">
          </div>
      </div>
    </div>
    <input type="hidden" name="action" value="submit_filter">
</form>
以及处理您的请求的功能代码:

add_action( \'admin_post_nopriv_submit_filter\', \'my_submission_filter\' );
add_action( \'admin_post_submit_filter\', \'my_submission_filter\' );

function my_submission_filter() {
  $postid = get_the_ID();

  $post_data = array(
    \'ID\'              => $postid,
    \'post_status\'     => \'publish\'
  );

  add_post_meta($postid, \'filter\', $_POST[\'filter\']); 
  wp_update_post( $my_post );

  wp_redirect( site_url());
}
使用is_wp_error

https://codex.wordpress.org/Plugin_API/Action_Reference/admin_post_(action)https://codex.wordpress.org/Function_Reference/is_wp_error

结束

相关推荐

如何在WordPress中实现AJAX POST导航?

我正在开发一个wordpress页面模板,就像this.我已经完成了设计,并加载了模板,一旦用户使用我的模板进入这个页面。我想在此模板中打开更多文章列表中的所有帖子,而不刷新页面。但当我点击列表中的任何帖子时,它会打开一个新页面,这与我的页面模板不同。请指导我如何在模板中打开的“更多文章”列表中打开帖子。这是我到目前为止的密码。<?php if ( have_posts() ): while ( have_posts() ) : the_post(); ?&