web-dev-qa-db-ja.com

WordPressカスタマイザ:1つのコントロールに複数のアクティブコールバックを設定する方法を教えてください。

コンテンツを表示/非表示にするためのチェックボックスを表示する次の2つのカスタマイザコントロールがあります。各チェックボックスの後には、チェックボックスがオン/オフのときに対応するコントロールを表示/非表示にするactive_callbackが続きます。

// Display About Block Button
$wp_customize->add_setting( 'display_about_block_button', array(
    'default'           => true
) );
$wp_customize->add_control( 'display_about_block_button', array(
    'label'             => __( 'Display About Button', 'my_theme_name' ),
    'type'              => 'checkbox',
    'section'           => 'about',
    'active_callback'   => 'display_about_block_callback'
) );
function display_about_block_button_callback( $control ) {
    if ( $control->manager->get_setting( 'display_about_block_button' )->value() == true ) {
        return true;
    } else {
        return false;
    }
}

// Display About Block
$wp_customize->add_setting( 'display_about_block', array(
    'default'           => true
) );
$wp_customize->add_control( 'display_about_block', array(
    'label'             => __( 'Display About Block', 'my_theme_name' ),
    'type'              => 'checkbox',
    'section'           => 'about'
) );
function display_about_block_callback( $control ) {
    if ( $control->manager->get_setting( 'display_about_block' )->value() == true ) {
        return true;
    } else {
        return false;
    }
}

問題は下記のAbout Block ButtonAbout Blockの中にあることを除けば、どちらも単独で動作します。 About Block Buttonが表示されている場合はAbout Blockだけを非表示にできますが、About Block Buttonが完全に非表示になっている場合は(両方のチェックボックスをオンにしなくても)About Blockを非表示にできます。したがって、これには2つのactive_callbackが必要です。

// About Block Button Text
$wp_customize->add_setting( 'about_block_button_text', array(
    'default'           => __( 'Read More', 'my_theme_name' )
) );    
$wp_customize->add_control( 'about_block_button_text', array(
    'label'             => __( 'About Button Text', 'my_theme_name' ),
    'type'              => 'text',
    'section'           => 'about',
    'active_callback'   => 'display_about_block_button_callback',
    'active_callback'   => 'display_about_block_callback'
) );

残念ながら、両方のactive_callbackを受け入れることはできません。 1つのコントロールに2つ(またはそれ以上)のアクティブコールバックを設定するにはどうすればよいですか。

2
Troy Templeman

たとえば、無名関数(PHP≥5.3)を介して、既存の2つを参照するだけの3番目のアクティブコールバック関数を作成できます。

// About Block Button Text
$wp_customize->add_setting( 'about_block_button_text', array(
    'default'           => __( 'Read More', 'my_theme_name' )
) );    
$wp_customize->add_control( 'about_block_button_text', array(
    'label'             => __( 'About Button Text', 'my_theme_name' ),
    'type'              => 'text',
    'section'           => 'about',
    'active_callback'   => function( $control ) {
        return ( 
            display_about_block_button_callback( $control )
            &&
            display_about_block_callback( $control )
        );
    },
) );
5
Weston Ruter