web-dev-qa-db-fra.com

Comment gérer plusieurs boutons de soumission dans la page d'options du plugin?

Je développe mon premier plugin pour WordPress et je comprends tout le système de hook. Je suis maintenant bloqué sur un (probablement) petit problème que je pourrais éventuellement contourner, mais j'ai peur de sortir avec un "bidouillage", plus qu'une solution réelle.

Ce que j'essaie de faire, c'est de placer deux boutons de soumission sur ma page Options:

  • Sauvegarder
  • Brouillon

Tous les deux devraient faire quelque chose de commun (c’est-à-dire sauvegarder le contenu du formulaire), mais ils devraient ensuite agir différemment avec ce contenu. Jusqu'ici, j'ai réussi à sortir les deux boutons en utilisant le code suivant:

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>';

J'ai également implémenté une méthode de validation, qui reçoit correctement les champs postés:

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

Ce qui précède fonctionne bien, avec toutes les données enregistrées correctement dans le tableau Options WordPress. Cependant, je voudrais "intercepter" les données en cours de sauvegarde pour les manipuler. Je pensais manipuler les données dans la méthode validate_settings(), mais le bouton sur lequel vous avez cliqué est pas inclus dans les paramètres passés en argument.

Je pourrais simplement analyser le tableau $_POST pour l'obtenir, mais je doute que l'approche soit un peu bidon et que, peut-être, je devrais mettre en place un crochet approprié, ailleurs.

Ma question est donc la suivante: où devrais-je mettre mon code pour traiter les données publiées à partir d'une page Options? Y a-t-il un crochet spécifique que je devrais utiliser?

Merci d'avance pour les réponses.

3
Diego

L'API de paramètres est de la merde. J'ai besoin de beaucoup de temps et j'ai besoin d'essayer beaucoup jusqu'à ce que je travaille. Mon problème était que les valeurs de mes entrées n'étaient jamais transmises au rappel de validation.

Je finis par utiliser la méthode array:

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

Si le formulaire doit être envoyé, le tableau $_POST ou $_GET contient un champ appelé foo qui contient un tableau avec toutes les valeurs. Donc, je peux accéder à la valeur avec par exemple $_POST['foo']['bar']

Si je devais travailler avec l'API de paramètres, j'utilisais le deuxième paramètre fomr register_setting() (le nom de l'option) comme clé pour mes champs de saisie.

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' />"
}

De cette manière, je peux accéder à toutes les valeurs du formulaire dans l'option valider le rappel.

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

  return $input;
}

C'est mieux expliqué dans l'article Paramètres API expliqué sur PressCoders

2
Ralf912