GithubHelp home page GithubHelp logo

customizer-library's Introduction

Customizer Library

A helpful library for working with the WordPress customizer.

About

The customizer allows WordPress developers to add options for themes and plugins, but it should be easier to work with. This library abstracts out some of the complexity.

Instead of adding options to the $wp_customize object directly, developers can just define an array of controls and sections and pass it to the Customizer_Library class.

To see how this works in practice, please see the Customizer Library Demo theme.

The Customizer Library adds sections, settings and controls to the customizer based on the array that gets passed to it. There is default sanitization for all options (though you're still welcome to pass a sanitize_callback). All options are also saved by default as theme_mods (though look for a future update to make this more flexible).

At the moment there is only one custom control (for textarea), but look for additional controls as the library matures.

The Customizer Library includes additional classes and helper functions for creating inline styles and loading Google fonts. These functions and classes were developed by The Theme Foundry for their theme Make and I've found them quite useful in my own projects. However, I'm considering moving them into seperate modules in order to make the core library as focused as possible. Feedback on this is welcome.

Installation

The Customizer Library can be included in your own projects git submodule if you'd like to be able to pull down changes. To include it in your own projects the same way, navigate to the directory and use:

git submodule add [email protected]:devinsays/customizer-library customizer-library

Options

The Customizer Library currently supports these options:

  • Checkbox
  • Select
  • Radio
  • Upload
  • Image
  • Color
  • Textarea
  • Select (Typography)

Sections

Sections are convenient ways to group controls in the customizer.

Customizer Sections can be defined like this:

// Example Section

$sections[] = array(
	'id' => 'example', // Required
	'title' => __( 'Example Section', 'textdomain' ), // Required
	'priority' => '30', // Optional
	'description' => 'Example description' // Optional
);

The Customizer_Library uses the core function $wp_customize->add_section($id, $args); to add sections, and all the same $args are available. See codex.

Arguments

  • title : The visible name of a controller section.
  • priority : This controls the order in which this section appears in the Theme Customizer sidebar.
  • description : This optional argument can add additional descriptive text to the section.

Text

$options['example-text'] = array(
	'id' => 'example-text',
	'label'   => __( 'Example Text Input', 'textdomain' ),
	'section' => $section,
	'type'    => 'text',
);

Checkbox

$options['example-checkbox'] = array(
	'id' => 'example-checkbox',
	'label'   => __( 'Example Checkbox', 'textdomain' ),
	'section' => $section,
	'type'    => 'checkbox',
	'default' => 0,
);

Select

$choices = array(
	'choice-1' => 'Choice One',
	'choice-2' => 'Choice Two',
	'choice-3' => 'Choice Three'
);

$options['example-select'] = array(
	'id' => 'example-select',
	'label'   => __( 'Example Select', 'textdomain' ),
	'section' => $section,
	'type'    => 'select',
	'choices' => $choices,
	'default' => 'choice-1'
);

Radio

$choices = array(
	'choice-1' => 'Choice One',
	'choice-2' => 'Choice Two',
	'choice-3' => 'Choice Three'
);

$options['example-radio'] = array(
	'id' => 'example-radio',
	'label'   => __( 'Example Radio', 'textdomain' ),
	'section' => $section,
	'type'    => 'radio',
	'choices' => $choices,
	'default' => 'choice-1'
);

Upload

$options['example-upload'] = array(
	'id' => 'example-upload',
	'label'   => __( 'Example Upload', 'demo' ),
	'section' => $section,
	'type'    => 'upload',
	'default' => '',
);

Color

$options['example-color'] = array(
	'id' => 'example-color',
	'label'   => __( 'Example Color', 'demo' ),
	'section' => $section,
	'type'    => 'color',
	'default' => $color // hex
);

Textarea

$options['example-textarea'] = array(
	'id' => 'example-textarea',
	'label'   => __( 'Example Textarea', 'demo' ),
	'section' => $section,
	'type'    => 'textarea',
	'default' => __( 'Example textarea text.', 'demo'),
);

Select (Typography)

$options['example-font'] = array(
	'id' => 'example-font',
	'label'   => __( 'Example Font', 'demo' ),
	'section' => $section,
	'type'    => 'select',
	'choices' => customizer_library_get_font_choices(),
	'default' => 'Monoton'
);

Pass $options to Customizer Library

After all the options and sections are defined, load them with the Customizer Library:

// Adds the sections to the $options array
$options['sections'] = $sections;

$customizer_library = Customizer_Library::Instance();
$customizer_library->add_options( $options );

Demo

A full working example can be found here: https://github.com/devinsays/customizer-library-demo/blob/master/inc/customizer-options.php

Styles

The Customizer Library has a helper class to output inline styles. This code was originally developed by The Theme Foundry for use in Make. To see how it works, see "inc/styles.php".

CSS selector(s) and value are passed to Customizer_Library_Styles class like this:

Customizer_Library_Styles()->add( array(
	'selectors' => array(
		'.primary'
	),
	'declarations' => array(
		'color' => $color
	)
) );

Media Queries

Media queries can also be be used with Customizer_Library_Styles. Here's an example for outputting logo-image-2x on high resolution devices.

$setting = 'logo-image-2x';
$mod = get_theme_mod( $setting, false );

if ( $mod ) {

	Customizer_Library_Styles()->add( array(
		'selectors' => array(
			'.logo'
		),
		'declarations' => array(
			'background-image' => 'url(' . $mod . ')'
		),
		'media' => '(-webkit-min-device-pixel-ratio: 1.3),(-o-min-device-pixel-ratio: 2.6/2),(min--moz-device-pixel-ratio: 1.3),(min-device-pixel-ratio: 1.3),(min-resolution: 1.3dppx)'
	) );

}

Fonts

The Customizer Library has a helper functions to output font stacks and load inline fonts. This code was also developed by The Theme Foundry for use in Make. You can see an example of font enqueing in "inc/mods.php":

function demo_fonts() {

	// Font options
	$fonts = array(
		get_theme_mod( 'primary-font', customizer_library_get_default( 'primary-font' ) ),
		get_theme_mod( 'secondary-font', customizer_library_get_default( 'secondary-font' ) )
	);

	$font_uri = customizer_library_get_google_font_uri( $fonts );

	// Load Google Fonts
	wp_enqueue_style( 'demo_fonts', $font_uri, array(), null, 'screen' );

}
add_action( 'wp_enqueue_scripts', 'demo_fonts' );

Fonts can be used in inline styles like this:

// Primary Font
$setting = 'primary-font';
$mod = get_theme_mod( $setting, customizer_library_get_default( $setting ) );
$stack = customizer_library_get_font_stack( $mod );

if ( $mod != customizer_library_get_default( $setting ) ) {

	Customizer_Library_Styles()->add( array(
		'selectors' => array(
			'.primary'
		),
		'declarations' => array(
			'font-family' => $stack
		)
	) );

}

Changelog

Development

  • Add text input option
  • Change how setting parameters are added

1.2.0

  • Allow setting parameters
  • Refactor interface loop

1.1.0

  • Bugfix: customizer.js enqueue relative to library
  • Enhancement: Use new textarea control from core

1.0.0

  • Public Release

customizer-library's People

Contributors

devinsays avatar robneu avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.