Skip to content

Instantly share code, notes, and snippets.

@arielk
Created October 13, 2016 15:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save arielk/f6e934cf608c020994e6e03f4bd2312a to your computer and use it in GitHub Desktop.
Save arielk/f6e934cf608c020994e6e03f4bd2312a to your computer and use it in GitHub Desktop.
Adding subset=[lang] for Google Fonts
<?php
/**
* Theme Customize.
*/
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
class Pojo_Theme_Customize {
const FIELD_TEXT = 'text';
const FIELD_TEXTAREA = 'textarea';
const FIELD_SELECT = 'select';
const FIELD_CHECKBOX = 'checkbox';
const FIELD_RADIO = 'radio';
const FIELD_COLOR = 'color';
const FIELD_IMAGE = 'image';
const FIELD_TYPOGRAPHY = 'typography';
const FIELD_BACKGROUND = 'background';
const FIELD_RADIO_IMAGE = 'radio_image';
const FIELD_TWO_COLOR = 'two_color';
const FIELD_DROPDOWN_PAGES = 'dropdown_pages';
const FIELD_SELECT_SIDEBAR = 'select_sidebar';
protected $_fields = array();
protected $_sections = array();
protected $_transport_fields = array();
protected static $_control_priority = 20;
protected static $_section_priority = 20;
protected function _get_field_class( $name ) {
return 'Pojo_Customize_Control_Field_' . ucwords( $name );
}
public function get_field_transport_type( $field = array() ) {
$exclude_post_message = array( 'text_selection', 'bg_selection' );
if ( ! empty( $field['selector'] ) && ! empty( $field['change_type'] ) && ! in_array( $field['change_type'], $exclude_post_message ) && true !== $field['skip_transport'] )
return 'postMessage';
return 'refresh';
}
public function get_theme_sections() {
if ( empty( $this->_sections ) ) {
$this->_sections = apply_filters( 'pojo_register_customize_sections', array() );
}
return $this->_sections;
}
public static function get_control_priority() {
return self::$_control_priority++;
}
public static function get_section_priority() {
return self::$_section_priority++;
}
public function init() {
$mods = get_theme_mods();
if ( isset( $mods[0] ) && ! $mods[0] )
remove_theme_mod( 0 );
unset( $mods['sidebars_widgets'] );
if ( empty( $mods ) ) {
$this->sync_theme_mod();
}
}
public function wp_head() {
$sections = $this->get_theme_sections();
if ( empty( $sections ) )
return;
$google_fonts = $google_early_access_fonts = array();
$css_code = new Pojo_Create_CSS_Code();
foreach ( $sections as $section ) {
if ( empty( $section['fields'] ) )
continue;
foreach ( $section['fields'] as $field ) {
if ( empty( $field['selector'] ) || empty( $field['change_type'] ) )
continue;
$option = get_theme_mod( $field['id'], $field['std'] );
if ( empty( $option ) )
continue;
if ( 'typography' === $field['change_type'] ) {
$option = wp_parse_args( $option, $field['std'] );
$css_code->add_selector( $field['selector'], sprintf( 'color: %s; font-family: \'%s\', Arial, sans-serif; font-weight: %s; font-size: %s;', $option['color'], $option['family'], $option['weight'], $option['size'] ) );
if ( ! isset( $option['line_height'] ) )
$option['line_height'] = false;
if ( ! empty( $option['transform'] ) )
$css_code->add_value( $field['selector'], 'text-transform', $option['transform'] );
if ( ! empty( $option['letter_spacing'] ) )
$css_code->add_value( $field['selector'], 'letter-spacing', $option['letter_spacing'] );
if ( ! empty( $option['style'] ) )
$css_code->add_value( $field['selector'], 'font-style', $option['style'] );
if ( isset( $field['std']['line_height'] ) && false === $field['std']['line_height'] )
$option['line_height'] = false;
$css_code->add_value( $field['selector'], 'line-height', $option['line_height'] );
if ( 'googlefonts' === Pojo_Web_Fonts::get_font_type( $option['family'] ) )
$google_fonts[] = $option['family'];
elseif ( 'earlyaccess' === Pojo_Web_Fonts::get_font_type( $option['family'] ) )
$google_early_access_fonts[] = $option['family'];
} elseif ( 'background' === $field['change_type'] ) {
$option = wp_parse_args( $option, $field['std'] );
if ( ! empty( $option['image'] ) )
$css_code->add_selector( $field['selector'], sprintf( 'background-image: url("%s");', $option['image'] ) );
if ( ! empty( $option['color'] ) ) {
$color_rgb = pojo_hex2rgb( $option['color'] );
if ( ! isset( $option['opacity'] ) )
$option['opacity'] = 100;
$css_code->add_selector( $field['selector'], sprintf( 'background-color: rgba(%d, %d, %d, %s);', $color_rgb[0], $color_rgb[1], $color_rgb[2], ( $option['opacity'] / 100 ) ) );
}
$css_code->add_value( $field['selector'], 'background-position', $option['position'] );
$css_code->add_value( $field['selector'], 'background-repeat', $option['repeat'] );
$css_code->add_value( $field['selector'], 'background-size', $option['size'] );
$css_code->add_value( $field['selector'], 'background-attachment', $option['attachment'] );
} elseif ( 'color' === $field['change_type'] ) {
$css_code->add_value( $field['selector'], 'color', $option );
} elseif ( 'border_color' === $field['change_type'] ) {
$css_code->add_value( $field['selector'], 'border-color', $option );
} elseif ( 'border_left_color' === $field['change_type'] ) {
$css_code->add_value( $field['selector'], 'border-left-color', $option );
} elseif ( 'border_right_color' === $field['change_type'] ) {
$css_code->add_value( $field['selector'], 'border-right-color', $option );
} elseif ( 'two_color_link' === $field['change_type'] ) {
$option = wp_parse_args( $option, $field['std'] );
$css_code->add_value( $field['selector'], 'color', $option['color_1'] );
$css_code->add_value( $field['selector'] . ':hover', 'color', $option['color_2'] );
} elseif ( 'bg_color' === $field['change_type'] ) {
$css_code->add_value( $field['selector'], 'background-color', $option );
} elseif ( 'bg_position' === $field['change_type'] ) {
$css_code->add_value( $field['selector'], 'background-position', $option );
} elseif ( 'bg_repeat' === $field['change_type'] ) {
$css_code->add_value( $field['selector'], 'background-repeat', $option );
} elseif ( 'bg_image' === $field['change_type'] && ! empty( $option ) ) {
$css_code->add_selector( $field['selector'], sprintf( 'background-image: url("%s");', $option ) );
} elseif ( 'bg_size' === $field['change_type'] ) {
$css_code->add_value( $field['selector'], 'background-size', $option );
} elseif ( 'bg_attachment' === $field['change_type'] ) {
$css_code->add_value( $field['selector'], 'background-attachment', $option );
} elseif ( 'height' === $field['change_type'] ) {
$css_code->add_value( $field['selector'], 'height', $option );
$css_code->add_value( $field['selector'], 'line-height', $option );
} elseif ( 'line_height' === $field['change_type'] ) {
$css_code->add_value( $field['selector'], 'line-height', $option );
} elseif ( 'width' === $field['change_type'] ) {
$css_code->add_value( $field['selector'], 'width', $option );
}
// Margin / Padding
foreach ( array( 'margin', 'padding' ) as $margin_or_padding ) {
foreach ( array( 'top', 'bottom', 'left', 'right' ) as $direction ) {
if ( $margin_or_padding . '_' . $direction === $field['change_type'] ) {
$css_code->add_value( $field['selector'], $margin_or_padding . '-' . $direction, $option );
break;
}
}
}
// Custom options.
if ( 'text_selection' === $field['change_type'] ) {
$css_code->add_value( '::selection', 'color', $option );
$css_code->add_value( '::-moz-selection', 'color', $option );
} elseif ( 'bg_selection' === $field['change_type'] ) {
$css_code->add_value( '::selection', 'background', $option );
$css_code->add_value( '::-moz-selection', 'background', $option );
}
}
}
if ( current_theme_supports( 'pojo-background-options' ) ) {
if ( is_single() || is_page() ) {
$selector = sprintf( 'body.postid-%1$d, body.page-id-%1$d', get_the_ID() );
$bg_color = atmb_get_field( 'po_bg_color' );
if ( ! empty( $bg_color ) ) {
$bg_opacity = atmb_get_field( 'po_bg_opacity' );
if ( $bg_opacity ) {
$rgb_color = pojo_hex2rgb( $bg_color );
$bg_color = sprintf( 'rgba(%d,%d,%d,%s)', $rgb_color[0], $rgb_color[1], $rgb_color[2], ( $bg_opacity / 100 ) );
}
$css_code->add_value( $selector, 'background-color', $bg_color );
}
$css_code->add_value( $selector, 'background-repeat', atmb_get_field( 'po_bg_repeat' ) );
$css_code->add_value( $selector, 'background-position', atmb_get_field( 'po_bg_position' ) );
$css_code->add_value( $selector, 'background-size', atmb_get_field( 'po_bg_size' ) );
$css_code->add_value( $selector, 'background-attachment', atmb_get_field( 'po_bg_attachment' ) );
if ( $attachment_id = atmb_get_field( 'po_bg_image' ) ) {
if ( $attachment_image = wp_get_attachment_image_src( $attachment_id, 'full' ) ) {
$css_code->add_value( $selector, 'background-image', sprintf( 'url("%s")', $attachment_image[0] ) );
}
}
}
}
do_action_ref_array( 'pojo_wp_head_custom_css_code', array( $css_code ) );
$google_fonts = array_unique( $google_fonts );
if ( ! empty( $google_fonts ) ) {
foreach ( $google_fonts as &$font ) {
$font = str_replace( ' ', '+', $font ) . ':100,100italic,200,200italic,300,300italic,400,400italic,500,500italic,600,600italic,700,700italic,800,800italic,900,900italic';
}
$fonts_url = sprintf( 'https://fonts.googleapis.com/css?family=%s', implode( '|', $google_fonts ) );
if ( 'he-IL' === get_bloginfo( 'language' ) ) {
$fonts_url .= '&subset=hebrew';
}
printf( '<link rel="stylesheet" type="text/css" href="' . $fonts_url . '">' );
}
$google_early_access_fonts = array_unique( $google_early_access_fonts );
if ( ! empty( $google_early_access_fonts ) ) {
foreach ( $google_early_access_fonts as $current_font ) {
printf( '<link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/earlyaccess/%s.css">', strtolower( str_replace( ' ', '', $current_font ) ) );
}
}
$css_code_content = $css_code->get_css_code();
$custom_css = get_theme_mod( 'pojo_custom_css' );
if ( ! empty( $custom_css ) )
$css_code_content .= $custom_css;
if ( ! empty( $css_code_content ) ) :
?><style type="text/css"><?php echo $css_code_content; ?></style>
<?php endif;
}
public function customize_register( WP_Customize_Manager $wp_customize ) {
$sections = $this->get_theme_sections();
if ( empty( $sections ) )
return;
if ( ! empty( $this->_fields ) ) {
if ( ! class_exists( 'Pojo_Customize_Control_Field_Base' ) )
include( 'fields/base.php' );
foreach ( $this->_fields as $field ) {
$field_class = $this->_get_field_class( $field );
if ( ! class_exists( $field_class ) )
include( 'fields/' . $field . '.php' );
}
}
$remove_core_fields = apply_filters(
'pojo_customizer_remove_core_ids',
array(
//'show_on_front',
//'page_for_posts',
//'blogdescription',
//'page_on_front',
//'blogname',
)
);
foreach ( $remove_core_fields as $remove_core_field_id ) {
$wp_customize->remove_control( $remove_core_field_id );
}
foreach ( $sections as $section ) {
if ( empty( $section['fields'] ) )
continue;
$wp_customize->add_section(
$section['id'],
array(
'title' => $section['title'],
'description' => $section['desc'],
'priority' => self::get_section_priority(),
)
);
foreach ( $section['fields'] as $field ) {
$field = wp_parse_args( $field, array(
'type' => self::FIELD_TEXT,
'setting_type' => 'theme_mod',
'choices' => array(),
'std' => '',
'refresh' => '',
'selector' => '',
'change_type' => '',
'skip_transport' => false,
) );
$field['transport'] = $this->get_field_transport_type( $field );
$field_class = $this->_get_field_class( $field['type'] );
$wp_customize->remove_control( $field['id'] );
$wp_customize->add_setting(
$field['id'],
array(
'default' => $field['std'],
'transport' => $field['transport'],
'type' => $field['setting_type'],
)
);
$wp_customize->add_control(
new $field_class(
$wp_customize,
$field['id'],
array(
'label' => $field['title'],
'section' => $section['id'],
'choices' => $field['choices'],
'default' => $field['std'],
'selector' => $field['selector'],
'change_type' => $field['change_type'],
'priority' => self::get_control_priority(),
'transport' => $field['transport'],
)
)
);
}
}
//if ( $wp_customize->is_preview() && ! is_admin() )
// add_action( 'wp_footer', 'themename_customize_preview', 21);
}
public function customize_preview_init() {
wp_enqueue_script( 'pojo-customizer', get_template_directory_uri() . '/core/assets/admin-ui/theme-customizer.min.js', array( 'customize-preview' ), '20131009', true );
wp_localize_script( 'pojo-customizer', '_pojo_webfont_list', Pojo_Web_Fonts::get_web_fonts() );
}
public function customize_controls_enqueue_scripts() {
wp_enqueue_media();
wp_enqueue_script( 'wp-color-picker' );
wp_enqueue_style( 'wp-color-picker' );
wp_enqueue_script( 'pojo-fields-plugin', get_template_directory_uri() . '/core/assets/admin-ui/fields-plugin.js', array( 'jquery' ) );
wp_enqueue_script( 'pojo-theme-customizer-controls', get_template_directory_uri() . '/core/assets/admin-ui/theme-customizer-controls.js', array( 'jquery', 'pojo-fields-plugin', 'wp-color-picker', 'customize-controls' ), false, true );
wp_enqueue_style( 'pojo-theme-customizer-controls', get_template_directory_uri() . '/core/assets/admin-ui/theme-customizer-controls.css' );
}
public function sync_theme_mod() {
$sections = $this->get_theme_sections();
if ( empty( $sections ) )
return;
foreach ( $sections as $section ) {
if ( empty( $section['fields'] ) )
continue;
foreach ( $section['fields'] as $field ) {
$option = get_theme_mod( $field['id'] );
if ( ! $option ) {
set_theme_mod( $field['id'], $field['std'] );
}
}
}
}
public function __construct() {
include( 'class-pojo-customizer-sections.php' );
add_action( 'init', array( &$this, 'init' ) );
add_action( 'wp_head', array( &$this, 'wp_head' ) );
add_action( 'customize_register', array( &$this, 'customize_register' ) );
add_action( 'customize_preview_init', array( &$this, 'customize_preview_init' ) );
add_action( 'customize_controls_enqueue_scripts', array( &$this, 'customize_controls_enqueue_scripts' ) );
//add_action( 'switch_theme', array( &$this, 'switch_theme' ), 20, 2 );
$this->_fields = array(
self::FIELD_TEXT,
self::FIELD_TEXTAREA,
self::FIELD_SELECT,
self::FIELD_CHECKBOX,
self::FIELD_RADIO,
self::FIELD_COLOR,
self::FIELD_IMAGE,
self::FIELD_TYPOGRAPHY,
self::FIELD_BACKGROUND,
self::FIELD_RADIO_IMAGE,
self::FIELD_TWO_COLOR,
self::FIELD_DROPDOWN_PAGES,
self::FIELD_SELECT_SIDEBAR,
);
}
}
function add_media_manager_template_to_customizer() {
wp_print_media_templates();
}
add_action( 'customize_controls_print_footer_scripts', 'add_media_manager_template_to_customizer' );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment