web-dev-qa-db-ja.com

Apiを設定してオプションページにデータの配列を保存する方法

私は自分自身の最初のプラグインを作成しようとしていますが、私は初心者をコーディングしていますので正しい方向に案内してください。

このプラグインは、ユーザーの役割に基づいて投稿有効期限を設定するためのものです。今、私はデータの保存段階に行き詰まっています。

入力用に新しいデータベーステーブルを作成したくないので。設定APIを使用して作業を行い、データをwp_optionsテーブルに保存します。

私のプラグイン設定ページで、ユーザーがルールを追加/編集/削除できるようにしたいです。各ルールは、複数の入力を使用してユーザーによって定義されます。

ルールを追加するには、ロール、post_type、expired_action、およびday_limitsを選択します。これらの入力を配列に格納したいのですが、どうすればよいでしょうか。

例えば ​​:

array(1) {
role           => "" // get from the form input
post_type      => "" // get from the form input
expired_action => "" // get from the form input
day_limti      => "" // get from the form input 
        }

array(2) {
    role           => "" 
post_type      => "" 
expired_action => ""  
day_limti      => "" 
    }

array(3) {
role           => "" 
post_type      => "" 
expired_action => "" 
day_limti      => ""    
    }
......etc

ユーザーがルールを送信するたびに配列に保存できるように、入力フォームのHTMLフォームを使用する方法を教えてください。

これは、ルールを追加するためのプラグインオプションページのHTMLフォームです。

<form action="options.php" id="apext_form" method="post" name="author_limit">
              <?php settings_fields('apext_Options'); ?>

    <table class="form-table">
        <tbody>
        <tr valign="top">
        <td>
        <label for="apext_user_role"><?php _e('User Role', 'apext') ?></label>
        <select name="role" id="apext_role_id">
         <option></option>
           <?php global $wp_roles; if ( !isset( $wp_roles ) ) $wp_roles = new WP_Roles();
            foreach ( $wp_roles->role_names as $role => $name ) { ?>
            <option value="<?php echo $name; ?>"><?php echo $name; ?></option>
                    <?php }
           ?>
        </select><br>
        </td>

        <td>
        <label for="apext_post_type"><?php _e('Post Type', 'apext') ?></label>  
        <select name="apext_pt" id="apext_pt_id">
          <?php $post_types=get_post_types('','names'); 
               foreach ($post_types as $post_type ) {
            ?>
            <option value="<?php echo $post_type;?>"><?php echo $post_type;?></option>
            <?php }
            ?>
        </select><br/>

        </td>

        <td><label for="Expired Action"><?php _e('Expired Action'); ?></label>
         <select name="remove_to" id="re_to"><option value =''></option>
                                             <option value="pending">pending</option>
                             <option value="draft">draft</option>
                             <option value="trash">trash</option>
                             <option value="delete">delete</option>
        </td>

          <td>
         <label for="apext_post_limit"><?php _e('Days Limit', 'apext') ?></label>   
                 <input type="text" id="apext_lim" name="apext_lim" id="lim" size="4" value="<?php echo get_option('apext_lim');?>"/><br>
         </td>

                 <td><input class="button-primary" type="submit" name="Submit" value="<?php _e("Submit Rule", 'apext') ?>" /></td>
        </tr>   
        </tbody>
  </table>
 </form>

Register_settingsからの参照名がないため、フォームが機能していないことを私は知っています。私が何をしようとしているのかを理解するのに役立ちます。

繰り返しますが、私の質問です。これらの入力値を配列に保存する方法を教えてください。

2
dev-jim

これは私がフォーム入力のコレクションを処理するのが好きな方法です。詳細な説明はコメントにあります。

if( isset( $_POST ) ) {

    // Create an empty array. This is the one we'll eventually store.
    $arr_store_me = array();

    // Create a "whitelist" of posted values (field names) you'd like in your array.
    // The $_POST array may contain all kinds of junk you don't want to store in
    // your option, so this helps sort that out.
    // Note that these should be the names of the fields in your form.
    $arr_inputs = array('input_1', 'input_2', 'input_3', 'etc');

    // Loop through the $_POST array, and look for items that match our whitelist
    foreach( $_POST as $key => $value ) {

        // If this $_POST key is in our whitelist, add it to the arr_store_me array
        if( in_array( $key, $arr_inputs) )
            $arr_store_me[$key] = $value;

    }

    // Now we have a final array we can store (or use however you want)!
    // Update option accepts arrays--no need
    // to do any other formatting here. The values will be automatically serialized.
    update_option('option_name', $arr_store_me)

}

これは単なる一般的なアプローチです。フィールドのデフォルト値の配列を作成し、 wp_parse_args() を使用してそれをあなたの "arr_store_me"配列と比較することでこれを改善できます。これを extract($ arr_store_me) と組み合わせると、設定されていない変数に対する警告を避けながらフォームフィールドを事前入力するのに最適な方法になります。

1
MathSmath