कॉलबैक को add_settings_field () में नहीं कहा जाता है जब किसी सरणी के भाग के रूप में पारित किया जाता है, लेकिन पहचानता है कि यह वहां है। यह OOP का उपयोग करके कक्षा से कक्षा में उत्तीर्ण है

Nov 26 2020

मैं एक प्लगइन का निर्माण कर रहा हूं, मैंने एक नया व्यवस्थापक पृष्ठ और उप-पृष्ठ बनाया है, और उस उप-पृष्ठ के अंदर, मैं कुछ सेटिंग्स जोड़ना चाहता हूं। इसलिए मैं उन्हें सेटिंग्स एपीआई का उपयोग करके बना रहा हूं।
मैं संगीतकार और ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग का उपयोग कर रहा हूं। मैं एक फ़ोल्डर SettingsAPI कहा जाता है, निम्न नाम स्थान के साथ किया है namespace Blocks\Pages\SettingsAPI;
उस फ़ोल्डर के अंदर, मैं तीन फ़ाइलें: AddSettings.php, Settings.phpऔर SettingsLayout.php। वे तीनों सही ढंग से जुड़े हुए हैं। फ़ाइलों में क्लासेस के केस संवेदी नाम होते हैं। Settings.phpएक कक्षा का नाम है Settings, और इसी तरह।

सामग्री

  • मेरी संरचना के लिए कुछ संदर्भ
  • जो मैंने पहले ही आजमाया हुआ है
  • क्या करें?

मेरी संरचना के लिए कुछ संदर्भ

Settings.phpमेरे अंदर एक फ़ंक्शन है जो विभिन्न प्रकार के सरणियों को रखता है, उन सरणियों के अंदर वे मान हैं जो मैं सेटिंग्स एपीआई के लिए उपयोग करना चाहता हूं। इसका मतलब है कि मेरे पास ऐसे सरणियाँ हैं जिनका उपयोग किया जाता है 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()

सेटिंग्स

$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 से सभी सेटिंग्स एपीआई कार्यों को पकड़ो, यहाँ है register_setting()

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

यह हिस्सा बेहतरीन काम करता है। यह भी साथ काम करता है add_settings_section()। क्या काम नहीं करता है, इनपुट हैं। जिसे मैं अब प्रस्तुत करूंगा:

सेटिंग्स

इस कक्षा के अंदर फ़ंक्शन / विधि है 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 ]
    ]
];

तो यह एक सरणी है जिसके अंदर तीन सरणियाँ हैं। इस सरणी में कॉलबैक हैं, और यह कॉलबैक हैं जो बिल्कुल भी काम नहीं करते हैं। इससे कोई फर्क नहीं पड़ता कि मैंने उन्हें कहां रखा या मैंने उन्हें कैसे लिखा, वे गूंज नहीं रहे हैं। नीचे मैं उन सभी चीजों को सूचीबद्ध करूँगा जो मैंने कोशिश की हैं।
सेटिंग्स सरणियों के साथ की तरह, वे भी इस तरह संसाधित हैं:

$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

क्या करें?

मैं कोशिश करने के लिए विकल्पों से बाहर चला गया। विकल्पों में से कम से कम मुझे पता है। अगर किसी के पास किसी भी तरह का समाधान है, तो मैं उन्हें सुनने के लिए HAPPY होगा। मैंने भी अपने आप को जितना हो सके उतना अच्छा समझाया।

संपादित करें

जिसका मैं उल्लेख करना भूल गया, मेरे अंदर foreach()मैं यह field["id"]देखने के लिए भी गूँज उठा कि क्या यह काम करता है, और यह सही आईडी को प्रतिध्वनित करता है।

जवाब

1 SallyCJ Nov 26 2020 at 10:39

मैं जो देख सकता था, वह समस्या फ़ील्ड कॉलबैक के साथ नहीं है, लेकिन यह वह अनुभाग आईडी है जिससे आप इसे सेट कर रहे हैं 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()।।