web-dev-qa-db-ja.com

テーマカスタマイザのすべての設定を変更するための一つのボタン?

テーマカスタマイザ用のテーマリセットボタンを作成して、すべてのtheme_mod設定を自動的に削除しようとしています。私はこれを行うために複数の方法を試してみましたが、それを機能させることはできませんでした。 ここに見られるように

Remove_theme_modsアプローチを使用して何度も失敗した後、私はそれがajaxとjavascriptが間違っていてボタンを正しくバインドしていないこと以外の私の問題なのか疑問に思い始めます。

すべてのデフォルトを1つの大きな配列に保存しているので、テーマをインストールすると自動的にテーマカスタマイザページに値が表示されます。テーマは特定の外観をしています。私はそれらを乗り越えただけの設定、おそらくカスタムコントロールで?どういうわけか、これらのデフォルト値をすべての設定に割り当てることによって?誰かが私がこれを成し遂げるのを手伝ってくれることを本当に願っています。あなたが何かアイデアがあれば私はとても感謝します。

テーマのデフォルト値を割り当てる方法の例は次のとおりです。

function newtheme_get_theme_mods() {

$defaults = array(

        'newtheme_responsive'                 => true,

        'newtheme_hero_title'                 => 'Beautiful and Elegant',

        'newtheme_hero_description'           => 'The best theme in the world',

                'newtheme_header_logo'                => '/wp-content/themes/newtheme/img/logo.png',

                'newtheme_header_background_color'    => 'rgba(35,35,35, 0.9)'


    return $defaults;

}
3
user1632018

カスタマイザでデフォルトを表示するためにremove_theme_modsを使用することに関する問題は、

  • カスタマイザは、保存せずに終了できるプレビューです。
  • 個々のtheme_modはフィルタリングされますが、theme_mod配列全体はフィルタリングされません。
  • theme_modsはメニューとウィジェットを含みます。

リセットボタンも欲しいのですが、代わりにプリセットコントロールを作成することにしました。プリセットの1つは「デフォルト」です。この方法ではselectを使用しているので、ボタンが機能しなくても問題はありません(bindは値の変更用であり、ボタンの値は変更されないため)。

コツは、選択したプリセットを取得するためにajaxを使用してから、javascript内の値をループして設定に割り当て、それらの変更がプレビューの更新をトリガーするようにすることです。私のコードには、子テーマがより多くのオプションやプリセットを追加できるようにフィルターが含まれています。そしてプリセットは利用可能なオプションのサブセットにすることができます。

これがプリセットコントロール用のPHPです(通常のselect、しかし設定のないコントロール):

$wp_customize->add_control( 'option_presets', array(
    'label'    => __( 'Use preset theme options', 'mytheme' ),
    'description' => __( 'Theme options will be set to the preset values.', 'mytheme' ),
    'section'  => 'mytheme_section',
    'settings' => array(),
    'type'     => 'select',
    'capability' => 'edit_theme_options',
    'choices'  => mytheme_option_presets_choices(),
) );

これはPHP関数の残りです

/**
 * Supply list of choices for option presets.
 */
function mytheme_option_presets_choices() {
    return apply_filters( 'mytheme_option_presets_choices', array(
        'none' => __( 'Select preset', 'mytheme' ),
        'defaults' => __( 'Defaults', 'mytheme' ),
        'dark' => __( 'Dark', 'mytheme' ),
    ) );
}

/**
 * Sanitize an option preset choice.
 */
function mytheme_sanitize_option_presets_choice( $input ) {
    $valid = mytheme_option_presets_choices();
    return array_key_exists( $input, $valid ) ? $input : 'none';
}

/**
 * Get the preset values for the chosen option preset.
 */
function mytheme_option_preset( $which ) {
    $values = array();
    if ( 'defaults' === $which ) {
        $values = mytheme_default_values();
    }
    if ( 'dark' === $which ) {
        $values = array(
            'body_textcolor' => '#f9f7f7',
            'background_color' => '#444244',
            'header_textcolor' => '#bf9a07',
            'area_classes' => array(
                'sidebar' => 'semi-black',
                'widgets' => 'box',
                ),
        );
    }
    return apply_filters( 'mytheme_option_preset', $values, $which );
}

/**
 * Add a nonce for Customizer for option presets.
 */
function mytheme_refresh_nonces( $nonces ) {
    $nonces['mytheme-customize-presets'] = wp_create_nonce( 'mytheme-customize-presets' );
    return $nonces;
}
add_filter( 'customize_refresh_nonces', 'mytheme_refresh_nonces' );

/**
 * Ajax handler for supplying option preset values.
 */
function mytheme_ajax_option_preset_values() {
    check_ajax_referer( 'mytheme-customize-presets', 'option_presets_nonce' );
    if ( ! current_user_can( 'edit_theme_options' ) ) {
        wp_die( -1 );
    }

    if ( empty( $_POST['option_preset'] ) ) {
        wp_send_json_error( 'mytheme_missing_preset_parameter' );
    }
    $preset = sanitize_text_field( wp_unslash( $_POST['option_preset'] ) );
    $values = mytheme_option_preset( $preset );
    if ( empty( $values ) ) {
        wp_send_json_error( array( 'message' => __( 'No preset found.', 'mytheme' ) ) );
    }
    else {   // Flatten the array.
        foreach ($values as $key => $avalue) {
            if ( is_array( $avalue ) ) {
                unset( $values[$key] );
                foreach ($avalue as $subkey => $subvalue) {
                    $values[$key . '[' . $subkey . ']'] = $subvalue;
                }
            }
        }
        wp_send_json_success( array( 'values' => $values ) );
    }
}
add_action( 'wp_ajax_mytheme_option_preset', 'mytheme_ajax_option_preset_values' );

そして、ほんの少しのJavascriptでajaxリクエストを行います。これは'customize_controls_enqueue_scripts'アクションのキューに入れられます。 (エラーメッセージの表示を省きました。)

wp.customize.control( 'option_presets', function( control ) {
    control.element = new wp.customize.Element( control.container.find( 'select' ) );
    control.element.bind( function( preset ) {
        var request = wp.ajax.post( 'mytheme_option_preset', {
            option_presets_nonce: wp.customize.settings.nonce['mytheme-customize-presets'],
            wp_customize: 'on',
            customize_theme: wp.customize.settings.theme.stylesheet,
            option_preset: preset
        } );
        request.done( function( response ) {
            _.each( response.values, function( value, id ) {
                var setting = wp.customize( id );
                if ( setting ) {
                    setting.set( value );
                }
            } );
        } );
    } );
} );
1
Joy Reynolds

remove_theme_mods と呼ばれる関数があり、これはすべてのテーマのmodを消します。ただし、これは カスタマイザAPI を使用してテーマで定義したmodを削除するだけではないことに注意してください。また、メニューの場所など、他のモッドもターゲットにします。ウィジェットの位置は現在modではなくオプションとして定義されていますが、将来変更される可能性があります。 WordPressはオプションから改造へより多くのものを移動させる可能性があり、remove_theme_modsを使うのはもっと危険です。

最善の方法は、テーマに適切なすべてのモッズを配列に配置することです。その後、その配列をループ処理して、 remove_theme_mod で個々のmodを削除できます。

1
cjbj

だからあなたのテーマ設定ページでこのようなことをする:

if( isset( $_REQUEST['resetl_all'] ) ){
    call_reset_function(); // or newtheme_get_theme_mods function (I guess)                      
}
0
0_0

これはすべてのtheme_mod設定を削除します

function reset_newtheme_options() { 
    remove_theme_mods();
}
0
Kokil