__( 'Page Builder', 'ultra' ),
'buttons' => array(
'install' => __('Install', 'ultra'),
'cancel' => __('Cancel', 'ultra'),
),
'message' => __( "Refresh this page after you've installed Page Builder.", 'ultra' ),
'contentUrl' => admin_url('admin-ajax.php?action=panels_lite_install_content'),
'installUrl' => $install_url
) );
wp_enqueue_style( 'siteorigin-panels-lite-teaser', get_template_directory_uri() . '/inc/panels-lite/css/post-teaser.css', array(), SITEORIGIN_PANELS_LITE_VERSION );
}
}
}
add_action('admin_enqueue_scripts', 'siteorigin_panels_lite_enqueue_admin');
/**
* The admin action for displaying content
*/
function siteorigin_panels_lite_install_content(){
if( !current_user_can( 'install_plugins' ) ) exit();
get_template_part('inc/panels-lite/tpl/install');
exit();
}
add_action('wp_ajax_panels_lite_install_content', 'siteorigin_panels_lite_install_content');
/**
* Get a setting value
*
* @param bool $key
* @return mixed|null|void
*/
function siteorigin_panels_lite_setting($key = false){
$settings = get_theme_support('siteorigin-panels');
if(!empty($settings)) $settings = $settings[0];
else $settings = array();
$settings = wp_parse_args( $settings, array(
'home-page' => false, // Is the home page supported
'home-page-default' => false, // What's the default prebuilt layout for the home page?
'home-template' => 'home-panels.php', // The file used to render a home page.
'home-demo-template' => false, // The file used to render the home page demo.
'post-types' => get_option('siteorigin_panels_post_types', array('page', 'post') ), // Post types that can be edited.
'bundled-widgets' => !isset( $display_settings['bundled-widgets'] ) ? true : $display_settings['bundled-widgets'], // Include bundled widgets.
'responsive' => !isset( $display_settings['responsive'] ) ? true : $display_settings['responsive'], // Should we use a responsive layout
'mobile-width' => !isset( $display_settings['mobile-width'] ) ? 780 : $display_settings['mobile-width'], // What is considered a mobile width?
'margin-bottom' => !isset( $display_settings['margin-bottom'] ) ? 30 : $display_settings['margin-bottom'], // Bottom margin of a cell
'margin-sides' => !isset( $display_settings['margin-sides'] ) ? 30 : $display_settings['margin-sides'], // Spacing between 2 cells
'affiliate-id' => false, // Set your affiliate ID
'copy-content' => !isset( $display_settings['copy-content'] ) ? true : $display_settings['copy-content'], // Should we copy across content
'animations' => !isset( $display_settings['animations'] ) ? true : $display_settings['animations'], // Do we need animations
'inline-css' => !isset( $display_settings['inline-css'] ) ? true : $display_settings['inline-css'], // How to display CSS
) );
// Filter these settings
$settings = apply_filters('siteorigin_panels_settings', $settings);
if( empty( $settings['post-types'] ) ) $settings['post-types'] = array();
if( !empty( $key ) ) return isset( $settings[$key] ) ? $settings[$key] : null;
return $settings;
}
/**
* Modify the front page template
*
* @param $template
* @return string
*/
function siteorigin_panels_lite_filter_home_template($template){
// The user has already selected their own page as the home template
if ( get_option( 'show_on_front' ) !== 'posts' ) return $template;
// Do we even support the home template
if ( !get_theme_mod('siteorigin_panels_home_page_enabled', siteorigin_panels_lite_setting('home-page-default') ) ) return $template;
if ( !siteorigin_panels_lite_setting('home-page-default') || !siteorigin_panels_lite_setting('home-demo-template') ) return $template;
return locate_template( array(
siteorigin_panels_lite_setting( 'home-demo-template' ),
$template
) );
}
add_filter('home_template', 'siteorigin_panels_lite_filter_home_template');
/**
* @return mixed|void Are we currently viewing the home page
*/
function siteorigin_panels_lite_is_home(){
$home = ( is_home() && get_theme_mod('siteorigin_panels_home_page_enabled', siteorigin_panels_lite_setting('home-page-default') ) && !is_page() && siteorigin_panels_lite_setting( 'home-page-default' ) );
return apply_filters('siteorigin_panels_is_home', $home);
}
/**
* Enqueue the required styles
*/
function siteorigin_panels_lite_enqueue_styles(){
if( siteorigin_panels_lite_is_home() ){
wp_enqueue_style( 'siteorigin-panels-lite-front', get_template_directory_uri() . '/inc/panels-lite/css/front.css', array(), SITEORIGIN_PANELS_LITE_VERSION );
// Render this here so we can enqueue all the scripts we need early.
global $siteorigin_panels_cache;
if( empty($siteorigin_panels_cache[ get_the_ID() ] ) ) {
$siteorigin_panels_cache[ 'home' ] = siteorigin_panels_lite_home_render( );
}
}
}
add_action('wp_enqueue_scripts', 'siteorigin_panels_lite_enqueue_styles');
/**
* Set the home body class when we're displaying a panels page.
*
* @param $classes
* @return array
*/
function siteorigin_panels_lite_body_class($classes){
if( siteorigin_panels_lite_is_home() ) {
$classes[] = 'siteorigin-panels';
$classes[] = 'siteorigin-panels-home';
}
return $classes;
}
add_filter('body_class', 'siteorigin_panels_lite_body_class');
/**
* Render the widget.
*
* @param string $widget The widget class name.
* @param array $instance The widget instance
* @param $grid
* @param $cell
* @param $panel
* @param $is_first
* @param $is_last
*/
function siteorigin_panels_lite_the_widget( $widget, $instance, $grid, $cell, $panel, $is_first, $is_last ) {
global $wp_widget_factory;
// Load the widget from the widget factory and give themes and plugins a chance to provide their own
$the_widget = !empty($wp_widget_factory->widgets[$widget]) ? $wp_widget_factory->widgets[$widget] : false;
$the_widget = apply_filters( 'siteorigin_panels_widget_object', $the_widget, $widget, $instance );
if( empty($post_id) ) $post_id = get_the_ID();
$classes = apply_filters( 'siteorigin_panels_widget_classes', array( 'panel', 'widget' ), $widget, $instance);
if ( !empty( $the_widget ) && !empty( $the_widget->id_base ) ) $classes[] = 'widget_' . $the_widget->id_base;
if ( $is_first ) $classes[] = 'panel-first-child';
if ( $is_last ) $classes[] = 'panel-last-child';
$id = 'panel-' . $post_id . '-' . $grid . '-' . $cell . '-' . $panel;
// Filter and sanitize the classes
$classes = apply_filters('siteorigin_panels_widget_classes', $classes, $widget, $instance);
$classes = array_map('sanitize_html_class', $classes);
$args = array(
'before_widget' => '
',
'after_widget' => '
',
'before_title' => '',
'widget_id' => 'widget-' . $grid . '-' . $cell . '-' . $panel
);
// If there is a style wrapper, add it.
if( !empty($style_wrapper) ) {
$args['before_widget'] = $args['before_widget'] . $style_wrapper;
$args['after_widget'] = '' . $args['after_widget'];
}
$widget_code = '';
if ( !empty($the_widget) && is_a($the_widget, 'WP_Widget') ) {
ob_start();
$the_widget->widget($args , $instance );
$widget_code = ob_get_clean();
}
else {
// This gives themes a chance to display some sort of placeholder for missing widgets
$widget_code = apply_filters('siteorigin_panels_missing_widget', $args['before_widget'] . $args['after_widget'], $widget, $args , $instance);
}
// This is a special filter to create demo content
echo apply_filters('siteorigin_panels_lite_widget', $widget_code, $widget, $args , $instance);
}
/**
* Echo the CSS for the current panel
*
* @param array $panels_data
*/
function siteorigin_panels_lite_generate_css($post_id, $panels_data) {
// Exit if we don't have panels data
if ( empty( $panels_data ) || empty( $panels_data['grids'] ) ) return;
// Get some of the default settings
$settings = siteorigin_panels_lite_setting();
$panels_mobile_width = $settings['mobile-width'];
$panels_margin_bottom = $settings['margin-bottom'];
$css = new SiteOrigin_Panels_Lite_Css_Builder();
$ci = 0;
foreach ( $panels_data['grids'] as $gi => $grid ) {
$cell_count = intval( $grid['cells'] );
// Add the cell sizing
for ( $i = 0; $i < $cell_count; $i++ ) {
$cell = $panels_data['grid_cells'][$ci++];
if ( $cell_count > 1 ) {
$width = round( $cell['weight'] * 100, 3 ) . '%';
$width = apply_filters('siteorigin_panels_css_cell_width', $width, $grid, $gi, $cell, $ci - 1, $panels_data, $post_id);
// Add the width and ensure we have correct formatting for CSS.
$css->add_cell_css($post_id, $gi, $i, '', array(
'width' => str_replace(',', '.', $width)
));
}
}
// Add the bottom margin to any grids that aren't the last
if($gi != count($panels_data['grids'])-1){
// Filter the bottom margin for this row with the arguments
$css->add_row_css($post_id, $gi, '', array(
'margin-bottom' => apply_filters('siteorigin_panels_css_row_margin_bottom', $panels_margin_bottom.'px', $grid, $gi, $panels_data, $post_id)
));
}
if ( $cell_count > 1 ) {
$css->add_cell_css($post_id, $gi, false, '', array(
// Float right for RTL
'float' => !is_rtl() ? 'left' : 'right'
));
}
if ( $settings['responsive'] ) {
// Mobile Responsive
$css->add_cell_css($post_id, $gi, false, '', array(
'float' => 'none',
'width' => 'auto'
), $panels_mobile_width);
for ( $i = 0; $i < $cell_count; $i++ ) {
if ( $i != $cell_count - 1 ) {
$css->add_cell_css($post_id, $gi, $i, '', array(
'margin-bottom' => $panels_margin_bottom . 'px',
), $panels_mobile_width);
}
}
}
}
if( $settings['responsive'] ) {
// Add CSS to prevent overflow on mobile resolution.
$css->add_row_css($post_id, false, '', array(
'margin-left' => 0,
'margin-right' => 0,
), $panels_mobile_width);
$css->add_cell_css($post_id, false, false, '', array(
'padding' => 0,
), $panels_mobile_width);
}
// Add the bottom margins
$css->add_cell_css($post_id, false, false, '.panel', array(
'margin-bottom' => $panels_margin_bottom.'px'
));
$css->add_cell_css($post_id, false, false, '.panel:last-child', array(
'margin-bottom' => 0
));
// Let other plugins customize various aspects of the rows (grids)
foreach ( $panels_data['grids'] as $gi => $grid ) {
// Rows with only one cell don't need gutters
if($grid['cells'] <= 1) continue;
// Let other themes and plugins change the gutter.
$gutter = apply_filters('siteorigin_panels_css_row_gutter', $settings['margin-sides'].'px', $grid, $gi, $panels_data);
if( !empty($gutter) ) {
// We actually need to find half the gutter.
preg_match('/([0-9\.,]+)(.*)/', $gutter, $match);
if( !empty( $match[1] ) ) {
$margin_half = (floatval($match[1])/2) . $match[2];
$css->add_row_css($post_id, $gi, '', array(
'margin-left' => '-' . $margin_half,
'margin-right' => '-' . $margin_half,
) );
$css->add_cell_css($post_id, $gi, false, '', array(
'padding-left' => $margin_half,
'padding-right' => $margin_half,
) );
}
}
}
// Let other plugins and components filter the CSS object.
$css = apply_filters('siteorigin_panels_css_object', $css, $panels_data, $post_id);
return $css->get_css();
}
/**
*
*/
function siteorigin_panels_lite_css(){
if( !siteorigin_panels_lite_is_home() ) return;
$layouts = apply_filters( 'siteorigin_panels_prebuilt_layouts', array() );
if(empty($layouts[ siteorigin_panels_lite_setting('home-page-default') ])) return;
$panels_data = $layouts[siteorigin_panels_lite_setting('home-page-default')];
$panels_data = apply_filters( 'siteorigin_panels_data', $panels_data, 'home' );
?> $grid ) {
$gi = intval( $gi );
$grids[$gi] = array();
for ( $i = 0; $i < $grid['cells']; $i++ ) {
$grids[$gi][$i] = array();
}
}
}
// We need this to migrate from the old $panels_data that put widget meta into the "info" key instead of "panels_info"
if( !empty( $panels_data['widgets'] ) && is_array($panels_data['widgets']) ) {
foreach ( $panels_data['widgets'] as $i => $widget ) {
if( empty( $panels_data['widgets'][$i]['panels_info'] ) ) {
$panels_data['widgets'][$i]['panels_info'] = $panels_data['widgets'][$i]['info'];
unset($panels_data['widgets'][$i]['info']);
}
}
}
if( !empty( $panels_data['widgets'] ) && is_array($panels_data['widgets']) ){
foreach ( $panels_data['widgets'] as $widget ) {
// Put the widgets in the grids
$grids[ intval( $widget['panels_info']['grid']) ][ intval( $widget['panels_info']['cell'] ) ][] = $widget;
}
}
ob_start();
if( current_user_can('edit_theme_options') ) {
$install_url = siteorigin_panels_lite_plugin_activation_install_url();
$home = get_theme_mod( 'siteorigin_panels_home_page_enabled', siteorigin_panels_lite_setting('home-page-default') );
$toggle_url = add_query_arg('redirect', add_query_arg(false, false), wp_nonce_url(admin_url('admin-ajax.php?action=panels_lite_toggle&panels_new='.($home ? 0 : 1)), 'toggle_panels_home') );
?>
Install Page Builder to edit this default home page.', 'ultra'),
$install_url,
admin_url('themes.php?page=so_panels_home_page')
); ?>
Disable this page if you'd prefer to have a standard blog home.", 'ultra'), $toggle_url ) ?>
';
global $siteorigin_panels_inline_css;
if( empty($siteorigin_panels_inline_css) ) $siteorigin_panels_inline_css = '';
echo apply_filters( 'siteorigin_panels_before_content', '', $panels_data, $post_id );
foreach ( $grids as $gi => $cells ) {
$grid_classes = apply_filters( 'siteorigin_panels_row_classes', array('panel-grid'), $panels_data['grids'][$gi] );
$grid_attributes = apply_filters( 'siteorigin_panels_row_attributes', array(
'class' => implode( ' ', $grid_classes ),
'id' => 'pg-' . $post_id . '-' . $gi
), $panels_data['grids'][$gi] );
// This allows other themes and plugins to add html before the row
echo apply_filters( 'siteorigin_panels_before_row', '', $panels_data['grids'][$gi], $grid_attributes );
echo ' $value ) {
echo $name.'="'.esc_attr($value).'" ';
}
echo '>';
$style_attributes = array();
if( !empty( $panels_data['grids'][$gi]['style']['class'] ) ) {
$style_attributes['class'] = array('panel-row-style-'.$panels_data['grids'][$gi]['style']['class']);
}
// Themes can add their own attributes to the style wrapper
$row_style_wrapper = siteorigin_panels_lite_start_style_wrapper( 'row', $style_attributes, !empty($panels_data['grids'][$gi]['style']) ? $panels_data['grids'][$gi]['style'] : array() );
if( !empty($row_style_wrapper) ) echo $row_style_wrapper;
foreach ( $cells as $ci => $widgets ) {
// Themes can add their own styles to cells
$cell_classes = apply_filters( 'siteorigin_panels_row_cell_classes', array('panel-grid-cell'), $panels_data );
$cell_attributes = apply_filters( 'siteorigin_panels_row_cell_attributes', array(
'class' => implode( ' ', $cell_classes ),
'id' => 'pgc-' . $post_id . '-' . $gi . '-' . $ci
), $panels_data );
echo '
$value ) {
echo $name.'="'.esc_attr($value).'" ';
}
echo '>';
$cell_style_wrapper = siteorigin_panels_lite_start_style_wrapper( 'cell', array(), !empty($panels_data['grids'][$gi]['style']) ? $panels_data['grids'][$gi]['style'] : array() );
if( !empty($cell_style_wrapper) ) echo $cell_style_wrapper;
foreach ( $widgets as $pi => $widget_info ) {
$instance = $widget_info;
unset( $instance['panels_info'] );
// TODO this wrapper should go in the before/after widget arguments
$widget_style_wrapper = siteorigin_panels_lite_start_style_wrapper( 'widget', array(), !empty( $widget_info['panels_info']['style'] ) ? $widget_info['panels_info']['style'] : array() );
siteorigin_panels_lite_the_widget( $widget_info['panels_info']['class'], $instance, $gi, $ci, $pi, $pi == 0, $pi == count( $widgets ) - 1, $post_id, $widget_style_wrapper );
}
if ( empty( $widgets ) ) echo ' ';
if( !empty($cell_style_wrapper) ) echo '
';
echo '
';
}
echo '';
// Close the
if( !empty($row_style_wrapper) ) echo '';
// This allows other themes and plugins to add html after the row
echo apply_filters( 'siteorigin_panels_after_row', '', $panels_data['grids'][$gi], $grid_attributes );
}
echo apply_filters( 'siteorigin_panels_after_content', '', $panels_data, $post_id );
echo '';
$html = ob_get_clean();
// Reset the current post
$siteorigin_panels_current_post = $old_current_post;
return apply_filters( 'siteorigin_panels_render', $html, $post_id, !empty($post) ? $post : null );
}
/**
* Echo the style wrapper and return if there was a wrapper
*
* @param $name
* @param $style_attributes
* @param array $style_args
*
* @return bool Is there a style wrapper
*/
function siteorigin_panels_lite_start_style_wrapper($name, $style_attributes, $style_args = array()){
$style_wrapper = '';
if( empty($style_attributes['class']) ) $style_attributes['class'] = array();
if( empty($style_attributes['style']) ) $style_attributes['style'] = '';
$style_attributes = apply_filters('siteorigin_panels_' . $name . '_style_attributes', $style_attributes, $style_args );
if( empty($style_attributes['class']) ) unset($style_attributes['class']);
if( empty($style_attributes['style']) ) unset($style_attributes['style']);
if( !empty($style_attributes) ) {
if(empty($style_attributes['class'])) $style_attributes['class'] = array();
$style_attributes['class'][] = 'panel-' . $name . '-style';
$style_attributes['class'] = array_unique( $style_attributes['class'] );
// Filter and sanitize the classes
$style_attributes['class'] = apply_filters('siteorigin_panels_' . $name . '_style_classes', $style_attributes['class'], $style_attributes, $style_args);
$style_attributes['class'] = array_map('sanitize_html_class', $style_attributes['class']);
$style_wrapper = ' $value ) {
if( is_array($value) ) {
$style_wrapper .= $name.'="'.esc_attr( implode( " ", array_unique( $value ) ) ).'" ';
}
else {
$style_wrapper .= $name.'="'.esc_attr($value).'" ';
}
}
$style_wrapper .= '>';
return $style_wrapper;
}
return $style_wrapper;
}