web-dev-qa-db-ja.com

プラグインのオプションページで複数の送信ボタンをどうやって扱うのですか?

私はWordPress用の最初のプラグインを開発していて、フックシステム全体を把握しています。私は今、(おそらく)小さな問題に立ち往生しているのですが、回避できる可能性がありますが、本当の解決策以上の「ハック」が発生することを恐れています。

私がやろうとしているのは、オプションページに2つの送信ボタンを配置することです。

  • 保存する
  • ドラフト

どちらも一般的なこと(フォームの内容を保存すること)をする必要がありますが、その場合はそのような内容に対して異なるアクションを実行する必要があります。これまでのところ、次のコードを使用して2つのボタンを出力できました。

echo '<form id="my_plugin_settings_form" method="post" action="options.php">';
settings_fields('my_plugin_settings');
do_settings_sections('my_plugin_settings');
submit_button(__('Save', 'MyPlugin'), 'Save');
submit_button(__('Draft', 'MyPlugin'), 'secondary','Draft');
echo '</form>';

また、投稿されたフィールドを正しく受け取るvalidateメソッドも実装しました。

public function validate_settings($settings) {
  var_dump($settings); // Here I can see all posted fields
}

上記はWordPressのOptionsテーブルにすべてのデータが正しく保存されている状態でうまく機能します。しかし、私はそれを操作するために保存されているデータを「インターセプト」したいと思います。 validate_settings()メソッド内でデータを操作することを考えていましたが、クリックされたボタンは引数として渡される設定に含まれるnotです。

取得するには$_POST配列を単純に解析することができますが、このアプローチがちょっとしたハックであること、そしておそらく他の場所で適切なフックを実装する必要があることに疑問があります。

したがって、私の質問は、「オプション」ページから投稿されたデータを処理するためのコードをどこに配置すればよいのかということです。使用すべき特定のフックはありますか?

答えてくれてありがとう。

3
Diego

設定APIはがらくたです。私は長い時間を必要とし、私がこれが機能するようになるまで多くを試す必要があります。私の問題は私の入力からの値がvalidateコールバックに決して渡されないことでした。

配列メソッドを使用することになります。

<input type="text" name="foo[bar]" value="baz" />

式が送信される場合、$_POSTまたは$_GET配列には、すべての値を含む配列を含むfooというフィールドがあります。だから私は例えばで値にアクセスすることができます$_POST['foo']['bar']

設定APIを使用しなければならない場合は、2番目のパラメーターfomr register_setting()(オプション名)を入力フィールドのキーとして使用します。

global $option_name;
$option_group = 'The_Option_Group';
$option_name = 'The_Option_Name';
register_setting( $option_group, $option_name );
[...]

function field_callback() {
  global $option_name;
  echo "<input type='text' name='{$option_name}[bar]' value='baz' />";
  echo "<input type='submit' name='{$option_name}[submit]' value='Send' />"
}

このようにして、オプションのvalidateコールバックで式内のすべての値にアクセスできます。

function option_validate( $input ) {
  $bar = $input['bar'];
  $sub = $input['submit'];

  return $input;
}

PressCodersの記事 Settings API Explained で詳しく説明されています。

2
Ralf912