web-dev-qa-db-ja.com

を使う POST メタボックス内のメソッド、結果なし

私は自分のコードで何が問題になっているのか理解するのに苦労しています。プロジェクトの編集ページでプロジェクトに人を追加するカスタム投稿タイプ(プロジェクト)のメタボックスを作成しました。このボックスにはプロジェクトに追加されたユーザーも表示されますが、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がうまくいかないのか、混乱していませんか。これはメタボックスができないことですか?私はメタボックスでこれを行うことができる別の方法はありますか?任意の助けや洞察力は大歓迎です!

1
Alex Howell

まず、ブラウザからメタボックスのHTMLを調べましたか。

上記のフォーム要素が見つからないことがあります。これは、フォーム要素を入れ子にすることはできないからです。

<form>
      <form>
      </form>
</form>

すべてのメタボックスはすでにフォーム要素の内部にあるため、内部に別のフォーム要素を指定することはできません。

1つの解決策は、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

} 

長い答えで申し訳ありません...あなたがあなたのニーズに合った解決策を見つけることを願っています。

0
Douglas.Sesar