register_sidebars();
$this->register_dynamic_sidebars();
}
/**
* Register Sidebars
*/
public function register_sidebars(){
global $wp_customize , $temp_sidebars;
// Loop the Builder Pages and create their sidebars
foreach( layers_get_builder_pages() as $page){
$this->register_builder_sidebar( $page->ID, $page->post_title );
}
}
/**
* Register Builder Sidebar Function
*/
public static function register_builder_sidebar( $post_id = 0, $post_title = '' ) {
register_sidebar( array(
'id' => 'obox-layers-builder-' . $post_id,
'name' => $post_title . __( ' Body' , 'layerswp' ),
'before_widget' => '
',
'after_widget' => '
',
'before_title' => '',
'after_title' => '
',
) );
}
/**
* Get Dynamic Widget Areas
*/
public function get_dynamic_sidebars(){
// Set the widget ID to search for
$dynamic_widget_id = 'layers-widget-sidebar';
// Get registered sidebars
$sidebars = get_option( 'sidebars_widgets');
// Make sure side bars & widgets option is not empty
if( empty( $sidebars ) ) return;
// Get the Dynamic Sidebar Widgets in use
$dynamic_widget_areas = get_option( 'widget_' . $dynamic_widget_id );
// If there are no sidebars to register, return;
if( empty( $dynamic_widget_areas ) ) return;
$dynamic_sidebars = array();
// Loop over the Dynamic Sidebar Widgets
foreach ( $dynamic_widget_areas as $widget_key => $widget_area ){
// Check if this widget is inside an inactive sidebar (in which case skip)
if( !in_array( $dynamic_widget_id . '-' . $widget_key , $sidebars[ 'wp_inactive_widgets'] ) ) {
if( isset( $widget_area['sidebars'] ) ){
foreach ( $widget_area['sidebars'] as $sidebar_key => $sidebar ){
$sidebar_id = $dynamic_widget_id .'-' . $widget_key . '-' . $sidebar_key;
$dynamic_sidebars[] = array(
'id' => $sidebar_id,
'title' => $sidebar[ 'title' ]
);
} // foreach $widget_area['modules']
} // if isset $widget_area['modules']
} // if !in_array( $dynamic_widget_id )
} // foreach $dynamic_widget_areas
return $dynamic_sidebars;
}
/**
* Create Dynamic Widget Areas
*/
public function register_dynamic_sidebars(){
$dynamic_sidebars = $this->get_dynamic_sidebars();
if( empty( $dynamic_sidebars ) ) return;
foreach( $dynamic_sidebars as $dynamic_sidebar ){
register_sidebar( array(
'id' => $dynamic_sidebar[ 'id' ],
'name' => $dynamic_sidebar[ 'title' ],
'description' => __( 'Layers Builder section.' , 'layerswp' ),
'before_widget' => '',
'before_title' => '',
) );
}
}
/**
* Clear page widgets (when deleting a post, to keep a clean db)
*/
public function clear_page_widgets( $post_id ){
$layers_sidebar_key = 'obox-layers-builder-' . $post_id;
if( class_exists( 'Layers_Widget_Migrator' ) ) {
$migrator = new Layers_Widget_Migrator();
$migrator->clear_page_sidebars_widget( $layers_sidebar_key );
}
}
public function add_revision_fields( $fields ) {
global $current_screen;
if( !( is_object( $current_screen) && 'revision' == $current_screen->base && !isset( $_GET[ 'action' ] ) ) ) {
$fields['post_content_filtered'] = __( 'Raw Page Data', 'layerswp' );
}
$new_fields = array();
foreach( $fields as $f_key => $f_value ){
if( $f_key == 'post_content' ){
$new_fields['_layers_widget_order'] = __( 'Widget Order', 'layerswp' );
}
$new_fields[ $f_key ] = $f_value;
}
return $new_fields;
}
/**
* Add widget order meta field
*/
public function add_widget_order_field( $value, $field ) {
global $revision;
if( is_object( $revision ) )
return get_metadata( 'post', $revision->ID, '_layers_widget_order', true );
}
/**
* Add special revision meta fields when updating pages through Page > Edit
*/
function save_revision_fields_on_save( $post_id, $post ) {
$parent_id = wp_is_post_revision( $post_id );
if ( $parent_id ) {
$parent = get_post( $parent_id );
if( class_exists( 'Layers_Widget_Migrator' ) ) {
$migrator = new Layers_Widget_Migrator();
$export_data = $migrator->page_widget_data( $parent );
if ( false !== $export_data )
add_metadata( 'post', $post_id, '_layers_widget_order', $migrator->page_widgets_as_content( $export_data ) );
}
}
}
/**
* Restore a Backup from the Layers Widget Revisions
*/
public function restore_backup( $post_id, $revision_id){
$post = get_post( $post_id, OBJECT );
if( 'page' == $post->post_type && LAYERS_BUILDER_TEMPLATE !== get_post_meta( $post_id, '_wp_page_template', true ) ) return;
// Get the revision information
$revision = get_post( $revision_id, OBJECT );
$layers_migrator = new Layers_Widget_Migrator();
$widget_data = $revision->post_content_filtered;
if( is_wp_error( unserialize( $widget_data ) ) ) return;
// Check for errors.
if ( '' == $widget_data || is_wp_error( unserialize( $widget_data ) ) ) return;
$widget_data_array = unserialize( $widget_data );
// Check if our data is empty.
if ( empty( $widget_data_array ) ) return;
$import = $layers_migrator->import( unserialize( $widget_data ), TRUE, TRUE );
// Update widget order on the post
$widget_order = get_metadata( 'post', $revision_id, '_layers_widget_order', true );
$latest_revisions = wp_get_post_revisions( $post_id, array( 'post_type' => 'page' ) );
$latest_revision = reset( $latest_revisions );
if ( false !== $widget_order ) {
add_metadata( 'post', $latest_revision->ID, '_layers_widget_order', $widget_order );
update_post_meta( $post_id, '_layers_widget_order', $widget_order );
}
}
public function check_for_revisions(){
global $wp_customize;
if( get_option( 'layers_init_revisions' ) ) return;
// Get a list of the migrator
$get_layers_pages = layers_get_builder_pages( 500 );
if( empty( $get_layers_pages ) ) return;
$revisions_exist = FALSE;
// Loop through the builder pages spooling up the widget data each time
foreach( $get_layers_pages as $page ){
if( '' !== get_post_meta( $page->ID, '_layers_hash', true ) ) {
$revisions_exist = TRUE;
}
}
if( ! $revisions_exist ) {
add_filter( '_wp_post_revision_fields', array( $this, 'add_revision_fields' ) );
layers_backup_sidebars_widgets( TRUE );
add_option( 'layers_init_revisions', TRUE );
}
}
/**
* Enqueue Widget Scripts
*/
public function admin_enqueue_scripts(){
// Banner Widget
wp_register_script(
LAYERS_THEME_SLUG . '-admin-slider-widget' ,
get_template_directory_uri() . '/core/widgets/js/slider.js' ,
array(),
LAYERS_VERSION,
true
);
wp_localize_script( LAYERS_THEME_SLUG . '-admin-slider-widget' , 'sliderwidgeti18n', array(
'confirm_message' => __( 'Are you sure you want to remove this slide?' , 'layerswp' )
) );
// Content Widget
wp_register_script(
LAYERS_THEME_SLUG . '-admin-content-widget' ,
get_template_directory_uri() . '/core/widgets/js/content.js' ,
array(),
LAYERS_VERSION,
true
);
wp_localize_script( LAYERS_THEME_SLUG . '-admin-content-widget' , 'contentwidgeti18n', array(
'confirm_message' => __( 'Are you sure you want to remove this column?' , 'layerswp' )
) );
// Repeatable Widget
wp_register_script(
LAYERS_THEME_SLUG . '-admin-repeater-widget' ,
get_template_directory_uri() . '/core/widgets/js/repeater.js' ,
array(),
LAYERS_VERSION,
true
);
wp_localize_script( LAYERS_THEME_SLUG . '-admin-repeater-widget' , 'repeateri18n', array(
'confirm_message' => __( 'Are you sure you want to remove this column?' , 'layerswp' ),
'duplicate_text' => __( 'Duplicate' , 'layerswp' ),
'edit_text' => __( 'Edit' , 'layerswp' ),
) );
wp_enqueue_script( LAYERS_THEME_SLUG . '-admin-repeater-widget' );
// Widget accordians
wp_enqueue_script(
LAYERS_THEME_SLUG . '-admin-widgets' ,
get_template_directory_uri() . '/core/widgets/js/widget-accordians.js' ,
array(
LAYERS_THEME_SLUG . '-admin-slider-widget',
LAYERS_THEME_SLUG . '-admin-content-widget',
'backbone',
'jquery',
'wp-color-picker',
'media-upload'
),
LAYERS_VERSION,
true
);
// Localize Scripts
wp_localize_script(
LAYERS_THEME_SLUG . '-admin-widgets' ,
'layers_widget_params',
array(
'nonce' => wp_create_nonce( 'layers-widget-actions' ),
)
);
}
/**
* Enqueue Widget Styles
*/
public function admin_print_styles(){
// Color Picker styles
wp_enqueue_style( 'wp-color-picker' );
}
}
/**
* Kicking this off with the 'widgets_init' hook
*/
function layers_widgets_init(){
global $layers_widgets;
$layers_widgets = new Layers_Widgets();
$layers_widgets->init();
}
add_action( 'widgets_init' , 'layers_widgets_init' , 20 );
if( !function_exists( 'layers_backup_sidebars_widgets' ) ) {
function layers_backup_sidebars_widgets( $no_revisions = FALSE ){
global $sidebars_widgets;
// Get a list of the migrator
$get_layers_pages = layers_get_builder_pages( 500 );
// Loop through the builder pages spooling up the widget data each time
$revisions = array();
foreach( $get_layers_pages as $page ){
$revisions[] = layers_backup_page_sidebars_widgets( $page );
}
}
}
add_action( 'layers_backup_sidebars_widgets', 'layers_backup_sidebars_widgets' );
if( !function_exists( 'layers_backup_page_sidebars_widgets' ) ) {
function layers_backup_page_sidebars_widgets( $page = NULL, $no_revisions = FALSE ){
// If the migrator class does not exist, then force load the migrator.php file
if( !class_exists( 'Layers_Widget_Migrator' ) ) {
require get_template_directory() . '/core/helpers/migrator.php';
}
// Prep the migrator
$migrator = new Layers_Widget_Migrator();
if( NULL == $page || !is_object( $page ) ) return;
$raw_export_data = $migrator->export_data( $page );
$export_data = $migrator->page_widget_data( $page );
if( !empty( $export_data ) ){
// Create a hash key so that we can know if this page is unique or not
if( '' == get_post_meta( $page->ID, '_layers_hash', true ) ){
$page_hash_key = 'layers_page_' . md5( $page->post_name . '-' . $page->ID );
update_post_meta( $page->ID, '_layers_hash', $page_hash_key, false );
} else {
$page_hash_key = get_post_meta( $page->ID, '_layers_hash', true );
}
// Save the raw widget data
$page_raw_widget_data = array(
'post_id' => $page->ID,
'post_hash' => $page_hash_key,
'post_title' => esc_attr( $page->post_title ),
'widget_data' => $raw_export_data
);
// Generate the post content
$post = (array) $page;
$post[ 'post_content_filtered' ] = serialize( $page_raw_widget_data );
$post[ 'post_content' ] = layers_get_builder_page_content( $page->ID );
// Update the backup post & get the revision ID
$post_id = wp_update_post( $post );
$revisions = wp_get_post_revisions( $page->ID, array( 'posts_per_page' => 1 ) );
$latest_revision = reset( $revisions );
// Add widget order field
update_post_meta( $page->ID, '_layers_widget_order', $migrator->page_widgets_as_content( $export_data ), true );
add_metadata( 'post', $latest_revision->ID, '_layers_widget_order', $migrator->page_widgets_as_content( $export_data ), true );
$return = array(
'post_id' => $post_id,
'revision_id' => $latest_revision->ID
);
return $return;
}
}
}
function layers_check_for_preset_backup(){
global $wp_customize;
if( $wp_customize ){
if( get_option( 'layers_cron_page_backup' ) ){
$page_id = get_option( 'layers_cron_page_backup' );
$page = get_post( $page_id );
if( NULL == $page ) return;
layers_backup_page_sidebars_widgets( $page );
delete_option( 'layers_cron_page_backup' );
}
}
}
add_action( 'init', 'layers_check_for_preset_backup' );