콜백은 배열의 일부로 전달 될 때 add_settings_field ()에서 호출되지 않지만 거기에 있음을 인식합니다. OOP를 사용하여 Class를 Class로 전달합니다.
플러그인을 만들고 있으며 새 관리 페이지와 하위 페이지를 만들었으며 해당 하위 페이지 내에 몇 가지 설정을 추가하고 싶습니다. 이것이 제가 설정 API를 사용하여 구축하는 이유입니다.
Composer 및 Object-Oriented Programming을 사용하고 있습니다. 다음 네임 스페이스가있는 SettingsAPI라는 폴더가 있습니다. namespace Blocks\Pages\SettingsAPI;
해당 폴더 안에 AddSettings.php
, Settings.php
및 SettingsLayout.php
. 세 가지 모두 올바르게 연결되어 있습니다. 파일에는 클래스의 대소 문자 구분 이름이 있습니다. Settings.php
라는 클래스 Settings
가 있습니다.

함유량
- 내 구조에 대한 일부 컨텍스트
- 내가 이미 시도한 것
- 무엇을해야합니까?
내 구조에 대한 일부 컨텍스트
내부 Settings.php
에는 다양한 배열을 보유하는 함수가 있으며 해당 배열 내부에는 Settings API에 사용하려는 값이 있습니다. 이것은 register_setting()
, add_settings_section()
및에 사용되는 배열이 있음을 의미 add_settings_field()
합니다.
내부 AddSettings.php
에는 방금 언급 한 세 가지 기능이 있습니다. 모두 register_settings()
와 add_settings_field()
작업 좋아요. 에 문제가 add_settings_field()
있습니다.
내부 SettingsLayout.php
에는 양식을 인쇄해야하는 위치에 대한 매우 간단한 레이아웃이 있으며 이는 하위 페이지에도 표시됩니다. 입력 만 누락되었습니다.
내부에서 필요한 경우 배열을 반복 AddSettings.php
하는 데 사용했습니다 foreach()
. register_setting()
및 둘 다에 사용되는 것은 두 add_settings_field()
배열 모두 내부에 배열이 있기 때문입니다. 에 사용되는 코드 register_setting()
와 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
]
];
위의 배열은 다른 배열과 함께 AddSettings
클래스와이를 처리 할 다음 함수로 전달됩니다.
$this->add_settings->setForm( $configs, $segments, $inputs )->register();
setForm()
인수로 다음을 수행합니다.
AddSettings.php
public function setForm( array $configs, array $segments, array $inputs ) {
$this->settings = $configs;
$this->sections = $segments;
$this->fields = $inputs;
return $this;
}
$settings
, $sections
및 변수 $fields
는 클래스 시작 부분에 공용 및 빈 배열로 생성되었습니다.
public $settings = array(); public $sections = array();
public $fields = array();
그런 다음 다음 기능으로 등록됩니다.
public function functionToAdd() {
return $this->registerForm( $this->settings, $this->sections, $this->fields );
}
registerForm()
WP의 모든 설정 API 기능을 보유하고 있습니다 register_setting()
.
foreach( $this->settings as $setting ) { register_setting( $setting["option_group"], $setting["option_name"], isset( $setting["args"] ) ? $setting["args"] : "" );
}
이 부분은 훌륭하게 작동합니다. 또한 add_settings_section()
. 무엇을 하지 않습니다 작동 입력합니다. 지금도 설명하겠습니다.
Settings.php
이 클래스 내부에는 function / method setForm( $n = NULL )
가 있으며, 여기에 위에서 보여준 것과 같은 모든 배열이 있습니다. 지금 $n
은 의미가 없지만 숫자가 될 것이므로 배열과 설정을 모두 반복하여 더 많은 양식을 만들 수 있습니다. 유지하든으로 NULL
변경 하든 1
최종 결과에 영향을 미치지 않습니다.
다음은 필드 배열입니다.
$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 ]
]
];
그래서 이것은 그 안에 3 개의 배열이있는 배열입니다. 이 배열에는 콜백이 있으며 전혀 작동하지 않는 콜백입니다. 내가 그것들을 어디에 두든, 어떻게 작성하든, 그것들은 에코되지 않습니다. 맨 아래에 내가 시도한 모든 것을 나열합니다.
설정 배열과 마찬가지로 모두 다음과 같이 처리됩니다.
$this->add_settings->setForm( $configs, $segments, $inputs )->register();
AddSettings.php
그리고
public function setForm( array $configs, array $segments, array $inputs ) { $this->settings = $configs; $this->sections = $segments; $this->fields = $inputs; return $this;
}
과
public function functionToAdd() {
return $this->registerForm( $this->settings, $this->sections, $this->fields );
}
그런 registerForm()
다음 다음 함수로 전달됩니다 .
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() );
}
그리고 아무것도. 내 서브 페이지에 입력이 없습니다. 필드를 제외한 모든 것이 에코되고 있습니다.

보시다시피 섹션에서 사용하는 콜백이 작동하고 제목과 설명을 보여줍니다. 그러나 입력이 누락되었습니다. 섹션에 대한 콜백을 호출 한 방법에 대한 컨텍스트를 보여주기 위해 다음은 섹션 배열의 콜백이있는 한 줄입니다
Settings.php
.
"callback" => function() use($n) { echo "<p>Bearbeite hier die Info Nummer " . $n . "</p>"; }
그리고 함수 add_settings_section()
내부 AddSettings.php
, 더 foreach()
이 일을 위해 사용되지 않았다 :
add_settings_section( $sections["id"], $sections["title"], isset( $sections["callback"] ) ? $sections["callback"] : "", $sections["page"] );
밭과 같은 방식으로 불려지고 있습니다. 그러나 필드는 여전히 아무것도 에코하지 않습니다. 누군가가 다른 함수를 반환하는 대신 익명 콜백 함수 내부에서 에코라고 말하기 전에 :
내가 이미 시도한 것
나는 몇 가지를 시도했다. 내가 시도한 첫 번째 작업 중 하나는 콜백이 작성되는 방식을 편집하는 것이 었습니다. 그래서 다른 함수를 반환하는 함수 대신 간단한 것을 작성했습니다.
"callback" => function() { echo "Echo this please."; },
작동하지 않았습니다.
"callback" => array( $this, "iconInput" ),
또한 작동하지 않습니다.
"callback" => $this->iconInput( $n ),
그런 다음 함수를 호출하고 입력을 에코 했지만 올바른 위치는 아닙니다. 그들은 페이지 맨 위에있었습니다. 그리고 모든 것을 반복하면 모든 입력이 맨 위에 있고 아래 섹션이 올바른 인쇄 순서로 표시됩니다. 그래서 그것도 해결책이 아닙니다.
내가 시도한 것은 콜백을 이동하여 AddSettings.php
그렇게 부르는 것입니다.
add_settings_field( $field["id"], $field["title"], function() { return $this->iconInput(); }, $field["page"], $field["section"] = 'default', $field["args"] = array() );
작동하지 않았습니다. 내가 거기에 함수를 직접 작성하려고했을 때
add_settings_field( $field["id"], $field["title"], function() { echo "Please echo this"; }, $field["page"], $field["section"] = 'default', $field["args"] = array() );
작동하지 않았습니다. 나는 또한 die;
그것이 전혀 호출되고 있는지 확인하기 위해 항상 끝에 두었 습니다. 기능이 존재하지 않는 것과 같습니다.
또한 기능을 추가 ()
하여 즉시 실행하려고 시도 했습니다.
add_settings_field( $field["id"], $field["title"], isset( $field["callback"] ) ? $field["callback"]() : "", $field["page"], $field["section"] = 'default', $field["args"] = array() );
이전과 같은 결과입니다. 입력을 반향하지만 올바른 위치에 있지 않습니다.
나는 답을 찾아 보았지만 나와 비슷한 답을 찾지 못했다. 이 질문과 해결책을 찾아서 시도했지만 작동하지 않았습니다. add_settings_field ()에서 콜백 함수로 인수를 전달하는 방법은 무엇입니까? 및 Add_settings_field () 매개 변수화 콜백?
그리고 설명을 SettingsLayout.php
위해 다음과 같이 빌드합니다.
<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>
$i
와 동일합니다 $n
.
무엇을해야합니까?
시도 할 옵션이 부족합니다. 내가 아는 최소한의 옵션. 누군가가 어떤 종류의 해결책을 가지고 있다면 나는 그 말을 듣고 기쁠 것입니다. 나는 또한 최선을 다해 설명했다.
편집하다
내가 언급하는 것을 잊은 것은 내 foreach()
안에서도 field["id"]
그것이 작동하는지 확인하기 위해 반향 을 일으켰고 올바른 ID를 반향합니다.
답변
내가 볼 수 있듯이 문제는 필드 콜백에있는 것이 아니라 설정 하는 섹션 ID입니다 . 아래를 default
참조하십시오 $field["section"] = 'default'
.
// 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() );
따라서이를 수정 (오타?)하면 필드가 예상대로 표시되거나 필드 콜백이 제대로 실행됩니다. 또한 $field["args"] = array()
..