Saya mencoba untuk mengotomatisasi, sebanyak mungkin, fungsi Pengaturan API membutuhkan setiap pengaturan dalam Plugin. Looping melalui array opsi, dan keluaran add_settings_section()
dan add_settings_field()
cukup sederhana:
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'
);
}
}
Dan `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
);
}
Dengan add_settings_field()
, saya dapat dengan mudah menulis panggilan balik generik, dengan meneruskan $hook
variabel ke panggilan balik, sebagai parameter kelima dalam panggilan fungsi:
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
}
Namun, tampaknya add_settings_section()
tidak memiliki $args
parameter analog ; jadi, saya tidak bisa menggunakan metode yang sama untuk meneruskan $section
variabel ke panggilan balik.
Jadi, pertanyaan saya: apakah ada cara untuk mengirimkan variabel ke add_settings_section()
callback, atau cara lain untuk membuat callback analog dengan apa yang saya lakukan add_settings_field()
?
EDIT:
@ Netternet berhasil! Ini kode kerja saya:
/**
* 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
}
}
}
}
sumber
extract( $args, EXTR_SKIP );
di awaloenology_hooks_setting_callback()
, jadi Anda tidak harus menyimpan setiap bagian dari array ke yang baru$var
? Ini kemudian akan tersedia dengan$'name_inside_the_array
, misalnya. '$ title,
$ tab`, dll.Jawaban:
jika Anda melihat fungsi do_settings_sections lebih khusus baris 1164 di mana fungsi callback sedang dijalankan:
Anda dapat melihat bahwa array $ section sedang diteruskan ke fungsi panggilan balik, sehingga Anda dapat mengidentifikasi panggilan balik oleh
$section['id']
harap ini membuat sejak.
Memperbarui
di sini adalah contoh, jika callback add_settings_section Anda untuk semua bagian diberi nama
oenology_hooks_section_callback
maka Anda dapat mengidentifikasinya seperti ini:dan dengan melakukan hal-hal yang saya maksud melakukan apa pun yang ingin Anda lakukan dengan bagian panggilan balik itu.
sumber
$section['id']
?id
akan menjadi argumen pertama yang Anda berikanadd_settings_section()
Saya tahu ini adalah pertanyaan lama tapi saya akan memasukkan dua sen saya, kalau-kalau ada orang lain datang; cara yang lebih sederhana untuk melakukannya adalah dengan menulis sendiri modifikasi
add_settings_section()
fungsi Anda, yang hanya akan menambahkan parameter args callback di akhir itu.Ini akan terlihat seperti ini (atau sesuatu seperti itu)
Sekarang Anda cukup menggunakan ini alih-alih fungsi wordpress asli dan mengakses arg callback Anda melalui
'callbackargs'
kunci array dengan cara yang biasa, seperti iniYang bisa kita gunakan untuk meneruskan ke beberapa fungsi lain:
Atau arg callback bisa berupa array sendiri yang kami gunakan:
Ini semua dimungkinkan karena semua yang
add_settings_section()
dilakukan adalah menambahkan anggota array baru ke$wp_settings_sections
variabel global, bahwa anggota array baru dapat berupa array itu sendiri yang berisi sejumlah kunci dengan nama yang berbeda, yang dapat digunakan, oleh fungsi apa pun yang tahu mereka ada di sana. Ketikado_settings_sections
menyebutcall_user_func_array
melewati sebuah$sections
paramater sebagai Bainternet dicatat, ini berarti bahwa seluruh array kita ditambahkan ke$wp_settings_sections
dalammy_add_settings_section()
dilewatkan ke callback kami, berarti kita memiliki akses ke setiap anggota array baru kita menambahkan untuk itu seperticallbackargs
memungkinkan fungsi kita untuk memiliki penuh panggilan balik baku.Meskipun aku yakin ini mungkin sudah jelas, kupikir aku akan menjelaskannya kalau-kalau ada orang yang bingung.
sumber
Anda juga dapat selalu menggunakan pendekatan yang lebih umum, tidak mencari implementasi fungsi tertentu (artinya, tanpa memeriksa apakah add_settings_section melewati sesuatu secara implisit). Pendekatan umum ini menggunakan penutupan PHP.
Cara menggunakannya: di setiap tempat, tempat Anda menyampaikan nama fungsi, alih-alih memberikan fungsi anonim, dengan menggunakannya .
Contoh:
dari pada
kamu bisa memakai:
sumber