संक्षिप्त उत्तर: आपके name
विशेषता मान स्कीमा का उपयोग करना चाहिए option_name[array_key]
। तो, जब आप…
<input name="option_name[key1]">
<input name="option_name[key2]">
... आपको अपने सत्यापन फ़ंक्शन में विकल्प मान के रूप में एक सरणी मिलती है:
array (
'key1' => 'some value',
'key2' => 'some other value'
)
PHP आपके लिए ऐसा करता है, यह एक WordPress सुविधा नहीं है। :)
सेटिंग्स एपीआई के साथ उस काम को कैसे करें?
मान लीजिए, हम यह विकल्प पृष्ठ चाहते हैं, और सभी मानों को एक विकल्प में संग्रहीत किया जाना चाहिए और एक फ़ंक्शन में मान्य होना चाहिए।
विकल्प पृष्ठ
हमें हुक 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
, या सत्यापन नहीं कहा जाएगा। 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
(सत्यापन के लिए)। प्रत्येक अनुरोध पर निम्नलिखित सभी कोड को कॉल न करें। अधिकांश ट्यूटोरियल और लगभग सभी प्लगइन्स को यह गलत लगता है।
ठीक है, चलो पागलों की तरह पंजीकरण करें:
हम अपने पृष्ठ के लिए विकल्प मान प्राप्त करते हैं और कुछ चूक के खिलाफ उन्हें पार्स करते हैं। सुंदर बुनियादी।
हम नाम के साथ एक सेटिंग समूह पंजीकृत करते हैं plugin:t5_sae_option_group
। मुझे उपसर्ग नाम पसंद हैं, वे इस तरह को समझना और समझना आसान हैं।
फिर हम दो खंडों को पंजीकृत करते हैं, 1 और 2।
और हम तीन खंडों को जोड़ते हैं, पहले खंड के लिए दो, दूसरे के लिए एक। हम प्रत्येक क्षेत्र के लिए कॉलबैक फ़ंक्शंस के लिए विकल्प का नाम और बचा हुआ मान पास करते हैं। आउटपुट हैंडलर को डेटा नहीं बदलना चाहिए, बस कुछ 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>";
}
यह देखने के लिए उपयोगी है कि क्या हमें वह मिला है जिसकी हमें उम्मीद थी।
अब, यह बहुत अच्छी तरह से काम करता है, हमें बस एक चीज की आवश्यकता है:
विकल्प सरणी को मान्य करें
क्योंकि हमने ब्रैकेट नोटेशन का उपयोग किया है, इसलिए हमारा मान एक सरणी है। हमें बस प्रत्येक तत्व के माध्यम से चलना है और इसे मान्य करना है।
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">
), और कई अतिरेक से मार्कअप प्राप्त करते हैं ।
जब आपको एपीआई सेटिंग्स का उपयोग करना हो। admin_url( 'admin-post.php' )
प्रपत्र कार्रवाई (इसके स्रोत को देखें) के रूप में एक वैकल्पिक उपयोग के रूप में और अपने स्वयं के साथ पूर्ण सेटिंग्स पृष्ठ बनाएं, शायद अधिक सुरुचिपूर्ण कोड।
दरअसल, आपको यह करना होगा कि जब आप नेटवर्क प्लगइन लिखते हैं, क्योंकि सेटिंग्स एपीआई वहां काम नहीं करता है।
कुछ किनारे मामले और अधूरे भाग भी हैं जिनका मैंने यहां उल्लेख नहीं किया है - जब आपको उनकी आवश्यकता होगी तो आप उन्हें ढूंढ लेंगे। :)