在meta box中使用POST方法,没有结果

时间:2014-05-30 作者:Alex Howell

我很难找出我的代码出了什么问题。我为自定义帖子类型(项目)创建了一个元框,通过编辑项目页面将人员添加到项目中。该框还显示已添加到项目中的用户,但POST方法似乎不起作用,因此不会出现任何将数据插入数据库的代码。我试图从表单中回显一个值,但没有结果,因此我知道post方法不起作用。我还检查了语法错误。

以下是提交表单后POST方法的代码-

<?php
// Process add form if sent
          if(isset($_POST[\'mro_add_user\'])) {
              $_POST = stripslashes_deep($_POST);
              $add_username = $_POST[\'mro_add_user\'];
              if (username_exists($add_username) != NULL) {
                // Check not already registered
                $add_userid = username_exists($add_username);
                $extra_userdata = get_userdata($add_userid);
                $add_firstname = $extra_userdata->first_name;
                $add_lastname =  $extra_userdata->last_name;
                $a_registered = $wpdb->get_var("SELECT user_id FROM ".$wpdb->prefix."mro_attendees WHERE event_id = ".$project_id." AND user_id = ".$add_userid);
                // If not already registered
                if ($a_registered == "") {
                    $user_comment = $_POST[\'mro_add_comment\'];
                    $wpdb->insert($wpdb->prefix.\'mro_attendees\', array( \'event_id\' => $project_id, \'user_id\' => $add_userid, \'first_name\' => $add_firstname, \'last_name\' => $add_lastname, \'user_comment\' => $user_comment ) );
                    ?>
                    <div class="updated"><p><strong><?php _e(\'User \' . $add_username . \' added.\' ); ?></strong></p></div>
                    <?php
                } else {
                    ?>
                    <div class="updated"><p><strong><?php _e(\'User \' . $add_username . \' already on list.\' ); ?></strong></p></div>
                    <?php
                }
            } elseif(username_exists($add_username) == NULL) {
                ?>
                <div class="updated"><p><strong><?php _e(\'User \' . $add_username . \' not found.\' ); ?></strong></p></div>
                <?php
            }

          }
          ?>
这是一个表单,它的动作都在同一个代码文档中。

<form id="add_user" name="add_user" method="post" action="post.php?post=<?php echo $project_id; ?>&action=edit">
            <p>
              <label for="mro_add_user"></label>
              Username<br />
  <input name="mro_add_user" type="text" id="mro_add_user" size="40" maxlength="150" />
            </p>
            <p>Comment<br />
              <label for="mro_add_comment"></label>
              <input name="mro_add_comment" type="text" id="mro_add_comment" size="40" maxlength="40" />
</p>
            <p>
              <input type="submit" name="mro_add_user_submit" id="mro_add_user_submit" value="Add User" />
            </p>
  </form>
在这段代码中,我有一个GET方法来处理其他一些确实有效的东西。

<a href="post.php?post=<?php echo $project_id; ?>&action=edit&remove_attendee=<?php echo $user->id; ?>&place=<?php echo $num; ?>">Remove User</a>
我只是不明白为什么GET方法有效,而POST方法无效?这是meta box做不到的吗?是否有其他方法可以在元框中执行此操作?任何帮助或见解都将不胜感激!

1 个回复
最合适的回答,由SO网友:Douglas.Sesar 整理而成

首先,您是否检查了浏览器中的元框html?

您可能会发现上面的表单元素丢失了。这是因为不能有嵌套的表单元素:

<form>
      <form>
      </form>
</form>
所有元框都已位于表单元素内,因此不能在其中指定其他表单元素。

一种解决方案是使用Javascript AJAX函数提交添加的用户名:

Javascript部分:

            jQuery.ajax({
                url: \'http://yoursite.com/wp-admin/admin-ajax.php\',
                dataType: \'json\',
                //type:\'POST\',
                data: {
                   \'action\':\'your_ajax\',
                   \'fn\': \'add_users_to_project\',
                   \'data\': data
                   },
                success: function(results){
                    //console.log(results);
                    //display your added usernames
                },// end of success
                error: function(errorThrown){console.log(errorThrown);}
            });// end of ajax
PHP部分:

class your_ajax{

//add actions and filters in constructor
function __construct(){

    //admin or front end?
    //add_action(\'wp_ajax_nopriv_your_ajax\', array( $this, \'ajax_function\' ) );
    add_action(\'wp_ajax_your_ajax\', array( $this, \'ajax_function\' ) );

}

//handle ajax calls from 
function ajax_function(){
   // the first part is a SWTICHBOARD that fires specific functions
   // according to the value of Query Var \'fn\'

    //feel free to use this file for any wordpress ajax that needs to be done
    switch($_REQUEST[\'fn\']){

        case \'add_users_to_project\':
            //$output = $_REQUEST[\'data\'];
            $output = $this->add_users_to_project( $_REQUEST[\'data\'] );
        break;

        case \'delete_users_from_project\':
            //$output = $_REQUEST[\'data\'];
            $output = $this->delete_users_from_project( $_REQUEST[\'data\'] );
        break;

        default:
            $output = \'No function specified, check your jQuery.ajax() call\';
        break;
    }

   // Now, convert $output to JSON and echo it to the browser
   // That way, we can recapture it with jQuery and run our success function
        ob_clean();
        $output=json_encode($output);
        if(  is_array( $output )  ):

            print_r( $output );
        else:

            echo $output;
        endif;
        die();

}


function add_users_to_project( $data ){
    //do whatever
    return $response;
}

function delete_users_from_project( $data ){
    //delete whatever
    return $response;
}


}//end your_ajax class

$your_ajax = new your_ajax();
另一种选择是向save_post 保存项目帖子时将触发的操作挂钩。然后简单地显示元框中的所有用户。

add_action( \'save_post\', \'your_save_function\' );
function your_save_function(){

//do stuff with global $post and $_POST

} 
很抱歉回答得太长。。。希望您能找到适合您需求的解决方案。

结束

相关推荐

对自定义字段隐藏自定义Metabox值

在我提问之前,我试图向自定义字段添加_0,但它不起作用,至少在我的代码中是这样。我只想隐藏我的元框的值,使其不会出现在自定义字段中。当我向代码中添加时,元盒停止工作。代码如下://Creating a MetaBox for Posts to enter audio Code. add_action(\'add_meta_boxes\',\'audio_meta_box\'); function audio_meta_box(){ add_meta_box(\'audio_