অ্যারে উদাহরণ সহ সেটিংস এপিআই


32

আমি একটি নতুন প্লাগইন দিয়ে শুরু করার জন্য প্রাথমিক রেফারেন্স হিসাবে রোকস ওয়ার্ডপ্রেস প্লাগইন ডেভলপমেন্ট বইটি ব্যবহার করছি এবং আমি বুঝতে পারি যে সমস্ত সেটিংস 1 অ্যারে হিসাবে সংরক্ষণ করা যেতে পারে তবে বইটি এর উদাহরণ দেয় না এবং আমি যে সমস্ত জিনিসই করছি ওয়েবে সন্ধান করা এক উদাহরণ থেকে অন্য উদাহরণে খুব আলাদা seems কনস্ট্যান্টিনের পোস্টের দ্বিতীয়ার্ধটি আমাকে কাছে পেয়েছে তবে আমি একাধিক ক্ষেত্রের সাথে আরও একটি সম্পূর্ণ উদাহরণ দেখতে চাই।

উত্তর:


32

সংক্ষিপ্ত উত্তর: আপনার nameঅ্যাট্রিবিউট মানগুলি অবশ্যই স্কিমা ব্যবহার করবে option_name[array_key]। সুতরাং, আপনি যখন ব্যবহার করবেন ...

<input name="option_name[key1]">
<input name="option_name[key2]">

… আপনি আপনার বৈধতা কার্যক্রমে বিকল্প মান হিসাবে একটি অ্যারে পাবেন:

array (
    'key1' => 'some value',
    'key2' => 'some other value'
)

পিএইচপি আপনার জন্য এটি করে, এটি কোনও ওয়ার্ডপ্রেস বৈশিষ্ট্য নয়। :)

সেটিংস এপিআই দিয়ে কীভাবে সেই কাজটি করা যায়?

যাক, আমরা এই বিকল্পগুলির পৃষ্ঠাটি চাই এবং সমস্ত মানগুলি একটি বিকল্পে সংরক্ষণ করা উচিত এবং একটি ফাংশনে বৈধ হওয়া উচিত।

এখানে চিত্র বর্ণনা লিখুন

বিকল্প পৃষ্ঠা

আমাদের হুক admin_menuএবং দুটি ফাংশন প্রয়োজন: একটি পৃষ্ঠা নিবন্ধন করতে, একটি আউটপুট রেন্ডার করতে।

add_action( 'admin_menu', 't5_sae_add_options_page' );

function t5_sae_add_options_page()
{
    add_options_page(
        'T5 Settings API Example', // $page_title,
        'T5 SAE',                  // $menu_title,
        'manage_options',          // $capability,
        't5_sae_slug',             // $menu_slug
        't5_sae_render_page'       // Callback
    );
}

function t5_sae_render_page()
{
    ?>
    <div class="wrap">
        <h2><?php print $GLOBALS['title']; ?></h2>
        <form action="options.php" method="POST">
            <?php 
            settings_fields( 'plugin:t5_sae_option_group' );
            do_settings_sections( 't5_sae_slug' ); 
            submit_button(); 
            ?>
        </form>
    </div>
    <?php
}

ফর্ম actionঅবশ্যই হবে options.php, বা বৈধতা কল করা হবে না। পিএইচপি উত্সটি দেখুন wp-admin/options-permalink.php- একটি গোপন জাল রয়েছে do_settings_sections('permalink');- তবে ফর্মটি actionভুল হওয়ায় এটি কাজ করতে পারে না ।

এখন, আমাদের কাস্টম পৃষ্ঠায় ফিরে আসুন। আমরা এটি ওয়ার্ডপ্রেসের চেয়ে আরও ভাল করি।

সেটিংস, বিভাগ এবং ক্ষেত্র নিবন্ধ করুন

আমাদের admin_init যখন প্রয়োজন হবে তখন আমরা প্রবেশ করি এবং একটি রেজিস্ট্রেশন ফাংশন কল করি

if ( ! empty ( $GLOBALS['pagenow'] )
    and ( 'options-general.php' === $GLOBALS['pagenow']
        or 'options.php' === $GLOBALS['pagenow']
    )
)
{
    add_action( 'admin_init', 't5_sae_register_settings' );
}

এখানে গুরুত্বপূর্ণ অংশটি হ'ল: $GLOBALS['pagenow']অবশ্যই হয় options-general.php(আউটপুট জন্য) অথবা options.php(বৈধতার জন্য)। প্রতিটি অনুরোধে নীচের সমস্ত কোড কল করবেন না। বেশিরভাগ টিউটোরিয়াল এবং প্রায় সমস্ত প্লাগইন এটি ভুল করে।

ঠিক আছে, আসুন পাগলের মতো নিবন্ধন করুন:

  1. আমরা আমাদের পৃষ্ঠার জন্য বিকল্পের মানগুলি নিয়েছি এবং কিছু ডিফল্টের বিরুদ্ধে তাদের পার্স করি। খুব বেসিক।

  2. আমরা নামের সাথে একটি সেটিংস গ্রুপ নিবন্ধিত করি plugin:t5_sae_option_group। আমি প্রিফিক্স করা নামগুলি পছন্দ করি, সেগুলি এইভাবে সাজানো এবং বোঝা সহজ।

  3. তারপরে আমরা দুটি বিভাগ নিবন্ধন করি, 1 এবং 2।

  4. এবং আমরা তিনটি বিভাগ যুক্ত করি, প্রথম বিভাগের জন্য দুটি, দ্বিতীয়টির জন্য একটি। আমরা প্রতিটি ক্ষেত্রের কলব্যাক ফাংশনগুলিতে বিকল্পের নাম এবং পালানো মানটি পাস করি । আউটপুট হ্যান্ডলারের ডেটা পরিবর্তন করা উচিত নয়, কেবল কিছু HTML যুক্ত করা উচিত।

function t5_sae_register_settings()
{
    $option_name   = 'plugin:t5_sae_option_name';

    // Fetch existing options.
    $option_values = get_option( $option_name );

    $default_values = array (
        'number' => 500,
        'color'  => 'blue',
        'long'   => ''
    );

    // Parse option values into predefined keys, throw the rest away.
    $data = shortcode_atts( $default_values, $option_values );

    register_setting(
        'plugin:t5_sae_option_group', // group, used for settings_fields()
        $option_name,  // option name, used as key in database
        't5_sae_validate_option'      // validation callback
    );

    /* No argument has any relation to the prvious register_setting(). */
    add_settings_section(
        'section_1', // ID
        'Some text fields', // Title
        't5_sae_render_section_1', // print output
        't5_sae_slug' // menu slug, see t5_sae_add_options_page()
    );

    add_settings_field(
        'section_1_field_1',
        'A Number',
        't5_sae_render_section_1_field_1',
        't5_sae_slug',  // menu slug, see t5_sae_add_options_page()
        'section_1',
        array (
            'label_for'   => 'label1', // makes the field name clickable,
            'name'        => 'number', // value for 'name' attribute
            'value'       => esc_attr( $data['number'] ),
            'option_name' => $option_name
        )
    );
    add_settings_field(
        'section_1_field_2',
        'Select',
        't5_sae_render_section_1_field_2',
        't5_sae_slug',  // menu slug, see t5_sae_add_options_page()
        'section_1',
        array (
            'label_for'   => 'label2', // makes the field name clickable,
            'name'        => 'color', // value for 'name' attribute
            'value'       => esc_attr( $data['color'] ),
            'options'     => array (
                'blue'  => 'Blue',
                'red'   => 'Red',
                'black' => 'Black'
            ),
            'option_name' => $option_name
        )
    );

    add_settings_section(
        'section_2', // ID
        'Textarea', // Title
        't5_sae_render_section_2', // print output
        't5_sae_slug' // menu slug, see t5_sae_add_options_page()
    );

    add_settings_field(
        'section_2_field_1',
        'Notes',
        't5_sae_render_section_2_field_1',
        't5_sae_slug',  // menu slug, see t5_sae_add_options_page()
        'section_2',
        array (
            'label_for'   => 'label3', // makes the field name clickable,
            'name'        => 'long', // value for 'name' attribute
            'value'       => esc_textarea( $data['long'] ),
            'option_name' => $option_name
        )
    );
}

বিভাগ এবং ক্ষেত্রগুলির জন্য এই সমস্ত কলব্যাক হ্যান্ডলারগুলি স্বয়ংক্রিয়ভাবে কল হবে যখন আমরা do_settings_sections( 't5_sae_slug' );আমাদের পৃষ্ঠায় কল করব । আমরা এটি ইতিমধ্যে করেছি, সুতরাং আমাদের কেবল ...

ক্ষেত্রগুলি মুদ্রণ করুন

nameবৈশিষ্ট্যগুলি কীভাবে নির্মিত তা নোট করুন : উত্তরণটি option_nameপ্রথম অংশটি হয়, অ্যারে কীটি বর্গাকার বন্ধনীতে অনুসরণ করা হয় []

function t5_sae_render_section_1()
{
    print '<p>Pick a number between 1 and 1000, and choose a color.</p>';
}
function t5_sae_render_section_1_field_1( $args )
{
    /* Creates this markup:
    /* <input name="plugin:t5_sae_option_name[number]"
     */
    printf(
        '<input name="%1$s[%2$s]" id="%3$s" value="%4$s" class="regular-text">',
        $args['option_name'],
        $args['name'],
        $args['label_for'],
        $args['value']
    );
    // t5_sae_debug_var( func_get_args(), __FUNCTION__ );
}
function t5_sae_render_section_1_field_2( $args )
{
    printf(
        '<select name="%1$s[%2$s]" id="%3$s">',
        $args['option_name'],
        $args['name'],
        $args['label_for']
    );

    foreach ( $args['options'] as $val => $title )
        printf(
            '<option value="%1$s" %2$s>%3$s</option>',
            $val,
            selected( $val, $args['value'], FALSE ),
            $title
        );

    print '</select>';

    // t5_sae_debug_var( func_get_args(), __FUNCTION__ );
}
function t5_sae_render_section_2()
{
    print '<p>Makes some notes.</p>';
}

function t5_sae_render_section_2_field_1( $args )
{
    printf(
        '<textarea name="%1$s[%2$s]" id="%3$s" rows="10" cols="30" class="code">%4$s</textarea>',
        $args['option_name'],
        $args['name'],
        $args['label_for'],
        $args['value']
    );
}

ওহ, আমি একটি ফাংশন চালু করেছি t5_sae_debug_var()। এটা এখানে:

function t5_sae_debug_var( $var, $before = '' )
{
    $export = esc_html( var_export( $var, TRUE ) );
    print "<pre>$before = $export</pre>";
}

আমরা যা প্রত্যাশা করেছিলাম তা পেয়েছি কিনা তা দরকারী to

এখন, এটি বেশ ভালভাবে কাজ করে, আমাদের কেবল একটি জিনিস প্রয়োজন:

বিকল্প অ্যারে বৈধতা দিন

যেহেতু আমরা বন্ধনী চিহ্নিতকরণ ব্যবহার করেছি, আমাদের মান একটি অ্যারে। আমাদের কেবল প্রতিটি উপাদান দিয়ে যেতে হবে এবং এটি বৈধ করতে হবে।

function t5_sae_validate_option( $values )
{
    $default_values = array (
        'number' => 500,
        'color'  => 'blue',
        'long'   => ''
    );

    if ( ! is_array( $values ) ) // some bogus data
        return $default_values;

    $out = array ();

    foreach ( $default_values as $key => $value )
    {
        if ( empty ( $values[ $key ] ) )
        {
            $out[ $key ] = $value;
        }
        else
        {
            if ( 'number' === $key )
            {
                if ( 0 > $values[ $key ] )
                    add_settings_error(
                        'plugin:t5_sae_option_group',
                        'number-too-low',
                        'Number must be between 1 and 1000.'
                    );
                elseif ( 1000 < $values[ $key ] )
                    add_settings_error(
                        'plugin:t5_sae_option_group',
                        'number-too-high',
                        'Number must be between 1 and 1000.'
                    );
                else
                    $out[ $key ] = $values[ $key ];
            }
            elseif ( 'long' === $key )
            {
                $out[ $key ] = trim( $values[ $key ] );
            }
            else
            {
                $out[ $key ] = $values[ $key ];
            }
        }
    }

    return $out;
}

এটি বরং কুরুচিপূর্ণ; আমি প্রযোজনায় এ জাতীয় কোড ব্যবহার করব না। তবে এটি যা করা উচিত তা করে: এটি মানগুলির একটি বৈধতাযুক্ত অ্যারে প্রদান করে। ওয়ার্ডপ্রেস অ্যারের সিরিয়ালাইজ করবে, এটি আমাদের বিকল্প নামের অধীনে ডাটাবেসে সংরক্ষণ করবে এবং যখন আমরা কল করব তখন এটি অপ্রচলিত অবস্থায় ফিরিয়ে দেবে get_option()


এই সমস্ত কাজ করে তবে এটি অপ্রয়োজনীয় জটিল, আমরা 1998 ( <tr valign="top">) থেকে মার্কআপ পেয়েছি এবং অনেকগুলি অনর্থক।

আপনার যখন করতে হবে সেটিংস API ব্যবহার করুন। admin_url( 'admin-post.php' )ফর্ম অ্যাকশন হিসাবে বিকল্প ব্যবহার হিসাবে (এর উত্স দেখুন) এবং আপনার নিজের, সম্ভবত আরও মার্জিত কোড সহ সম্পূর্ণ সেটিংস পৃষ্ঠা তৈরি করুন।

প্রকৃতপক্ষে, আপনি যখন নেটওয়ার্ক প্লাগইন লিখবেন তখন আপনাকে তা করতে হবে, কারণ সেটিংস এপিআই সেখানে কাজ করে না।

এখানে কয়েকটি প্রান্তের কেস এবং অসম্পূর্ণ অংশগুলিও আমি এখানে উল্লেখ করি নি - আপনি যখন তাদের প্রয়োজন হবে তখন সেগুলি পাবেন। :)


ওহ ধন্যবাদ. এটি খুব সহায়ক। আমি যে অন্যান্য পোস্ট পড়েছি তার কোনওটিতেই প্লাগইন প্লাগইন সম্পর্কে কিছু উল্লেখ করা হয়নি, যা একটি গুরুত্বপূর্ণ নোট যা আমি ভবিষ্যতের জন্য মনে রাখব।
বিয়ন্সের

এটিতে কেবল একটি সংযোজন। আপনি যদি চেকবক্সগুলি প্রদর্শন / সঞ্চয় করার চেষ্টা করছেন তবে আমি কলব্যাক কোডটি পরিবর্তিত করেছি: '<ইনপুট টাইপ = "চেকবক্স" আইডি = "% 3 $ s" নাম = "% 1 $ s [% 2 $ s] মান =" % 4 $ s "'। চেকড (' চালু ', $ আর্গস [' মান '], মিথ্যা)।' /> '
জোকস্ক

উত্তরটি পর্যালোচনা করে আমি প্লাগইন ব্যবহার করে বিস্মিত হই : t5_sae_option_group যার মধ্যে একটি একক কোলন রয়েছে। আমি নিরীক্ষণভাবে দেখেছি এবং এই বাক্য গঠনটির কোনও ব্যাখ্যা খুঁজে পাইনি। আপনি কি পিএইচপি ডকুমেন্টেশনে এর একটি ব্যাখ্যা নির্দেশ করতে পারেন? ধন্যবাদ

@ ব্যবহারকারী 50909: এগুলি আমার কাছে সাধারণ স্ট্রিং শনাক্তকরণগুলির মতো দেখাচ্ছে। পিএইচপি সিনট্যাক্স একটি ফ্যাক্টর হওয়া উচিত নয়।
s_ha_dum

1
@ ডান চেষ্টা করুন basename( $_SERVER['REQUEST_URI'] )
ফুসিয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.