Değişken add_settings_section () geri aramasına nasıl geçirilir?


16

Mümkün olduğunca, bir Eklenti'deki her ayar için Ayarlar API'sı işlevini otomatikleştirmeye çalışıyorum. Seçenekler dizisi ile döngü ve çıktı add_settings_section()ve add_settings_field()yeterince basit:

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'
        );
    }
}

Ve `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
    );
}

İle add_settings_field(), $hookişlevi geri çağrısında beşinci parametre olarak değişkeni geri çağrıya geçirerek kolayca genel bir geri arama yazabilirim :

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 
}

Ancak, add_settings_section()benzer bir $argsparametreye sahip olmadığı görülmektedir ; bu nedenle, $sectiondeğişkeni geri aramaya iletmek için aynı yöntemi kullanamıyorum .

Böylece, sorum: bir değişkeni add_settings_section()geri aramaya geçirmenin herhangi bir yolu var mı , ya da benim yaptığım şeye benzer bir geri arama oluşturmanın başka bir yolu var add_settings_field()mı?

DÜZENLE:

@Bainternet çivilenmiş! İşte benim çalışma kodu:

/**
 * 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
Sadece bir sidenote: Neden extract( $args, EXTR_SKIP );başında değilsiniz oenology_hooks_setting_callback(), bu yüzden dizinin her bölümünü yeni bir yere kaydetmek zorunda değilsiniz $var? Bunlar daha sonra $'name_inside_the_array, örn. '$ title , $ tab`, vb.
kaiser

... çünkü aslında PHP ile o kadar akıllı değilim? :) Bunu deneyeceğim; Teşekkürler!
Chip Bennett

Belki filtreler ve kancalar ekleme, argümanları ayrıştırma ve sorgu dizesi girdisi ile ilgilenme konusunda bazı "belki de en iyi uygulama" örneğini gösteren bu Gist'e bir göz atmak istersiniz . Biraz eski ve zamanım olduğunda muhtemelen yeniden çalışacağım, ama imo bir göz atmaya değer. :)
kaiser

Bu aslında sadece Oenology'ye eklediğim kancalar için kullanıcı arayüzü ekleyen bir eklentidir. Kancaları Temaya nasıl eklediğim konusunda oldukça rahatım . Şimdi, onları son kullanıcılara göstermenin uygun bir yolunu sağlamaya çalışıyorum.
Chip Bennett

Seni yanlış anlamadım. Sana yardım etmek isteseydim bunu sana göstermek istedim. Bu kodu ironik bir şey olarak görüyorum - sadece wordpress yolunda herkes için her şeyi almak için ne kadar çaba harcadığına bir göz atın ...
kaiser

Yanıtlar:


18

do_settings_sections işlevine daha spesifik olarak geri arama işlevinin yürütüldüğü 1164 satırına bakarsanız :

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

$ section dizisinin geri arama işlevine iletildiğini görebilirsiniz, böylece geri aramayı $section['id']

umarım bu zamandan beri.

Güncelleme

işte bir örnek, tüm bölümler için add_settings_section geri aramanız adlandırılmışsa, oenology_hooks_section_callbackbunu şu şekilde tanımlayabilirsiniz:

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
    }
 }

ve bir şeyler yapmak demek istediğim o bölüm geri aramasıyla ne yapmak istiyorsan onu yap.


Hmm ... bu umut verici görünüyor. Nasıl belirlerim $section['id']?
Chip Bennett

@Chip Bennett idsize iletmek ilk argüman olacakadd_settings_section()
Rarst

@Chip Bennett Daha iyi denemek ve açıklamak için bir örnek ekledim.
Bainternet

@Bainternet: Harika! Bir seçenek komut dosyası var ve Chip Bennett ile aynı sorunu bir araya geldi. Şimdi bir cazibe gibi çalışıyor. Teşekkürler.
Anh Tran

Tamam, sonunda hafta sonu tıkladı; aklımdaki kodu deneyeyim, rapor vereceğim.
Chip Bennett

4

Bunun eski bir soru olduğunu biliyorum ama başka birisinin gelmesi durumunda iki sentimi atacağım; Bunu yapmanın daha basit bir yolu, add_settings_section()işlevin kendi modifikasyonunu yazmak olacaktır, bu da yalnızca sonuna bir geri çağrı args parametresi ekleyecektir.

Bu şöyle görünecektir (veya buna benzer bir şey)

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' );
}

Şimdi bunu yerel wordpress işlevi yerine kullanacak ve geri arama argümanlarınıza 'callbackargs'dizi anahtarı aracılığıyla normal bir şekilde erişeceksiniz.

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

Hangi başka bir işleve geçmek için kullanabilirsiniz:

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

Veya geri arama argümanları kullandığımız bir dizi olabilir:

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

Tüm bunlar add_settings_section(), $wp_settings_sectionsgenel değişkene yeni bir dizi üyesi eklemek olduğundan , yeni dizi üyesi, orada olduklarını bilen herhangi bir işlev tarafından kullanılabilecek farklı adlara sahip çok sayıda anahtar içeren bir dizi olabilir. Ne zaman do_settings_sectionsçağrıları call_user_func_arraybir geçer $sectionsBainternet belirttiğimiz gibi eklenen tüm dizi bu araçlar, parametrenin yeni $wp_settings_sectionsiçinde my_add_settings_section()biz gibi biz buna eklediğiniz her yeni dizi üyesi erişebilir, yani bizim geri arama geçirilir callbackargstam olması için izin bizim fonksiyonu tam geri arama.

Rağmen bu açık olabilir eminim ben sadece karışan biri bakar durumda açıklamak olacağını düşündüm.


1

Ayrıca, belirli bir işlev uygulamasını (yani, add_settings_section öğesinin dolaylı bir şeyden geçip geçmediğini kontrol etmeden) daha genel bir yaklaşım da kullanabilirsiniz. Bu genel yaklaşım PHP kapatmayı kullanır.

Nasıl kullanılır: bir işlev adını ilettiğiniz her yerde, bunun yerine anonim bir işlevi geçerek kullanın .

Misal:

onun yerine

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

function callback_name() {
    do_something();
}

kullanabilirsiniz:

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 );
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.