hueman/functions/init-core.php
2016-05-29 16:38:10 +02:00

1261 lines
39 KiB
PHP

<?php
/****************************************************************************
****************************** HELPERS **************************************
*****************************************************************************/
/**
* Is the customizer left panel being displayed ?
* @return boolean
* @since 3.3+
*/
function hu_is_customize_left_panel() {
global $pagenow;
return is_admin() && isset( $pagenow ) && 'customize.php' == $pagenow;
}
/**
* Is the customizer preview panel being displayed ?
* @return boolean
* @since 3.3+
*/
function hu_is_customize_preview_frame() {
return ! is_admin() && isset($_REQUEST['wp_customize']);
}
/**
* Always include wp_customize or customized in the custom ajax action triggered from the customizer
* => it will be detected here on server side
* typical example : the donate button
*
* @return boolean
* @since 3.3+
*/
function hu_doing_customizer_ajax() {
$_is_ajaxing_from_customizer = isset( $_POST['customized'] ) || isset( $_POST['wp_customize'] );
return $_is_ajaxing_from_customizer && ( defined( 'DOING_AJAX' ) && DOING_AJAX );
}
/**
* Are we in a customization context ? => ||
* 1) Left panel ?
* 2) Preview panel ?
* 3) Ajax action from customizer ?
* @return bool
* @since 3.3+
*/
function hu_is_customizing() {
//checks if is customizing : two contexts, admin and front (preview frame)
return in_array( 1, array(
hu_is_customize_left_panel(),
hu_is_customize_preview_frame(),
hu_doing_customizer_ajax()
) );
}
/* HELPER FOR CHECKBOX OPTIONS */
//the old options used 'on' and 'off'
//the new options use 1 and 0
function hu_is_checked( $opt_name = '') {
$val = hu_get_option($opt_name);
return hu_booleanize_checkbox_val( $val );
}
function hu_booleanize_checkbox_val( $val ) {
if ( ! $val )
return;
switch ( (string) $val ) {
case 'off':
case '' :
return false;
case 'on':
case '1' :
return true;
default: return false;
}
}
//used in the customizer
//replace wp checked() function
function hu_checked( $val ) {
echo hu_is_checked( $val ) ? 'checked="checked"' : '';
}
/**
* Checks if we use a child theme. Uses a deprecated WP functions (get _theme_data) for versions <3.4
* @return boolean
*
*/
function hu_is_child() {
// get themedata version wp 3.4+
if ( function_exists( 'wp_get_theme' ) ) {
//get WP_Theme object
$_theme = wp_get_theme();
//define a boolean if using a child theme
return $_theme -> parent() ? true : false;
}
else {
$_theme = call_user_func('get_' .'theme_data', get_stylesheet_directory().'/style.css' );
return ! empty($_theme['Template']) ? true : false;
}
}
/**
* Returns a boolean
* check if user started to use the theme before ( strictly < ) the requested version
*
*/
function hu_user_started_before_version( $_ver ) {
if ( ! get_transient( 'started_using_hueman' ) )
return false;
$_trans = 'started_using_hueman';
if ( ! $_ver )
return false;
$_start_version_infos = explode('|', esc_attr( get_transient( $_trans ) ) );
if ( ! is_array( $_start_version_infos ) )
return false;
switch ( $_start_version_infos[0] ) {
//in this case we know exactly what was the starting version (most common case)
case 'with':
return version_compare( $_start_version_infos[1] , $_ver, '<' );
break;
//here the user started to use the theme before, we don't know when.
//but this was actually before this check was created
case 'before':
return true;
break;
default :
return false;
break;
}
}
/* ------------------------------------------------------------------------- *
* Various Helpers
/* ------------------------------------------------------------------------- */
/**
* helper
* Check if we are displaying posts lists or front page
* @return bool
*/
function hu_is_home() {
//get info whether the front page is a list of last posts or a page
return ( is_home() && ( 'posts' == get_option( 'show_on_front' ) || 'nothing' == get_option( 'show_on_front' ) ) ) || is_front_page();
}
/**
* helper
* States if the current context is the blog page from a WP standpoint
* @return bool
*/
function hu_is_blogpage() {
return is_home() && ! is_front_page();
}
/**
* helper
* @return bool
*/
function hu_has_social_links() {
$_socials = hu_get_option('social-links');
return ! empty( $_socials ) && false != $_socials;
}
/**
* helper ensuring backward compatibility with the previous option system
* @return img src string
*/
function hu_get_img_src( $img ) {
if ( ! $img )
return;
$_image_src = '';
$_width = false;
$_height = false;
$_attachment_id = '';
//Get the img src
if ( is_numeric($img) ) {
$_attachment_id = $img;
$_attachment_data = apply_filters( "hu_attachment_img" , wp_get_attachment_image_src( $_attachment_id, 'full' ), $_attachment_id );
$_img_src = $_attachment_data[0];
$_width = ( isset($_attachment_data[1]) && $_attachment_data[1] > 1 ) ? $_attachment_data[1] : $_width;
$_height = ( isset($_attachment_data[2]) && $_attachment_data[2] > 1 ) ? $_attachment_data[2] : $_height;
} else { //old treatment
//rebuild the img path : check if the full path is already saved in DB. If not, then rebuild it.
$upload_dir = wp_upload_dir();
$_saved_path = esc_url ( $img );
$_img_src = ( false !== strpos( $_saved_path , '/wp-content/' ) ) ? $_saved_path : $upload_dir['baseurl'] . $_saved_path;
}
//return img source + make ssl compliant
return is_ssl() ? str_replace('http://', 'https://', $_img_src) : $_img_src;
}
/**
* wrapper of hu_get_img_src specific for theme options
* @return logo src string
*/
function hu_get_img_src_from_option( $option_name ) {
$_img_option = esc_attr( hu_get_option($option_name) );
if ( ! $_img_option )
return;
$_logo_src = hu_get_img_src( $_img_option );
//hook
return apply_filters( "hu_logo_src" , $_logo_src ) ;
}
/* ------------------------------------------------------------------------- *
* OptionTree framework integration: Use in theme mode
/* ------------------------------------------------------------------------- */
//control if we use option tree
//@todo remove : for TEST PURPOSES ONLY
//add_filter( 'use_option_tree' , isset( $_GET['use_option_tree'] ) ? '__return_true' : '__return_false' );
add_filter( 'ot_show_pages', '__return_false' );
add_filter( 'ot_show_new_layout', '__return_false' );
add_filter( 'ot_theme_mode', '__return_true' );
/* ------------------------------------------------------------------------- *
* OptionTree options moved to the customizer
/* ------------------------------------------------------------------------- */
//disable all ot options : page, etc...
add_filter( 'ot_use_theme_options', '__return_false' );
//override the function controlling the theme Option page link for the admin bar.
function ot_register_theme_options_admin_bar_menu() {}
add_filter('ot_theme_options_page_title', 'hu_change_option_tree_title');
add_filter('ot_theme_options_menu_title', 'hu_change_option_tree_title');
function hu_change_option_tree_title() {
return __('Theme Options [OLD]', 'hueman');
}
/* ------------------------------------------------------------------------- *
* Define some useful constants
/* ------------------------------------------------------------------------- */
//get WP_Theme object of Hueman
$hu_theme = wp_get_theme();
//Get infos from parent theme if using a child theme
$hu_theme = $hu_theme -> parent() ? $hu_theme -> parent() : $hu_theme;
$hu_base_data['prefix'] = $hu_base_data['title'] = $hu_theme -> name;
$hu_base_data['version'] = $hu_theme -> version;
$hu_base_data['authoruri'] = $hu_theme -> {'Author URI'};
//HUEMAN_VER is the Version
if( ! defined( 'HUEMAN_VER' ) ) define( 'HUEMAN_VER' , $hu_base_data['version'] );
//HU_BASE is the root server path of the parent theme
if( ! defined( 'HU_BASE' ) ) define( 'HU_BASE' , get_template_directory().'/' );
//HU_BASE_CHILD is the root server path of the child theme
if( ! defined( 'HU_BASE_CHILD' ) ) define( 'HU_BASE_CHILD' , get_stylesheet_directory().'/' );
//HU_BASE_URL http url of the loaded parent theme
if( ! defined( 'HU_BASE_URL' ) ) define( 'HU_BASE_URL' , get_template_directory_uri() . '/' );
//HU_BASE_URL_CHILD http url of the loaded child theme
if( ! defined( 'HU_BASE_URL_CHILD' ) ) define( 'HU_BASE_URL_CHILD' , get_stylesheet_directory_uri() . '/' );
//THEMENAME contains the Name of the currently loaded theme
if( ! defined( 'THEMENAME' ) ) define( 'THEMENAME' , $hu_base_data['title'] );
//HU_OPTION_GROUP contains the Name of the hueman theme options in wp_options
//=> was previously option tree default name
if( ! defined( 'HU_THEME_OPTIONS' ) ) define( 'HU_THEME_OPTIONS' , apply_filters( 'hu_theme_options', 'hu_theme_options' ) );
if( ! defined( 'HU_OPT_AJAX_ACTION' ) ) define( 'HU_OPT_AJAX_ACTION' , 'hu_get_option' );
if( ! defined( 'HU_CTX_ON' ) ) define( 'HU_CTX_ON' , false );
//HU_WEBSITE is the home website of Hueman
if( ! defined( 'HU_WEBSITE' ) ) define( 'HU_WEBSITE' , $hu_base_data['authoruri'] );
/* ------------------------------------------------------------------------- *
* Loads and instanciates Utils
/* ------------------------------------------------------------------------- */
load_template( get_template_directory() . '/functions/class-utils-settings-map.php' );
new HU_utils_settings_map;
load_template( get_template_directory() . '/functions/class-utils.php' );
new HU_utils;
/* ------------------------------------------------------------------------- *
* Loads Ctx helpers
/* ------------------------------------------------------------------------- */
if ( HU_CTX_ON ) {
load_template( get_template_directory() . '/functions/skop/init-skop.php' );
}
//note: $default is never used => to remove
function hu_get_option( $option_id, $default = '' ) {
return HU_utils::$inst -> hu_opt( $option_id );
}
/* ------------------------------------------------------------------------- *
* SIDEBAR OPTION RETRO COMPATIBILITY
/* ------------------------------------------------------------------------- */
//backup the sidebar_widgets as they are before the migration
//if something wrong happens, we'll be able to restore them with wp_set_sidebars_widgets()
//and to remove the potential _orphaned generated
add_action( 'after_switch_theme', 'hu_backup_sidebars', 0 );
function hu_backup_sidebars() {
$sidebars_widgets = get_theme_mod( 'sidebars_widgets' );
$data = isset($sidebars_widgets['data']) ? $sidebars_widgets['data'] : array();
if ( ! get_transient( '_hu_sidebar_backup' ) )
set_transient( '_hu_sidebar_backup', $data, 24 * 3600 * 365 * 20 );
}
//get the previous locations and contexts and turn them into new options
add_filter('hu_implement_options_compat', 'hu_generate_new_sidebar_options');
//hook : hu_implement_options_compat
function hu_generate_new_sidebar_options($__options) {
//generates the default widget zone options
$_default_locations = hu_get_builtin_widget_zones_location();
$builtin_zones = array();
foreach ( hu_get_default_widget_zones() as $_zone_id => $_data ) {
$_locs = hu_get_old_locations($_zone_id, $__options);
if ( empty($_locs) && isset($_default_locations[$_zone_id]) ) {
$_locs[] = key($_default_locations[$_zone_id]);
}
$_contexts = hu_get_old_contexts($_zone_id, $__options);
if ( empty($_contexts) && isset($_default_locations[$_zone_id]) ) {
$_contexts[] = ('_all_');
}
$builtin_zones[] = array(
'id' => $_data['id'],
'title' => $_data['name'],
'contexts' => $_contexts,
'locations' => $_locs,
'is_builtin' => true,
'description' => $_data['description']
);
}
//generates the custom widget zone options
$_old_custom_zone_opt = isset( $__options['sidebar-areas'] ) ? $__options['sidebar-areas'] : array();
$custom_zones = array();
if ( ! empty($_old_custom_zone_opt) ) {
//array( 'title' => string, 'id' => string )
foreach ( $_old_custom_zone_opt as $_zone ) {
if ( !isset($_zone['id']) )
continue;
$_zone_id = $_zone['id'];
//get the default location
$_locs = hu_get_old_locations($_zone_id, $__options);
$_contexts = hu_get_old_contexts($_zone_id, $__options);
$custom_zones[] = array(
'id' => $_zone['id'],
'title' => $_zone['title'],
'contexts' => $_contexts,
'locations' => $_locs,
);
}//foreach
}//if
//make sure the previous "rules" for sidebars and respected
$_new_sb_areas_opts = hu_clean_old_sidebar_options( array_merge( $builtin_zones, $custom_zones ), $__options );
$__options['sidebar-areas'] = $_new_sb_areas_opts;
return $__options;
}
function hu_get_old_locations( $_zone_id, $__options) {
$locations = array();
$_old_sd_options = array(
's1-home',
's2-home',
's1-single',
's2-single',
's1-archive',
's2-archive',
's1-archive-category',
's2-archive-category',
's1-search',
's2-search',
's1-404',
's2-404',
's1-page',
's2-page'
);
//the following zones are assigned to fixed locations
//primary, secondary, footer-*, header-ads, footer-ads could be assigned to s1 and s2 previously but they were always assigned in any cases to their respective default location
//user will be able to change this with the new options
//edge case : a user who had assigned the footer-1 to the s1 location on home will loose this setting
//=> the fix is to create a new zone, and select the home context + assign it to the s1 (right sidebar) location
$_fixed_locations = array(
's1' => 'primary',
's2' => 'secondary',
'header-ads' => 'header-ads',
'footer-ads' => 'footer-ads',
'footer-1' => 'footer-1',
'footer-2' => 'footer-2',
'footer-3' => 'footer-3',
'footer-4' => 'footer-4'
);
if ( in_array($_zone_id, $_fixed_locations) ) {
$locations[] = array_search($_zone_id, $_fixed_locations);
return $locations;
}
foreach ($_old_sd_options as $opt_name) {
//does the option exists ?
if( ! array_key_exists($opt_name, $__options) )
continue;
//if exists, grab its value
$value = $__options[$opt_name];
if ( $value != $_zone_id )
continue;
//we have a match, extract the location if not already there
$loc = substr($opt_name, 0, 2);
if ( ! in_array($loc, $locations) )
$locations[] = $loc;
}
return $locations;
}
function hu_get_old_contexts( $_zone_id, $__options) {
$contexts = array();
$_old_sd_options = array(
's1-home',
's2-home',
's1-single',
's2-single',
's1-archive',
's2-archive',
's1-archive-category',
's2-archive-category',
's1-search',
's2-search',
's1-404',
's2-404',
's1-page',
's2-page'
);
$_default_contexts = array();
//populates the map with the contexts
foreach ( hu_get_contexts_list() as $c => $title ) {
if ( '_all_' == $c )
continue;
$_default_contexts[] = $c;
}
//the following zones are assigned to fixed contexts
//user will be able to change this with the new options
//edge case : a user who had assigned the footer-1 to the s1 location on home will loose this setting
//=> the fix is to create a new zone, and select the home context + assign it to the s1 (right sidebar) location
$_fixed_contexts = array(
'primary',
'secondary',
'header-ads',
'footer-ads',
'footer-1',
'footer-2',
'footer-3',
'footer-4'
);
if ( in_array($_zone_id, $_fixed_contexts) ) {
$contexts = $_default_contexts;
return $contexts;
}
foreach ($_old_sd_options as $opt_name) {
//does the option exists ?
if( ! array_key_exists($opt_name, $__options) )
continue;
//if exists, grab its value
$value = $__options[$opt_name];
if ( $value != $_zone_id )
continue;
//we have a match, extract the context if not already there
$con = substr($opt_name, 3);
if ( ! in_array($con, $contexts) )
$contexts[] = $con;
}
return $contexts;
}
//SIDEBAR RULES FOR THE MIGRATIONS
//
//Locations s1 and s2, for a given context :
// 1) can only have one widget zone assigned
// 2) fallback on primary (for s1) and secondary (for s2) if no widget zone is assigned.
//
//Zones footer-*, header-ads, footer-ads, primary, secondary :
// 1) could be assigned to s1 and s2 in specific contexts
// 2) are now always assigned to their default locations in all contexts
function hu_clean_old_sidebar_options( $_new_sb_opts, $__options ) {
//for s1 and s2, create an array of context => array( 's1' => [ widget_zones ], 's2' => [widget_zones] );
//and for each one, determine who is the winner
$_old_sd_options = array(
's1-home',
's2-home',
's1-single',
's2-single',
's1-archive',
's2-archive',
's1-archive-category',
's2-archive-category',
's1-search',
's2-search',
's1-404',
's2-404',
's1-page',
's2-page'
);
$_default_zone_for_sidebars = array(
's1' => 'primary',
's2' => 'secondary'
);
$_forbidden_zones_for_sidebars = array(
'header-ads',
'footer-ads',
'footer-1',
'footer-2',
'footer-3',
'footer-4'
);
//make sure that s1 and s2 have only one widget zone for a given context
foreach ($_old_sd_options as $opt_name) {
//is the option defined ?
if( ! array_key_exists($opt_name, $__options) )
continue;
//get previous settings
$_loc = substr($opt_name, 0, 2);//is always s1 or s2
$_con = substr($opt_name, 3 );
$_user_zone_id = $__options[$opt_name];
//if no zone was assigned to this location-context, then continue
if ( empty($_user_zone_id ) || ! $_user_zone_id )
continue;
//is the zone different than the default one?
//if not, continue
if ( $_user_zone_id == $_default_zone_for_sidebars[$_loc] )
continue;
//if the zone belongs to the forbidden zones, then continue because this is not supported for the migration
//for example, the migration won't support a footer-1 assigned to s1
if ( in_array($_user_zone_id, $_forbidden_zones_for_sidebars) )
continue;
//loop on the new options and fix
//if a zone different than the default (primary or secondary) was assigned to s1 or s2 on a given context, then remove this context from its context list
$_zone_to_modify = $_default_zone_for_sidebars[$_loc];
foreach ($_new_sb_opts as $key => $data) {
//don't take any risk...
if ( !is_array($data) || !array_key_exists('id', $data) || !array_key_exists('locations', $data) || !array_key_exists('contexts', $data) )
continue;
if ( $_zone_to_modify != $data['id'] )
continue;
//remove the context from the list
$_key_to_remove = array_search($_con, $data['contexts']);
unset($_new_sb_opts[$key]['contexts'][$_key_to_remove]);
}//foreach
}//foreach
return $_new_sb_opts;
}
function hu_maybe_update_options() {
$_options = get_option( HU_THEME_OPTIONS );
$copy_option_tree = isset( $_GET['copy_option_tree'] );
//have the option already been copied ?
if ( isset($_options['has_been_copied']) && true === $_options['has_been_copied'] && ! $copy_option_tree )
return;
$_old_options = get_option( 'option_tree' );
$_old_options = ( false == $_old_options || empty($_old_options) ) ? array() : $_old_options;
//if not then grab the options from option tree and copy them into the new option raw
//Ensure compatibility for some options like sidebar-areas + s1*, s2*options
$_opt_to_copy = apply_filters('hu_implement_options_compat', $_old_options );
update_option(
HU_THEME_OPTIONS,
array_merge( $_opt_to_copy, array('has_been_copied' => true) )
);
}
//copy old options from option tree framework into new option raw 'hu_theme_options'
//only if user is logged in
if ( is_user_logged_in() )
hu_maybe_update_options();
/* ------------------------------------------------------------------------- *
* Load OptionTree framework
* Has to be loaded before after_setup_theme (important for plugin compatibility like ACF)
/* ------------------------------------------------------------------------- */
load_template( get_template_directory() . '/option-tree/ot-loader.php' );
/* ------------------------------------------------------------------------- *
* Load theme files
/* ------------------------------------------------------------------------- */
if ( ! function_exists( 'hu_load' ) ) {
function hu_load() {
// Load theme languages
load_theme_textdomain( 'hueman', get_stylesheet_directory().'/languages' );
// Load theme options and meta boxes
// load_template( get_template_directory() . '/functions/theme-options.php' );
load_template( get_template_directory() . '/functions/init-meta-boxes.php' );
// Load custom widgets
load_template( get_template_directory() . '/functions/widgets/alx-tabs.php' );
load_template( get_template_directory() . '/functions/widgets/alx-video.php' );
load_template( get_template_directory() . '/functions/widgets/alx-posts.php' );
// Load dynamic styles
load_template( get_template_directory() . '/functions/dynamic-styles.php' );
}
}
add_action( 'after_setup_theme', 'hu_load' );
/* ------------------------------------------------------------------------- *
* Base functionality
/* ------------------------------------------------------------------------- */
// Content width
if ( !isset( $content_width ) ) { $content_width = 720; }
/* Theme setup
/* ------------------------------------ */
if ( ! function_exists( 'hu_setup' ) ) {
function hu_setup() {
// Enable title tag
add_theme_support( 'title-tag' );
// Enable automatic feed links
add_theme_support( 'automatic-feed-links' );
// Enable featured image
add_theme_support( 'post-thumbnails' );
// Enable post format support
add_theme_support( 'post-formats', array( 'audio', 'aside', 'chat', 'gallery', 'image', 'link', 'quote', 'status', 'video' ) );
// Declare WooCommerce support
add_theme_support( 'woocommerce' );
// Thumbnail sizes
add_image_size( 'thumb-small', 160, 160, true );
add_image_size( 'thumb-standard', 320, 320, true );
add_image_size( 'thumb-medium', 520, 245, true );
add_image_size( 'thumb-large', 720, 340, true );
// Custom menu areas
register_nav_menus( array(
'topbar' => 'Topbar',
'header' => 'Header',
'footer' => 'Footer',
) );
}
}
add_action( 'after_setup_theme', 'hu_setup' );
/* Register sidebars
/* ------------------------------------ */
//@return the array of built-in widget zones
function hu_get_default_widget_zones() {
return array(
'primary' => array(
'name' => __( 'Primary', 'hueman' ),
'id' => 'primary',
'description' => __( "Full width widget zone. Located in the left sidebar in a 3 columns layout. Can be on the right of a 2 columns sidebar when content is on the left.", 'hueman'),
'before_widget' => '<div id="%1$s" class="widget %2$s">',
'after_widget' => '</div>',
'before_title' => '<h3>',
'after_title' => '</h3>',
),
'secondary' => array(
'name' => __( 'Secondary', 'hueman' ),
'id' => 'secondary',
'description' => __( "Full width widget zone. Located in the right sidebar in a 3 columns layout.", 'hueman'),
'before_widget' => '<div id="%1$s" class="widget %2$s">',
'after_widget' => '</div>',
'before_title' => '<h3>',
'after_title' => '</h3>'
),
'footer-1' => array(
'name' => __( 'Footer 1', 'hueman'),
'id' => 'footer-1',
'description' => __( "Widgetized footer 1", 'hueman'),
'before_widget' => '<div id="%1$s" class="widget %2$s">',
'after_widget' => '</div>',
'before_title' => '<h3>',
'after_title' => '</h3>'
),
'footer-2' => array(
'name' => __('Footer 2', 'hueman' ),
'id' => 'footer-2',
'description' => __("Widgetized footer 2", 'hueman' ),
'before_widget' => '<div id="%1$s" class="widget %2$s">',
'after_widget' => '</div>',
'before_title' => '<h3>',
'after_title' => '</h3>'
),
'footer-3' => array(
'name' => __('Footer 3', 'hueman' ),
'id' => 'footer-3',
'description' => __("Widgetized footer 3", 'hueman' ),
'before_widget' => '<div id="%1$s" class="widget %2$s">',
'after_widget' => '</div>',
'before_title' => '<h3>',
'after_title' => '</h3>'
),
'footer-4' => array(
'name' => __('Footer 4', 'hueman' ),
'id' => 'footer-4',
'description' => __("Widgetized footer 4", 'hueman' ),
'before_widget' => '<div id="%1$s" class="widget %2$s">',
'after_widget' => '</div>',
'before_title' => '<h3>','after_title' => '</h3>'
),
'header-ads' => array(
'name' => __( 'Header (next to logo / title)', 'hueman' ),
'id' => 'header-ads',
'description' => __( "The Header Widget Zone is located next to your logo or site title.", 'hueman'),
'before_widget' => '<div id="%1$s" class="widget %2$s">',
'after_widget' => '</div>',
'before_title' => '<h3>',
'after_title' => '</h3>'
),
'footer-ads' => array(
'name' => __('Footer Full Width', 'hueman'),
'id' => 'footer-ads',
'description' => __( "The Footer Widget Zone is located before the other footer widgets and takes 100% of the width. Very appropriate to display a Google Map or an advertisement banner.", 'hueman'),
'before_widget' => '<div id="%1$s" class="widget %2$s">',
'after_widget' => '</div>',
'before_title' => '<h3>',
'after_title' => '</h3>'
)
);
}
//@return the array describing the previous correspondance between location => widget zone name
function hu_get_widget_zone_rosetta_stone() {
return array(
's1' => 'primary',
's2' => 'secondary',
'header-ads' => 'header-ads',
'footer-ads' => 'footer-ads',
'footer-1' => 'footer-1',
'footer-2' => 'footer-2',
'footer-3' => 'footer-3',
'footer-4' => 'footer-4'
);
}
//helper
//@return array()
//used both on front end and in the customizer
function hu_get_contexts_list() {
return array(
'_all_' => __('All contexts', 'hueman'),
'home' => __('Home', 'hueman'),
'blog-page' => __('Blog Page', 'hueman'),
'page' => __('Pages', 'hueman'),
'single' => __('Single Posts', 'hueman'),
'archive' => __('Archives', 'hueman'),
'archive-category' => __('Categories', 'hueman'),
'search' => __('Search Results', 'hueman'),
'404' => __('404 Error Pages', 'hueman')
);
}
//the original mapping (s1 and s2) has to be kept since it is used in many places
//widget_zone_name => location, title
function hu_get_builtin_widget_zones_location() {
return array(
'primary' => array( 's1' => __('Primary Sidebar (on the left in a 3 columns layout)', 'hueman') ),
'secondary' => array( 's2' => __('Secondary Sidebar (on the right in a 3 columns layout)', 'hueman') ),
'footer-1' => array( 'footer-1' => __('Footer 1', 'hueman') ),
'footer-2' => array( 'footer-2' => __('Footer 2', 'hueman') ),
'footer-3' => array( 'footer-3' => __('Footer 3', 'hueman') ),
'footer-4' => array( 'footer-4' => __('Footer 4', 'hueman') ),
'header-ads' => array( 'header-ads' => __('Header (next to logo / title)', 'hueman') ),
'footer-ads' => array( 'footer-ads' => __('Footer Full Width', 'hueman') )
);
}
if ( ! function_exists( 'hu_maybe_register_builtin_widget_zones' ) ) :
function hu_maybe_register_builtin_widget_zones() {
$_map = hu_get_default_widget_zones();
//when customizing, widgets_init is too early.
//Therefore, we need to access the customized data from the post global.
$customized = array();
if ( hu_is_customizing() && isset($_POST['customized']) ) {
$_json = json_decode( wp_unslash( $_POST['customized'] ), true );
if ( ! empty( $_json ) )
$customized = $_json;
}
//Default conditions.
//Will apply on front-end and admin
$_has_header_ads = hu_is_checked('header-ads');
$_has_footer_ads = hu_is_checked('footer-ads');
$_footer_widgets = intval ( hu_get_option('footer-widgets') );
//When customizing, use the customized option
if ( isset($customized[ HU_THEME_OPTIONS . '[header-ads]']) ) {
$_has_header_ads = hu_booleanize_checkbox_val( $customized[HU_THEME_OPTIONS . '[header-ads]'] );
}
if ( isset($customized[HU_THEME_OPTIONS . '[footer-ads]']) ) {
$_has_footer_ads = hu_booleanize_checkbox_val( $customized[HU_THEME_OPTIONS . '[footer-ads]'] );
}
if ( isset($customized[HU_THEME_OPTIONS . '[footer-widgets]']) ) {
$_footer_widgets = intval ( $customized[HU_THEME_OPTIONS . '[footer-widgets]'] );
}
//right and left sidebar default widget zones
//They are always registered because on front end, they can depend on post_metas which are not accessible at this point ( 'widget_init' is too early )
register_sidebar( $_map['primary'] );
register_sidebar( $_map['secondary'] );
if ( $_has_header_ads )
register_sidebar( $_map['header-ads'] );
if ( $_has_footer_ads )
register_sidebar( $_map['footer-ads'] );
if ( $_footer_widgets >= 1 )
register_sidebar( $_map['footer-1'] );
if ( $_footer_widgets >= 2 )
register_sidebar( $_map['footer-2'] );
if ( $_footer_widgets >= 3 )
register_sidebar( $_map['footer-3'] );
if ( $_footer_widgets >= 4 )
register_sidebar( $_map['footer-4'] );
}
endif;
add_action( 'widgets_init', 'hu_maybe_register_builtin_widget_zones' );
//helper
//must be fired after 'wp' to have access to the $wp_query
//"real" because left and right sidebars are always registered
//@return array of locations
function hu_get_available_widget_loc() {
$_available = array();
$_footer_widgets = intval ( hu_get_option('footer-widgets') );
$layout = hu_layout_class();
if ( hu_is_checked('header-ads') )
$_available[] = 'header-ads';
if ( hu_is_checked('footer-ads') )
$_available[] = 'footer-ads';
if ( $_footer_widgets >= 1 )
$_available[] = 'footer-1';
if ( $_footer_widgets >= 2 )
$_available[] = 'footer-2';
if ( $_footer_widgets >= 3 )
$_available[] = 'footer-3';
if ( $_footer_widgets >= 4 )
$_available[] = 'footer-4';
//for left and right sidebar, it depends on the $layout class computed with options and post_metas
if ( $layout != 'col-1c' )
$_available[] = 's1';
if ( in_array( $layout, array('col-3cm', 'col-3cm', 'col-3cr' ) ) )
$_available[] = 's2';
return $_available;
}
/* Register custom sidebars
/* ------------------------------------ */
if ( ! function_exists( 'hu_maybe_register_custom_widget_zones' ) ) :
function hu_maybe_register_custom_widget_zones() {
$customized = array();
if ( hu_is_customizing() && isset($_POST['customized']) ) {
$customized = json_decode( wp_unslash( $_POST['customized'] ), true );
if ( isset($customized['hu_theme_options[sidebar-areas]']) )
$sidebars = $customized['hu_theme_options[sidebar-areas]'];
else
$sidebars = hu_get_option('sidebar-areas', array());
}
else {
$sidebars = hu_get_option('sidebar-areas', array());
}
//at this point we need smthg really clean
if ( ! is_array($sidebars) || empty( $sidebars ) )
return;
$default_args = array(
'name' => '',
'before_widget' => '<div id="%1$s" class="widget %2$s">',
'after_widget' => '</div>','before_title' => '<h3>','after_title' => '</h3>'
);
$default_zones = hu_get_default_widget_zones();
foreach( $sidebars as $sb ) {
if ( ! isset($sb['id']) || empty($sb['id']) )
return;
//is it a built-in one?
//=> in this case it's been registered another way
$_id = $sb['id'];
if ( isset( $default_zones[$_id]) )
continue;
$args = wp_parse_args(
array(
'name' => isset($sb['title']) ? ''. esc_attr( $sb['title'] ).'' : '',
'id' => ''. esc_attr( strtolower($sb['id']) ).''
),
$default_args
);
register_sidebar( $args );
}//for each
}
endif;
//add_action( hu_is_customize_preview_frame() ? 'customize_preview_init' : 'widgets_init' , 'hu_maybe_register_custom_widget_zones' );
add_action( 'widgets_init' , 'hu_maybe_register_custom_widget_zones' );
//add_action( 'customize_preview_init' , 'hu_maybe_register_custom_widget_zones' );
/* Add support for svg and svgz format in media upload
/* ------------------------------------ */
/**
* Returns the $mimes array with svg and svgz entries added
*
* @package Hueman
* @since Hueman 3.0.0
*/
function hu_custom_mtypes( $mimes ) {
if (! apply_filters( 'hu_add_svg_mime_type' , true ) )
return $mimes;
$mimes['svg'] = 'image/svg+xml';
$mimes['svgz'] = 'image/svg+xml';
return $mimes;
}
add_filter( 'upload_mimes' , 'hu_custom_mtypes' );
/* ------------------------------------------------------------------------- *
* Admin panel functions
/* ------------------------------------------------------------------------- */
/* Post formats script
/* ------------------------------------ */
if ( ! function_exists( 'hu_post_formats_script' ) ) {
function hu_post_formats_script( $hook ) {
// Only load on posts, pages
if ( !in_array($hook, array('post.php','post-new.php')) )
return;
wp_enqueue_script('post-formats', get_template_directory_uri() . '/assets/admin/js/post-formats.js', array( 'jquery' ));
}
}
add_action( 'admin_enqueue_scripts', 'hu_post_formats_script');
/* Add wmode transparent to media embeds
/* ------------------------------------ */
if ( ! function_exists( 'hu_embed_wmode_transparent' ) ) {
function hu_embed_wmode_transparent( $html, $url, $attr ) {
if ( strpos( $html, "<embed src=" ) !== false )
{ return str_replace('</param><embed', '</param><param name="wmode" value="opaque"></param><embed wmode="opaque" ', $html); }
elseif ( strpos ( $html, 'feature=oembed' ) !== false )
{ return str_replace( 'feature=oembed', 'feature=oembed&wmode=opaque', $html ); }
else
{ return $html; }
}
}
add_filter( 'embed_oembed_html', 'hu_embed_wmode_transparent', 10, 3 );
/* Add responsive container to embeds
/* ------------------------------------ */
if ( ! function_exists( 'hu_embed_html' ) ) {
function hu_embed_html( $html, $url ) {
$pattern = '/^https?:\/\/(www\.)?twitter\.com/';
$is_twitter = preg_match( $pattern, $url );
if ( 1 === $is_twitter ) {
return $html;
}
return '<div class="video-container">' . $html . '</div>';
}
}
add_filter( 'embed_oembed_html', 'hu_embed_html', 10, 3 );
/* Add responsive container to jetpack embeds
/* ------------------------------------ */
if ( ! function_exists( 'hu_embed_html_jp' ) ) {
function hu_embed_html_jp( $html ) {
return '<div class="video-container">' . $html . '</div>';
}
}
add_filter( 'video_embed_html', 'hu_embed_html_jp' );
/* Upscale cropped thumbnails
/* ------------------------------------ */
if ( ! function_exists( 'hu_thumbnail_upscale' ) ) {
function hu_thumbnail_upscale( $default, $orig_w, $orig_h, $new_w, $new_h, $crop ){
if ( !$crop ) return null; // let the wordpress default function handle this
$aspect_ratio = $orig_w / $orig_h;
$size_ratio = max($new_w / $orig_w, $new_h / $orig_h);
$crop_w = round($new_w / $size_ratio);
$crop_h = round($new_h / $size_ratio);
$s_x = floor( ($orig_w - $crop_w) / 2 );
$s_y = floor( ($orig_h - $crop_h) / 2 );
return array( 0, 0, (int) $s_x, (int) $s_y, (int) $new_w, (int) $new_h, (int) $crop_w, (int) $crop_h );
}
}
add_filter( 'image_resize_dimensions', 'hu_thumbnail_upscale', 10, 6 );
/* Add shortcode support to text widget
/* ------------------------------------ */
add_filter( 'widget_text', 'do_shortcode' );
/* ------------------------------------------------------------------------- *
* Loads and instanciates customizer related classes
/* ------------------------------------------------------------------------- */
if ( hu_is_customizing() ) {
load_template( get_template_directory() . '/functions/czr/class-czr-init.php' );
new HU_customize;
}
/* ------------------------------------------------------------------------- *
* Loads and instanciates admin pages related classes
/* ------------------------------------------------------------------------- */
if ( is_admin() && ! hu_is_customizing() ) {
//Update notice
load_template( get_template_directory() . '/functions/admin/class-admin-update-notification.php' );
new HU_admin_update_notification;
if ( hu_is_checked('about-page') ) {
load_template( get_template_directory() . '/functions/admin/class-admin-page.php' );
new HU_admin_page;
}
}
add_action( 'admin_init' , 'hu_admin_style' );
add_action( 'wp_before_admin_bar_render', 'hu_add_help_button' );
function hu_admin_style() {
wp_enqueue_style(
'hu-admincss',
sprintf('%1$sassets/admin/css/hu_admin.css' , HU_BASE_URL ),
array(),
HUEMAN_VER
);
}
function hu_add_help_button() {
if ( ! current_user_can( 'edit_theme_options' ) || ! hu_is_checked('help-button') || ! hu_is_checked('about-page') )
return;
global $wp_admin_bar;
$wp_admin_bar->add_menu( array(
'parent' => 'top-secondary', // Off on the right side
'id' => 'tc-hueman-help' ,
'title' => __( 'Help' , 'hueman' ),
'href' => admin_url( 'themes.php?page=welcome.php&help=true' ),
'meta' => array(
'title' => __( 'Need help with the Hueman theme ? Click here!', 'hueman' ),
),
));
}
/* ------------------------------------------------------------------------- *
* Loads Front End files
/* ------------------------------------------------------------------------- */
load_template( get_template_directory() . '/functions/init-front.php' );
/* Backward compatibility. Typically useful for users of child themes using old function names. */
if ( ! function_exists('alx_layout_class') ) {
function alx_layout_class() {
return hu_layout_class();
}
}
if ( ! function_exists('alx_social_links') ) {
function alx_social_links() {
return hu_print_social_links();
}
}
if ( ! function_exists('alx_site_title') ) {
function alx_site_title() {
return hu_site_title();
}
}
if ( ! function_exists('alx_blog_title') ) {
function alx_blog_title() {
return hu_blog_title();
}
}
if ( ! function_exists('alx_page_title') ) {
function alx_page_title() {
return hu_page_title();
}
}
if ( ! function_exists('alx_post_images') ) {
function alx_post_images() {
return hu_post_images();
}
}
if ( ! function_exists('alx_related_posts') ) {
function alx_related_posts() {
return hu_related_posts();
}
}
if ( ! function_exists('alx_sidebar_secondary') ) {
function alx_sidebar_secondary() {
return 'secondary';
}
}
if ( ! function_exists('alx_sidebar_primary') ) {
function alx_sidebar_primary() {
return 'primary';
}
}