콜백은 배열의 일부로 전달 될 때 add_settings_field ()에서 호출되지 않지만 거기에 있음을 인식합니다. OOP를 사용하여 Class를 Class로 전달합니다.

Nov 26 2020

플러그인을 만들고 있으며 새 관리 페이지와 하위 페이지를 만들었으며 해당 하위 페이지 내에 몇 가지 설정을 추가하고 싶습니다. 이것이 제가 설정 API를 사용하여 구축하는 이유입니다.
Composer 및 Object-Oriented Programming을 사용하고 있습니다. 다음 네임 스페이스가있는 SettingsAPI라는 폴더가 있습니다. namespace Blocks\Pages\SettingsAPI;
해당 폴더 안에 AddSettings.php, Settings.phpSettingsLayout.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를 반향합니다.

답변

1 SallyCJ Nov 26 2020 at 10:39

내가 볼 수 있듯이 문제는 필드 콜백에있는 것이 아니라 설정 하는 섹션 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()..