WordPress.org

Make WordPress Core

Ticket #30529: functions.php

File functions.php, 5.0 KB (added by jaspermdegroot, 7 years ago)

Test theme functions

Line 
1<?php
2// Ticket 30529: "Customizer: Settings with type 'option' not saved before refresh"
3
4// Theme setup
5add_action( 'after_setup_theme', 'testtheme_setup' );
6
7function testtheme_setup() {
8   
9    // Register a nav menu
10    register_nav_menus( array(
11        'main-menu' => __( 'Main Menu', 'testtheme' ),
12    ) );     
13}
14
15
16// Enqueue stylesheet
17add_action( 'wp_enqueue_scripts', 'enqueue_style' );
18
19function enqueue_style() {
20        wp_enqueue_style( 'stylesheet', get_stylesheet_uri() );
21}
22
23
24// Defaults for options
25function testtheme_get_options_defaults() {
26        $defaults = array(
27        'logo'                     => false,
28        'header_background_color'  => '#ffffff',
29        'site_background_color'    => '#f4f4f4',
30        'content_align'            => 'align-left',
31        );
32        return $defaults;
33}
34
35function testtheme_get_theme_mods() {
36   
37    return wp_parse_args( 
38        get_theme_mods(), 
39        testtheme_get_options_defaults()
40    );
41}
42$testtheme_options = testtheme_get_theme_mods();
43
44
45// Customizer
46add_action( 'customize_register', 'testtheme_customize_register' );
47
48function testtheme_customize_register( $wp_customize ) {
49    $defaults = testtheme_get_options_defaults();
50   
51    // Live preview title and tagline
52        $wp_customize->get_setting( 'blogname' )->transport        = 'postMessage';
53        $wp_customize->get_setting( 'blogdescription' )->transport = 'postMessage';
54
55    // Section, setting, and control for logo
56    $wp_customize->add_section( 'logo-section', array(
57        'title'             => __( 'Logo', 'testtheme' ),
58    ) );
59
60    $wp_customize->add_setting( 'logo', array(
61        'default'           => $defaults['logo'],
62        'transport'         => 'postMessage',
63        'sanitize_callback' => 'esc_url_raw',     
64    ) );
65
66    $wp_customize->add_control( new WP_Customize_Image_Control( $wp_customize, 'logo-control', array(
67        'label'             => __( 'Upload your logo', 'testtheme' ),
68        'section'           => 'logo-section',
69        'settings'          => 'logo',
70    ) ) );
71
72   
73    // Setting, and control for header background color
74    $wp_customize->add_setting( 'header_background_color', array(
75        'default'           => $defaults['header_background_color'],
76        'transport'         => 'postMessage',
77        'sanitize_callback' => 'sanitize_hex_color',
78    ) );
79
80    $wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, 'header-background-color-control', array(
81        'label'             => __( 'Header background color', 'testtheme' ),
82        'section'           => 'colors',
83        'settings'          => 'header_background_color',
84    ) ) );
85
86   
87    // Setting, and control for site background color
88    $wp_customize->add_setting( 'site_background_color', array(
89        'default'           => $defaults['site_background_color'],
90        'transport'         => 'postMessage',
91        'sanitize_callback' => 'sanitize_hex_color',
92    ) );
93
94    $wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, 'site-background-color-control', array(
95        'label'             => __( 'Site background color', 'testtheme' ),
96        'section'           => 'colors',
97        'settings'          => 'site_background_color',
98    ) ) );
99
100   
101    // Section, setting, and control for content alignment
102    $wp_customize->add_section( 'content-section', array(
103        'title'             => __( 'Content', 'testtheme' ),
104    ) );
105   
106    $wp_customize->add_setting( 'content_align', array(
107        'default'           => $defaults['content_align'],
108        'transport'         => 'postMessage',
109        'sanitize_callback' => 'sanitize_content_align',     
110    ) );
111   
112    function sanitize_content_align( $input ) {
113        $accepted = array( 'align-left', 'align-center' );
114       
115        if ( ! in_array( $input, $accepted ) ) {
116            $input = $defaults['content_align'];
117        }
118    }
119
120    $wp_customize->add_control( new WP_Customize_Control( $wp_customize, 'content-align-control', array(
121        'label'      => __( 'Content alignment', 'testtheme' ),
122        'section'    => 'content-section',
123        'settings'   => 'content_align',
124        'type'       => 'select',
125        'choices'    => array(
126            'align-left'   => __( 'Left', 'testtheme' ),
127            'align-center' => __( 'Center', 'testtheme' ),
128        ),
129    ) ) );
130}
131
132
133// Enqueue the script for the live preview
134add_action( 'customize_preview_init', 'live_preview_script' );
135
136function live_preview_script() {
137    wp_enqueue_script( 
138        'customize-live-preview',
139        get_template_directory_uri() . '/live-preview.js',
140        array( 'jquery' ),
141        false, 
142        true
143    );   
144}
145
146
147// Add custom style to the <head>
148add_action( 'wp_head', 'custom_style' );
149
150function custom_style() {
151    global $testtheme_options;
152   
153    $style = '<style id="custom-style-css">';
154   
155    $style .= '.header { background:' . $testtheme_options['header_background_color'] . '; }';
156   
157    $style .= '.site { background:' . $testtheme_options['site_background_color'] . '; }';
158   
159    $style .= '</style>';
160   
161    echo $style;
162}