Callback wird in add_settings_field () nicht aufgerufen, wenn es als Teil eines Arrays übergeben wird, erkennt jedoch, dass es vorhanden ist. Es wird von Klasse zu Klasse mit OOP übergeben

Nov 26 2020

Ich erstelle ein Plugin, habe eine neue Administrationsseite und Unterseite erstellt und möchte innerhalb dieser Unterseite einige Einstellungen hinzufügen. Deshalb erstelle ich sie mit der Einstellungs-API.
Ich benutze Composer und objektorientierte Programmierung. Ich habe einen Ordner SettingsAPI, mit dem folgende Namespace namens namespace Blocks\Pages\SettingsAPI;
In diesem Ordner, ich habe drei Dateien: AddSettings.php, Settings.phpund SettingsLayout.php. Alle drei sind richtig angeschlossen. Die Dateien haben die Groß- und Kleinschreibung der Klassen. Settings.phphat eine Klasse mit dem Namen Settingsund so weiter.

Inhalt

  • Ein Kontext zu meiner Struktur
  • Was ich schon versucht habe
  • Was ist zu tun?

Ein Kontext zu meiner Struktur

Im Inneren habe Settings.phpich eine Funktion, die eine Vielzahl von Arrays enthält. In diesen Arrays befinden sich die Werte, die ich für die Einstellungs-API verwenden möchte. Dies bedeutet , dass ich Arrays , die für verwendet werden register_setting(), add_settings_section()und add_settings_field().
Im Inneren habe AddSettings.phpich die drei gerade erwähnten Funktionen. Beides register_settings()und add_settings_field()arbeiten super. Ich habe Probleme mit add_settings_field().
Im Inneren habe SettingsLayout.phpich ein sehr einfaches Layout, wo das Formular gedruckt werden soll, das auch auf der Unterseite angezeigt wird. Nur die Eingaben fehlen.

Im Inneren habe AddSettings.phpich eine foreach()Schleife über das Array verwendet, wenn ich muss. Was für beide verwendet wird register_setting()und das liegt daran add_settings_field(), dass beide Arrays Arrays enthalten. Ich werde einen Code zeigen, der für register_setting()und verwendet wird 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
      ]
    ];

Das obige Array wird zusammen mit den anderen Arrays an die AddSettingsKlasse und die nächste Funktion übergeben, die sie verarbeitet.

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

setForm() macht folgendes mit den Argumenten.

AddSettings.php

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

Die Variablen $settings, $sectionsund $fieldswurden zu Beginn der Klasse als öffentliche und leere Arrays erstellt.

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

Was dann mit folgender Funktion registriert wird:

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

registerForm()Halten Sie alle Einstellungen API-Funktionen von WP, hier ist register_setting().

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

Dieser Teil funktioniert super. Es funktioniert auch mit add_settings_section(). Was nicht funktioniert, sind die Eingaben. Was ich jetzt auch vorstellen werde:

Settings.php

In dieser Klasse befindet sich die Funktion / Methode setForm( $n = NULL ). Dort befinden sich alle Arrays, wie das oben gezeigte. Im Moment $nhat das keine Bedeutung, aber es wird eine Zahl sein, sodass ich diese Arrays und Einstellungen durchlaufen kann, um weitere Formulare zu erstellen. Ob ich es behalte NULLoder ändere 1, hat keinen Einfluss auf das Endergebnis, dasselbe.
Hier ist das Array für die Felder.

$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 ]
    ]
];

Dies ist also ein Array mit drei Arrays. Dieses Array hat Rückrufe, und es sind die Rückrufe, die überhaupt nicht funktionieren. Egal wo ich sie ablege oder wie ich sie schreibe, sie werden nicht wiederholt. Unten werde ich alle Dinge auflisten, die ich versucht habe.
Wie bei den Einstellungsarrays werden sie auch so verarbeitet:

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

AddSettings.php

Und dann

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

und

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

Was dann registerForm()mit folgender Funktion übergeben wird:

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() );
}

Und dann nichts. Keine Eingaben auf meiner Unterseite. Alles außer den Feldern wird wiedergegeben.


Wie Sie sehen können, funktioniert der von diesem Abschnitt verwendete Rückruf und zeigt mir den Titel und die Beschreibung. Aber die Eingaben fehlen. Um einen Kontext zu zeigen, wie ich den Rückruf für die Abschnitte aufgerufen habe, ist hier die eine Zeile mit dem Rückruf aus dem Abschnittsarray im Inneren Settings.php:

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

Und die Funktion im add_settings_section()Inneren AddSettings.php, nein, foreach()wurde für diese verwendet:

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

Es wird genauso genannt wie die Felder. Aber die Felder geben immer noch nichts wieder. Bevor jemand sagt, dass ich innerhalb der anonymen Rückruffunktion wiederhole, anstatt eine andere Funktion zurückzugeben:

Was ich schon versucht habe

Ich habe ein paar Dinge ausprobiert. Eines der ersten Dinge, die ich versuchte, war die Bearbeitung der Art und Weise, wie der Rückruf geschrieben wird. Anstelle einer Funktion, die eine andere Funktion zurückgibt, habe ich etwas Einfaches geschrieben.

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

Hat nicht funktioniert.

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

Auch nicht funktioniert habe ich auch versucht

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

Was dann die Funktion aufrief und die Eingänge wiedergab, aber nicht in der richtigen Position. Sie waren ganz oben auf der Seite. Und wenn ich alles schleife, werden alle Eingaben oben angezeigt, wobei die folgenden Abschnitte in der richtigen Druckreihenfolge angezeigt werden. Das ist also auch nicht die Lösung.
Ich habe auch versucht, den Rückruf zu verschieben AddSettings.phpund so zu nennen.

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

Hat auch nicht funktioniert. Als ich versuchte, die Funktion einfach so direkt hinein zu schreiben

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

Hat auch nicht funktioniert. Ich habe auch immer die;am Ende gesetzt, nur um zu sehen, ob es überhaupt aufgerufen wird, und es war nicht so. Es ist, als ob die Funktion nicht existiert.
Ich habe auch versucht, die Funktion sofort auszuführen, indem ich ()sie hinzufügte :

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

Gleiches Ergebnis wie früher. Es gab die Eingaben wieder, aber nicht in der richtigen Position.

Ich habe versucht, nach einer Antwort zu suchen, konnte aber keine finden, die meiner ähnlich war. Ich habe diese Fragen und Lösungen gefunden, ausprobiert, und das hat auch nicht funktioniert: Wie übergebe ich Argumente von add_settings_field () an die Rückruffunktion? und Add_settings_field () Rückruf parametrieren?

Und zur Verdeutlichung ist meine SettingsLayout.phpso aufgebaut:

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

$iist das gleiche wie $n.

Was ist zu tun?

Ich habe keine Optionen mehr, um es zu versuchen. Zumindest von Optionen, die ich kenne. Wenn jemand irgendeine Lösung hat, wäre ich GLÜCKLICH, sie zu hören. Ich erklärte mich auch so gut ich konnte.

Bearbeiten

Was ich vergessen habe zu erwähnen, in meinem habe foreach()ich auch wiederholt, um field["id"]zu sehen, ob das funktioniert, und es gibt die richtige ID wieder.

Antworten

1 SallyCJ Nov 26 2020 at 10:39

Soweit ich sehen konnte, liegt das Problem nicht beim Feldrückruf, sondern bei der Abschnitts-ID, auf die Sie sie einstellen default- siehe $field["section"] = 'default'unten:

// 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() );

Sie müssen dies also nur korrigieren (Tippfehler?) Und die Felder werden wie erwartet angezeigt oder der Feldrückruf wird ordnungsgemäß ausgeführt. Und Sie sollten auch die korrigieren $field["args"] = array()..