অ্যাড_সেটিং_সেকশন () কলব্যাকে ভেরিয়েবল কীভাবে পাস করবেন?


16

আমি যথাসম্ভব স্বয়ংক্রিয় করার চেষ্টা করছি, সেটিংস এপিআই ফাংশন প্রতিটি প্লাগইনে প্রতিটি সেটিংয়ের জন্য কল করে। বিকল্প অ্যারের মাধ্যমে লুপিং, এবং আউটপুটিং add_settings_section()এবং add_settings_field()যথেষ্ট সহজ:

add_settings_section():

$oenology_hooks_tabs = oenology_hooks_get_settings_page_tabs();
foreach ( $oenology_hooks_tabs as $tab ) {
    $tabname = $tab['name'];
    $tabtitle = $tab['title'];
    $tabsections = $tab['sections'];
    foreach ( $tabsections as $section ) {
        $sectionname = $section['name'];
        $sectiontitle = $section['title'];
        $sectiondescription = $section['description'];
        // Add settings section
        add_settings_section(
            'oenology_hooks_' . $sectionname . '_section',
            $sectiontitle,
            'oenology_hooks_' . $sectionname . '_text',
            'oenology_hooks_' . $tabname . '_tab'
        );
    }
}

এবং `add_settings_field ():

global $oenology_hooks;
$oenology_hooks = oenology_hooks_get_hooks();

foreach ( $oenology_hooks as $hook ) {
    $hookname = $hook['name'];
    $hooktitle = $hook['title'];
    $hooktab = $hook['tab'];
    $hooksection = $hook['section'];
    add_settings_field(
        'oenology_hooks_' . $hookname,
        $hooktitle,
        'oenology_hooks_setting_callback',
        'oenology_hooks_' . $hooktab . '_tab',
        'oenology_hooks_' . $hooksection . '_section',
        $hook
    );
}

সাথে add_settings_field(), আমি সহজেই $hookফাংশন কলের পঞ্চম প্যারামিটার হিসাবে কলব্যাকটিতে ভেরিয়েবলটি পাস করে একটি জেনেরিক কলব্যাক লিখতে পারি :

function oenology_hooks_setting_callback( $hook ) {
    $oenology_hooks_options = get_option( 'plugin_oenology_hooks_settings' ); 
    $hookname = $hook['name'];
    $hooktitle = $hook['title'];
    $hookdescription = $hook['description'];
    $hooktype = $hook['type'];
    $hooktab = $hook['tab'];
    $hooksection = $hook['section'];
    $inputvalue = $hookname . '_hide';
    $inputname = 'plugin_oenology_hooks_settings[' . $inputvalue . ']';
    $textareaname = 'plugin_oenology_hooks_settings[' . $hookname . ']';
    $textareavalue = $oenology_hooks_options[$hookname];
    if ( 'Filter' == $hooktype ) {
        ?>
        <input type="checkbox" name="<?php echo $inputname; ?>" value="<?php echo $inputvalue;?>" <?php checked( true == $oenology_hooks_options[$inputvalue]  ); ?> />
        <span>Hide <?php echo $hooktitle; ?> content?</span><br />
        <?php
    }
    ?>
    <span class="description"><?php echo $hooktype; ?> Hook: <?php echo $hookdescription; ?></span><br />
    <textarea name="<?php echo $textareaname; ?>" cols="80" rows="3" ><?php 
        echo esc_textarea( $textareavalue ); 
    ?></textarea>
    <?php 
}

যাইহোক, এটি উপস্থিত হয় যে add_settings_section()একটি অভিন্ন $argsপরামিতি নেই; সুতরাং, $sectionকলব্যাকটিতে ভেরিয়েবলটি পাস করতে আমি একই পদ্ধতিটি ব্যবহার করতে পারি না ।

সুতরাং, আমার প্রশ্ন: add_settings_section()কলব্যাকের সাথে কোনও ভেরিয়েবল পাস করার কোনও উপায় আছে , বা আমি যা করছি তার সাথে সামঞ্জস্যপূর্ণ কলব্যাক তৈরির কোনও উপায় আছে add_settings_field()?

সম্পাদনা করুন:

@ বেনারনেট এটি পেরেক! এখানে আমার কার্য কোড:

/**
 * Callback for add_settings_section()
 * 
 * Generic callback to output the section text
 * for each Plugin settings section. 
 * 
 * @param   array   $section_passed Array passed from add_settings_section()
 */
function oenology_hooks_sections_callback( $section_passed ) {
    global $oenology_hooks_tabs;
    $oenology_hooks_tabs = oenology_hooks_get_settings_page_tabs();
    foreach ( $oenology_hooks_tabs as $tab ) {
        $tabname = $tab['name'];
        $tabsections = $tab['sections'];
        foreach ( $tabsections as $section ) {
            $sectionname = $section['name'];
            $sectiondescription = $section['description'];
            $section_callback_id = 'oenology_hooks_' . $sectionname . '_section';
            if ( $section_callback_id == $section_passed['id'] ) {
                ?>
                <p><?php echo $sectiondescription; ?></p>
                <?php
            }
        }
    }
}

1
কেবলমাত্র একটি বিড়ম্বনা: আপনি কেন extract( $args, EXTR_SKIP );শুরুতে নয় oenology_hooks_setting_callback(), তাই আপনাকে অ্যারের প্রতিটি অংশ একটি নতুন রূপে সংরক্ষণ করতে হবে না $var? এগুলি তখন $'name_inside_the_arrayপ্রাক্তন হিসাবে উপলব্ধ হবে। '$ শিরোনাম , $ tab`, ইত্যাদি
কায়সার

... কারণ আমি আসলে পিএইচপি সহ সমস্ত স্মার্ট না? :) আমি চেষ্টা করে দেখব; ধন্যবাদ!
চিপ বেনেট

সম্ভবত আপনি এই গিস্টটি একবার দেখে নিতে চান , যা ফিল্টার এবং হুকগুলি যুক্ত করতে, যুক্তিগুলি পার্স করতে এবং ক্যোয়ারী স্ট্রিং ইনপুটটি কীভাবে মোকাবেলা করতে পারে তার কয়েকটি "সম্ভবত সেরা অনুশীলন" উদাহরণ দেখায়। এটি কিছুটা পুরানো এবং আমি সময় পেলেই সম্ভবত এটি পুনরায় কাজ করব, তবে ইমো এটি একবার দেখার মতো। :)
কায়সার

এটি আসলে একটি প্লাগইন যা আমি ওনোলজিতে যুক্ত করেছি এমন হুকগুলির জন্য ইউআই যুক্ত করে। আমি থিমটিতে হুকগুলি কীভাবে যুক্ত করেছি তা নিয়ে আমি বেশ আরামদায়ক । এখন, আমি শেষ ব্যবহারকারীদের কাছে তাদের এক্সপোজ করার জন্য একটি সুবিধাজনক উপায় সরবরাহ করার চেষ্টা করছি।
চিপ বেনেট

আমি আপনাকে ভুল বুঝতে পারিনি। আমি আপনাকে এটি প্রদর্শন করতে চেয়েছিলাম যদি এটি আপনার কাছে কিছুটা সাহায্যের (কখনই) হতে পারে। আমি এই কোডটিকে কৌতুকপূর্ণ কিছু হিসাবে দেখছি - কেবল ওয়ার্ডপ্রেসের মাধ্যমে প্রত্যেকের জন্য এবং প্রতিটি কিছু পেতে কতটা প্রচেষ্টা হচ্ছে তা একবার দেখুন ...
কায়সার

উত্তর:


18

যদি আপনি do_settings_sections ফাংশনটি আরও সুনির্দিষ্টভাবে দেখেন 1111 লাইন যেখানে কলব্যাক ফাংশনটি কার্যকর হচ্ছে:

call_user_func($section['callback'], $section);

আপনি দেখতে পাচ্ছেন যে $ বিভাগের অ্যারেটি কলব্যাক ফাংশনে প্রেরণ করা হচ্ছে, তাই আপনি কলের মাধ্যমে কলব্যাক সনাক্ত করতে পারবেন $section['id']

আশা করি এই থেকে।

হালনাগাদ

এখানে একটি উদাহরণ রয়েছে, যদি সমস্ত বিভাগের জন্য আপনার অ্যাড_সেটিং_সেকশন কলব্যাকটির নাম দেওয়া হয় oenology_hooks_section_callbackতবে আপনি এটির মতো এটি সনাক্ত করতে পারেন:

function oenology_hooks_section_callback($section_passed){
    if ($section_passed['id'] == 'whatever_section_id'){
        //do stuff
    }
    if ($section_passed['id'] == 'whatever_section_id_number2'){
        //do other stuff
    }
 }

এবং স্টাফ দ্বারা আমার অর্থ আপনি যে বিভাগ কলব্যাক দিয়ে যা করতে চান তা করুন।


হুম ... আশাবাদী দেখাচ্ছে। আমি কীভাবে নির্ধারণ করব $section['id']?
চিপ বেনেট

@ চিপ বেনেট idআপনার পক্ষে প্রথম যুক্তি হবেadd_settings_section()
রাস্ট

আরও ভাল চেষ্টা করার এবং ব্যাখ্যা করার জন্য @ শিপ বেনেট আমি একটি উদাহরণ যুক্ত করেছি।
বাইনারনেট

@ বেনারনেট: দুর্দান্ত! আমার একটি বিকল্প স্ক্রিপ্ট রয়েছে এবং চিপ বেনেটের মতো একই সমস্যাটি পূরণ করেছি। এখন এটি একটি যাদুমন্ত্র মত কাজ করে। ধন্যবাদ।
আনহ ত্রান

ঠিক আছে, সুতরাং অবশেষে এটি সপ্তাহান্তে ক্লিক করেছে; আমার মনে থাকা কোডটি চেষ্টা করতে দাও এবং আমি আবার রিপোর্ট করব।
চিপ বেনেট

4

আমি জানি এটি একটি পুরানো প্রশ্ন তবে আমি আমার দুটি সেন্টটি ফেলে দেব, যদি অন্য কেউ আসেন তবে; এটি করার একটি সহজ উপায় add_settings_section()হ'ল এটি হ'ল ফাংশনটির নিজস্ব পরিবর্তন লিখুন , এটির শেষে কেবল একটি কলব্যাক আরগস প্যারামিটার যুক্ত হবে।

এটি দেখতে (এটির মতো কিছু) লাগবে

function my_add_settings_section($id, $title, $callback, $page, $callbackargs) {

global $wp_settings_sections;

if ( !isset($wp_settings_sections) ) 
{
    $wp_settings_sections = array();
}

if ( !isset($wp_settings_sections[$page]) )
{
    $wp_settings_sections[$page] = array();
}

if ( !isset($wp_settings_sections[$page][$id]) )
{
    $wp_settings_sections[$page][$id] = array();
}

$wp_settings_sections[$page][$id] = array( 'id' => $id, 'title' => $title, 'callback' => $callback, 'callbackargs' => $callbackargs, 'page' => 'page' );
}

এখন আপনি কেবল নেটিভ ওয়ার্ডপ্রেস ফাংশনের পরিবর্তে এটি ব্যবহার করতে পারেন এবং 'callbackargs'সাধারণ ফ্যাশনে অ্যারে কী এর মাধ্যমে আপনার কলব্যাক আরগগুলিতে অ্যাক্সেস করতে চান

function oenology_hooks_sections_callback( $section_passed ) {
   // Our callback arguments  
   $section_passed['callbackargs']
}

যা আমরা অন্য কোনও ফাংশনে পাস করতে ব্যবহার করতে পারি:

 function oenology_hooks_sections_callback( $section_passed ) {
   // Our callback arguments  
   $args = $section_passed['callbackargs'];
   some_other_function( $args );
}

বা কলব্যাক আরগগুলি নিজেরাই একটি অ্যারে হতে পারে যা আমরা ব্যবহার করি:

function oenology_hooks_sections_callback( $section_passed ) {
   // Our callback arguments  
   if ( $section_passed['callbackargs']['stuff'] !== 'things' ) 
   {
       echo 'stuff is not things!";
   }
}

এটি সমস্ত সম্ভব কারণ add_settings_section()সমস্তগুলি $wp_settings_sectionsবিশ্ব বৈকল্পিকের সাথে একটি নতুন অ্যারে সদস্য যুক্ত করা হয় , সেই নতুন অ্যারে সদস্য নিজেই এমন একটি অ্যারে হতে পারে যা বিভিন্ন নাম সহ কীগুলির সংখ্যা ধারণ করে, যে কোনও ফাংশন যা তারা জানত যে এটি সেখানে ছিল by যখন do_settings_sectionsকল call_user_func_arrayএটা একটা পাসের $sectionsparamater যেমন Bainternet লক্ষনীয়, এর মানে হল যে সমগ্র অ্যারের আমরা যোগ করা $wp_settings_sectionsমধ্যে my_add_settings_section()আমাদের কলব্যাক মধ্যে পাস করা হয়েছে, যার অর্থ আমরা এই ধরনের হিসাবে আমরা এটিতে যোগ প্রতিটি নতুন অ্যারে সদস্য এক্সেস আছে callbackargsআমাদের ফাংশন, যার ফলে একটি পূর্ণ আছে সজ্জিত কলব্যাক

যদিও আমি নিশ্চিত যে এটি সম্ভবত সুস্পষ্ট হতে পারে আমি ভেবেছিলাম যে কেউ যদি বিভ্রান্ত হয়ে পড়ে তবে আমি কেবল এটি ব্যাখ্যা করব।


1

আপনি নির্দিষ্ট ক্রিয়াকলাপ বাস্তবায়নের সন্ধান না করে আপনি সর্বদা আরও সাধারণ পন্থা ব্যবহার করতে পারেন (অর্থাত্ অ্যাড_সেটিংস_সেকশন কোনও কিছু স্পষ্টভাবে পাস করে কিনা তা পরীক্ষা না করে)। এই সাধারণ পদ্ধতির পিএইচপি ক্লোজার ব্যবহার করা হয়।

এটি কীভাবে ব্যবহার করবেন: প্রতিটি স্থানে যেখানে আপনি কোনও ফাংশন নামটি পাস করেন, তার পরিবর্তে এটি কোনও বেনামি ফাংশন ব্যবহার করে।

উদাহরণ:

পরিবর্তে

foreach ( $ar as $name => value ) {
    add_settings_section(
        $section,
        'something',
        'something-else',
        'callback_name'
    );
}

function callback_name() {
    do_something();
}

তুমি ব্যবহার করতে পার:

foreach ( $ar as $name => value ) {
    add_settings_section(
        $section,
        'something',
        'something-else',
        function () use ( $name, $value ) {
            callback_name( $name, $value )
        }
    );
}

function callback_name( $name, $value ) {
    do_something( $name, $value );
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.