Le rappel n'est pas appelé dans add_settings_field () lorsqu'il est passé dans le cadre d'un tableau, mais reconnaît qu'il est là. Il est passé de classe à classe en utilisant la POO

Nov 26 2020

Je suis en train de créer un plugin, j'ai créé une nouvelle page d'administration et une sous-page, et à l'intérieur de cette sous-page, je souhaite ajouter des paramètres. C'est pourquoi je les construis à l'aide de l'API Settings.
J'utilise Composer et la programmation orientée objet. J'ai un dossier appelé SettingsAPI, avec l'espace de noms suivant namespace Blocks\Pages\SettingsAPI;
Dans ce dossier, j'ai trois fichiers: AddSettings.php, Settings.phpet SettingsLayout.php. Tous les trois sont correctement connectés. Les fichiers portent les noms sensibles à la casse des classes. Settings.phpa une classe nommée Settings, et ainsi de suite.

Contenu

  • Un peu de contexte à ma structure
  • Ce que j'ai déjà essayé
  • Ce qu'il faut faire?

Un peu de contexte à ma structure

À l'intérieur, Settings.phpj'ai une fonction qui contient une variété de tableaux, à l'intérieur de ces tableaux se trouvent les valeurs que je souhaite utiliser pour l'API Settings. Cela signifie que j'ai des tableaux qui sont utilisés pour register_setting(), add_settings_section()et add_settings_field().
À l'intérieur, AddSettings.phpj'ai les trois fonctions que je viens de mentionner. Les deux register_settings()et add_settings_field()fonctionnent très bien. J'ai des problèmes avec add_settings_field().
À l'intérieur, SettingsLayout.phpj'ai une mise en page très simple pour savoir où le formulaire doit être imprimé, qui est également affichée sur la sous-page. Il ne manque que les entrées.

À l'intérieur, AddSettings.phpj'ai utilisé une foreach()boucle sur le tableau, si nécessaire. Ce qui est utilisé pour les deux register_setting()et add_settings_field(), c'est parce que ces deux tableaux ont des tableaux à l'intérieur d'eux. Je vais montrer du code utilisé pour register_setting()et le foreach().

Settings.php

$configs = [ [ // Icon "option_group" => "iw_" . $n,
        "option_name"     =>    "iw_icon_" . $n, "args" => $iconConfigs
      ],
      [ // Titel
        "option_group"    =>    "iw_" . $n, "option_name" => "iw_title_" . $n,
        "args"            =>    $titleConfigs ], [ // Beschreibung "option_group" => "iw_" . $n,
        "option_name"     =>    "iw_description_" . $n, "args" => $descriptionConfigs
      ],
      [ // Farbauswahl
        "option_group"    =>    "iw_" . $n, "option_name" => "iw_colour_" . $n,
        "args"            =>    $colourConfigs
      ]
    ];

Le tableau ci-dessus est passé, avec les autres tableaux, à la AddSettingsclasse et à la fonction suivante qui les traitera.

$this->add_settings->setForm( $configs, $segments, $inputs )->register();

setForm() fait ce qui suit avec les arguments.

AddSettings.php

public  function  setForm(  array  $configs,  array  $segments, array $inputs )  {
    $this->settings = $configs;
    $this->sections = $segments;
    $this->fields = $inputs;
    return  $this;
}

Les variables $settings, $sectionset $fieldsont été créées au début de la classe sous forme de tableaux publics et vides.

public $settings = array(); public $sections = array();
public $fields = array();

Qui est alors enregistré avec la fonction suivante:

public  function  functionToAdd()  {
return  $this->registerForm(  $this->settings, $this->sections,  $this->fields );
}

registerForm()détenez toutes les fonctions de l'API Paramètres de WP, voici register_setting().

foreach( $this->settings as $setting ) { register_setting( $setting["option_group"], $setting["option_name"], isset( $setting["args"] ) ? $setting["args"] : "" );
    }

Cette partie fonctionne très bien. Cela fonctionne également avec add_settings_section(). Ce qui ne fonctionne pas , ce sont les entrées. Ce que je vais également présenter maintenant:

Settings.php

À l'intérieur de cette classe se trouve la fonction / méthode setForm( $n = NULL ), c'est là que se trouvent tous les tableaux, comme celui que j'ai montré ci-dessus. Pour le moment, cela $nn'a aucune signification, mais ça va être un nombre, donc je peux faire une boucle sur ces tableaux et paramètres pour créer plus de formulaires. Que je le garde NULLou que je le change en 1, cela n'a aucun effet sur le résultat final, c'est la même chose.
Voici le tableau des champs.

$inputs =  [
    [
        "id"  =>  "iw_icon_"  .  $n, "title" => "Icon Auswahl", "callback" => function() use($n)  {  return  $this->iconInput( $n );  },
        "page"  =>  "info_kreis_bearbeiten",
        "section"  =>  "iw_item_"  .  $n, "args" => [ "label_for" => "iw_icon_" . $n ]
    ],
    [
        "id"  =>  "iw_title_"  .  $n, "title" => "Titel", "callback" => function() use($n)  {  return  $this->titleInput( $n );  },
        "page"  =>  "info_kreis_bearbeiten",
        "section"  =>  "iw_item_"  .  $n, "args" => [ "label_for" => "iw_title_" . $n ]
    ],
    [
        "id"  =>  "iw_description_"  .  $n, "title" => "Kurz Beschreibung", "callback" => function() use($n)  {  return  $this->descriptionInput( $n );  },
        "page"  =>  "info_kreis_bearbeiten",
        "section"  =>  "iw_item_"  .  $n, "args" => [ "label_for" => "iw_description_" . $n
    ],
    [
        "id"  =>  "iw_colour_"  .  $n, "title" => "Farbe auswählen", "callback" => function() use($n)  {  return  $this->colourInput( $n );  },
        "page"  =>  "info_kreis_bearbeiten",
        "section"  =>  "iw_item_"  .  $n, "args" => [ "label_for" => "iw_colour_" . $n ]
    ]
];

Il s'agit donc d'un tableau avec trois tableaux à l'intérieur. Ce tableau a des rappels, et ce sont les rappels qui ne fonctionnent pas du tout. Peu importe où je les mets ou comment je les écris, ils ne sont pas repris. En bas, je vais énumérer toutes les choses que j'ai essayées.
Comme avec les tableaux de paramètres, ils sont tous traités comme ceci:

$this->add_settings->setForm( $configs, $segments, $inputs )->register();

AddSettings.php

Puis

public  function  setForm(  array  $configs, array $segments,  array  $inputs ) { $this->settings =  $configs; $this->sections =  $segments; $this->fields =  $inputs; return $this;
}

et

public  function  functionToAdd()  {
return  $this->registerForm( $this->settings,  $this->sections, $this->fields );
}

Qui est ensuite passé registerForm()avec la fonction suivante:

foreach(  $this->fields as $field)  {
    add_settings_field( $field["id"], $field["title"], isset( $field["callback"] ) ? $field["callback"] : "", $field["page"], $field["section"] = 'default', $field["args"] = array() );
}

Et puis rien. Aucune entrée sur ma sous-page. Tout sauf les champs fait écho.


Comme vous pouvez le voir, le rappel utilisé par la section fonctionne et me montre le titre et la description. Mais les entrées manquent. Pour montrer un contexte sur la façon dont j'ai appelé le rappel pour les sections, voici la seule ligne avec le rappel du tableau de sections, à l'intérieur Settings.php:

"callback"  =>  function()  use($n)  {  echo  "<p>Bearbeite hier die Info Nummer "  .  $n .  "</p>";  }

Et la fonction à l' add_settings_section()intérieur AddSettings.php, no a foreach()été utilisée pour celui-ci:

add_settings_section(  $sections["id"],  $sections["title"], isset( $sections["callback"]  )  ?  $sections["callback"] : "", $sections["page"]  );

On l'appelle de la même manière que les champs. Mais les champs ne font toujours écho à rien. Tout avant que quiconque dise que je fais écho à l'intérieur de la fonction de rappel anonyme au lieu de renvoyer une autre fonction:

Ce que j'ai déjà essayé

J'ai essayé plusieurs choses. L'une des premières choses que j'ai essayées a été de modifier la façon dont le rappel est écrit. Donc, au lieu d'une fonction qui renvoie une autre fonction, j'ai écrit quelque chose de simple.

"callback"  =>  function()  {  echo "Echo this please."; },

Ça n'a pas marché.

"callback"  =>  array( $this, "iconInput" ),

Ne fonctionne pas non plus, j'ai aussi essayé

"callback"  =>  $this->iconInput( $n ),

Qui a ensuite appelé la fonction et fait écho aux entrées, mais pas dans la bonne position. Ils étaient tout en haut de la page. Et si je boucle tout, toutes les entrées seront en haut, avec les sections ci-dessous dans la bonne commande d'impression. Ce n'est donc pas non plus la solution.
Ce que j'ai également essayé, c'était de déplacer le rappel AddSettings.phpet de l'appeler comme ça.

add_settings_field(  $field["id"],  $field["title"], function() { return $this->iconInput();  },  $field["page"], $field["section"]  =  'default',  $field["args"]  = array()  );

Cela n'a pas fonctionné non plus. Quand j'ai essayé d'écrire directement la fonction là-dedans, comme ça

add_settings_field(  $field["id"],  $field["title"], function() { echo "Please echo this"; }, $field["page"],  $field["section"] = 'default', $field["args"]  = array()  );

Cela n'a pas fonctionné non plus. Je mets aussi toujours die;à la fin, juste pour voir si ça s'appelle du tout, et ça ne l'a pas été. C'est comme si la fonction n'existait pas.
J'ai également essayé d'exécuter immédiatement la fonction en y ajoutant ():

add_settings_field( $field["id"], $field["title"], isset( $field["callback"] ) ? $field["callback"]() : "", $field["page"], $field["section"] = 'default', $field["args"] = array() );

Même résultat que précédemment. Il faisait écho aux entrées, mais pas dans la bonne position.

J'ai essayé de chercher une réponse, mais je n'ai pas vraiment trouvé une réponse similaire à la mienne. J'ai trouvé ces questions et cette solution, je les ai essayées, et cela n'a pas non plus fonctionné: Comment passer des arguments de add_settings_field () à la fonction de rappel? et Add_settings_field () paramétrant le rappel?

Et pour clarifier, mon SettingsLayout.phpest construit comme ceci:

<form  method="post"  action="options.php"  id="iw_form_<?php  echo  $i?>">
    <?php
        settings_fields(  "iw_"  .  $i ); do_settings_sections( "info_kreis_bearbeiten" ); submit_button( $text  =  NULL,  $type = "primary", $name  =  "submit_"  .  $i  );
    ?>
</form>

$iest le même que $n.

Ce qu'il faut faire?

Je n'ai plus d'options à essayer. Au moins des options que je connais. Si quelqu'un a une solution, je serais HEUREUX de l'entendre. Je me suis aussi expliqué du mieux que j'ai pu.

Éditer

Ce que j'ai oublié de mentionner, à l'intérieur de mon, foreach()j'ai également fait écho field["id"]pour voir si cela fonctionne, et cela fait écho au bon ID.

Réponses

1 SallyCJ Nov 26 2020 at 10:39

D'après ce que j'ai pu voir, le problème n'est pas avec le rappel de champ, mais c'est l' ID de section sur lequel vous le définissez default- voir $field["section"] = 'default'ci - dessous:

// In the foreach in AddSettings.php
add_settings_field( $field["id"], $field["title"], isset( $field["callback"] ) ? $field["callback"] : "", $field["page"], $field["section"] = 'default', $field["args"] = array() );

Donc, vous ne feriez que corriger cela (faute de frappe?) Et les champs s'afficheraient comme prévu, ou que le rappel de champ fonctionnerait correctement. Et vous devez également corriger le $field["args"] = array()..