0

シンプルなボタンとラベルであるテーマ カスタマイザーのカスタム コントロールを作成しました。テーマ mod 設定を元の状態にクリアするテーマ リセット ボタンとして使用します。コントロールを追加してカスタマイザーに表示したので、設定をリセットするコードをどこに追加すればよいかわかりません。

これまでのところ、css とテキストの変更のカスタマイザー設定のみを作成しました。設定を削除するには、テーマ mod の削除機能を使用します。

 <?php remove_theme_mods() ?>

だから私の質問は、上記のように remove_mods 関数を実行するためにこのボタンをどのように使用するのですか? その機能に関するドキュメントはごくわずかです。

テーマの mod 設定をデフォルトにリセットする別の方法があり、これが適切な方法ではない場合は、ご連絡ください。

カスタムボタンを作成したコードは次のとおりです。

function newtheme_customize_reset_control($wp_customize) {
    /**
     * Reset Control
     *
     */
    class newtheme_Customize_reset_Control extends WP_Customize_Control {
        public $type = 'button';

        public function render_content() {
    ?>
        <label>
                        <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span>
                                <div>
                                    <a href="#" class="button-secondary upload"><?php _e( 'Reset Settings' ); ?></a>

                            </div>
                    </label>
    <?php
        }
    } 
}
add_action( 'customize_register', 'newtheme_customize_reset_control', 1, 1 );
4

2 に答える 2

1

テーマ カスタマイザーでは、カスタム JavaScript を wordpress テーマ カスタマイザーに登録できます。

add_action('customize_preview_init', 'your_live_preview_function');

public static function your_live_preview_function() {
        wp_enqueue_script(
                'your-theme_customizer', //Give the script an ID
                get_template_directory_uri() . '/js/your-customizer-javascript-file.js', //Define it's JS file
                array('jquery', 'customize-preview'), //Define dependencies
                rand(1, 1000), //Define a version (optional) (but I use it for development as random so don't have to worry about cache etc.
                true //Specify whether to put in footer (leave this true)
        );

}

そしてあなたのjavascriptファイルの中であなたはこのようなことをすることができます

( function( $ ) {
wp.customize(
        'your_reset_button_control_id',
        function( value ) {
            value.bind(
                function( to ) {
                    jQuery.post( ajax_url, 
                    { 
                        action: 'your_ajax_action_for_calling_reset',
                        reset_value: to
                    },
                    function( response ) {
                        jQuery( '.reset-info' ).html( response );
                    }
                    );
                }
                );
        }
        );
} )( jQuery );

ajax内では、次のようなことができます

add_action('wp_ajax_your_ajax_action_for_calling_reset', 'your_ajax_action_for_calling_reset_callback_function');

function your_ajax_action_for_calling_reset_callback_function(){
$reset_value = esc_attr($_POST['reset_value']);

if($reset_value){
remove_theme_mods() ;
}
}

お役に立てば幸いです。

于 2013-04-24T05:44:03.167 に答える
0

remove_theme_modsカスタマイザーでデフォルトを表示するために使用する際の問題は

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

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

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

Preset コントロールの 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' );

そして、ajax リクエストを行うための Javascript を少しだけ追加します。これは'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 );
                }
            } );
        } );
    } );
} );
于 2018-03-23T22:26:57.387 に答える