EVOLUTION-MANAGER
Edit File: class-woo-sidebars.php
<?php if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly /** * WooSidebars Base Class * * All functionality pertaining to core functionality of the WooSidebars plugin. * * @package WordPress * @subpackage WooSidebars * @author WooThemes * @since 1.0.0 * * TABLE OF CONTENTS * * public $version * private $file * public $upper_limit * * private $token * private $prefix * public $conditions * * private $plugin_url * private $assets_url * * - __construct() * - init() * - register_post_type_columns() * - register_post_type() * - register_custom_columns() * - register_custom_column_headings() * - meta_box_setup() * - meta_box_content() * - meta_box_save() * - description_meta_box() * - enter_title_here() * - update_messages() * - get_registered_sidebars() * - register_custom_sidebars() * - init_sidebar_replacement() * - replace_sidebars() * - find_best_sidebars() * - enqueue_styles() * - add_post_column_headings() * - add_post_column_data() * - enable_custom_post_sidebars() * - multidimensional_search() * * - load_localisation() * - activation() * - register_plugin_version() */ class Woo_Sidebars { public $version; private $file; public $upper_limit; private $token; private $prefix; public $conditions; private $plugin_url; private $assets_url; /** * __construct function. * * @access public * @return void */ public function __construct ( $file ) { $this->version = ''; $this->file = $file; $this->upper_limit = intval( apply_filters( 'woosidebars_upper_limit', 200 ) ); $this->token = 'sidebar'; $this->prefix = 'woo_sidebar_'; /* Plugin URL/path settings. */ $this->plugin_url = str_replace( '/classes', '', plugins_url( plugin_basename( dirname( __FILE__ ) ) ) ); $this->assets_url = $this->plugin_url . '/assets'; $this->conditions = new Woo_Conditions(); $this->conditions->token = $this->token; } // End __construct() /** * init function. * * @access public * @return void */ public function init () { add_action( 'init', array( $this, 'load_localisation' ) ); add_action( 'init', array( $this, 'register_post_type' ), 20 ); add_action( 'admin_menu', array( $this, 'meta_box_setup' ), 20 ); add_action( 'save_post', array( $this, 'meta_box_save' ) ); add_filter( 'enter_title_here', array( $this, 'enter_title_here' ) ); add_filter( 'post_updated_messages', array( $this, 'update_messages' ) ); add_action( 'widgets_init', array( $this, 'register_custom_sidebars' ) ); add_action( 'get_header', array( $this, 'init_sidebar_replacement' ) ); if ( is_admin() ) { global $pagenow; add_action( 'admin_print_styles', array( $this, 'enqueue_styles' ), 12 ); if ( $pagenow == 'edit.php' && isset( $_GET['post_type'] ) && esc_attr( $_GET['post_type'] ) == $this->token ) { add_filter( 'manage_edit-' . $this->token . '_columns', array( $this, 'register_custom_column_headings' ), 10, 1 ); add_action( 'manage_posts_custom_column', array( $this, 'register_custom_columns' ), 10, 2 ); } } // By default, add post type support for sidebars to the "post" post type. add_post_type_support( 'post', 'woosidebars' ); add_action( 'admin_head', array( $this, 'register_post_type_columns' ) ); add_action( 'wp_ajax_woosidebars-post-enable', array( $this, 'enable_custom_post_sidebars' ) ); // Run this on activation. register_activation_hook( $this->file, array( $this, 'activation' ) ); } // End init() /** * register_post_type_columns function. * * @access public * @return void */ public function register_post_type_columns () { $post_type = get_post_type(); if ( $post_type != '' && post_type_supports( $post_type, 'woosidebars' ) ) { add_filter( 'manage_edit-' . $post_type . '_columns', array( $this, 'add_post_column_headings' ), 10, 1 ); add_action( 'manage_posts_custom_column', array( $this, 'add_post_column_data' ), 10, 2 ); add_action( 'manage_pages_custom_column', array( $this, 'add_post_column_data' ), 10, 2 ); } } // End register_post_type_columns() /** * register_post_type function. * * @access public * @return void */ public function register_post_type () { // Allow only users who can adjust the theme to view the WooSidebars admin. if ( ! current_user_can( 'edit_theme_options' ) ) return; $page = 'themes.php'; $singular = __( 'Widget Area', 'woosidebars' ); $plural = __( 'Widget Areas', 'woosidebars' ); $rewrite = array( 'slug' => 'sidebars' ); $supports = array( 'title', 'excerpt' ); if ( $rewrite == '' ) { $rewrite = $this->token; } $labels = array( 'name' => _x( 'Widget Areas', 'post type general name', 'woosidebars' ), 'singular_name' => _x( 'Widget Area', 'post type singular name', 'woosidebars' ), 'add_new' => _x( 'Add New', 'Widget Area' ), 'add_new_item' => sprintf( __( 'Add New %s', 'woosidebars' ), $singular ), 'edit_item' => sprintf( __( 'Edit %s', 'woosidebars' ), $singular ), 'new_item' => sprintf( __( 'New %s', 'woosidebars' ), $singular ), 'all_items' => sprintf( __( 'Widget Areas', 'woosidebars' ), $plural ), 'view_item' => sprintf( __( 'View %s', 'woosidebars' ), $singular ), 'search_items' => sprintf( __( 'Search %s', 'woosidebars' ), $plural ), 'not_found' => sprintf( __( 'No %s Found', 'woosidebars' ), $plural ), 'not_found_in_trash' => sprintf( __( 'No %s Found In Trash', 'woosidebars' ), $plural ), 'parent_item_colon' => '', 'menu_name' => $plural ); $args = array( 'labels' => $labels, 'public' => false, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_nav_menus' => false, 'show_in_admin_bar' => false, 'show_in_menu' => $page, 'query_var' => true, 'rewrite' => $rewrite, 'capability_type' => 'post', 'has_archive' => 'sidebars', 'hierarchical' => false, 'menu_position' => null, 'supports' => $supports ); register_post_type( $this->token, $args ); } // End register_post_type() /** * register_custom_columns function. * * @access public * @param string $column_name * @param int $id * @return void */ public function register_custom_columns ( $column_name, $id ) { global $wpdb, $post; $meta = get_post_custom( $id ); $sidebars = $this->get_registered_sidebars(); $this->conditions->setup_default_conditions_reference(); switch ( $column_name ) { case 'sidebar_to_replace': $value = ''; if ( isset( $meta['_sidebar_to_replace'] ) && ( $meta['_sidebar_to_replace'][0] != '' ) ) { $value = $meta['_sidebar_to_replace'][0]; if ( isset( $sidebars[$value] ) ) { $value = $sidebars[$value]['name']; } else { $value .= '<br /><strong>' . __( '(Not in use by current theme)', 'woosidebars' ) . '</strong>'; } } echo $value; break; case 'condition': $value = ''; if ( isset( $meta['_condition'] ) && ( $meta['_condition'][0] != '' ) ) { foreach ( $meta['_condition'] as $k => $v ) { $value .= $this->multidimensional_search( $v, $this->conditions->conditions_reference ) . '<br />' . "\n"; } } echo $value; break; default: break; } } // End register_custom_columns() /** * register_custom_column_headings function. * * @access public * @param array $defaults * @return void */ public function register_custom_column_headings ( $defaults ) { $this->conditions->setup_default_conditions_reference(); $new_columns = array( 'sidebar_to_replace' => __( 'Sidebar To Replace', 'woosidebars' ), 'condition' => __( 'Condition(s)', 'woosidebars' ) ); $last_item = ''; if ( isset( $defaults['date'] ) ) { unset( $defaults['date'] ); } if ( count( $defaults ) > 2 ) { $last_item = array_slice( $defaults, -1 ); array_pop( $defaults ); } $defaults = array_merge( $defaults, $new_columns ); if ( $last_item != '' ) { foreach ( $last_item as $k => $v ) { $defaults[$k] = $v; break; } } return $defaults; } // End register_custom_column_headings() /** * meta_box_setup function. * * @access public * @return void */ public function meta_box_setup () { add_meta_box( 'sidebar-to-replace', __( 'Sidebar To Replace', 'woosidebars' ), array( $this, 'meta_box_content' ), $this->token, 'side', 'low' ); // Remove "Custom Settings" meta box. remove_meta_box( 'woothemes-settings', 'sidebar', 'normal' ); // Customise the "Excerpt" meta box for the sidebars. remove_meta_box( 'postexcerpt', $this->token, 'normal' ); add_meta_box( 'sidebar-description', __( 'Description', 'woosidebars' ), array( $this, 'description_meta_box' ), $this->token, 'normal', 'core' ); } // End meta_box_setup() /** * meta_box_content function. * * @access public * @return void */ public function meta_box_content () { global $post_id; $sidebars = $this->get_registered_sidebars(); $selected_sidebar = get_post_meta( $post_id, '_sidebar_to_replace', true ); $html = ''; $html .= '<input type="hidden" name="woo_' . $this->token . '_noonce" id="woo_' . $this->token . '_noonce" value="' . wp_create_nonce( plugin_basename(__FILE__) ) . '" />'; if ( count( $sidebars ) > 0 ) { $html .= '<select name="sidebar_to_replace" class="widefat">' . "\n"; foreach ( $sidebars as $k => $v ) { $html .= '<option value="' . $v['id'] . '"' . selected( $selected_sidebar, $v['id'], false ) . '>' . $v['name'] . '</option>' . "\n"; } $html .= '</select>' . "\n"; } else { $html .= '<p>' . __( 'No sidebars are available with this theme.', 'woosidebars' ) . '</p>'; } echo $html; } // End meta_box_content() /** * meta_box_save function. * * @access public * @param int $post_id * @return void */ public function meta_box_save ( $post_id ) { global $post, $messages; // Verify if ( ( get_post_type() != $this->token ) || ! wp_verify_nonce( $_POST['woo_' . $this->token . '_noonce'], plugin_basename( __FILE__ ) ) ) { return $post_id; } if ( 'page' == $_POST['post_type'] ) { if ( ! current_user_can( 'edit_page', $post_id ) ) { return $post_id; } } else { if ( ! current_user_can( 'edit_post', $post_id ) ) { return $post_id; } } $fields = array( 'sidebar_to_replace' ); foreach ( $fields as $f ) { ${$f} = strip_tags(trim($_POST[$f])); if ( get_post_meta( $post_id, '_' . $f ) == '' ) { add_post_meta( $post_id, '_' . $f, ${$f}, true ); } elseif( ${$f} != get_post_meta( $post_id, '_' . $f, true ) ) { update_post_meta( $post_id, '_' . $f, ${$f} ); } elseif ( ${$f} == '' ) { delete_post_meta( $post_id, '_' . $f, get_post_meta( $post_id, '_' . $f, true ) ); } } } // End meta_box_save() /** * description_meta_box function. * * @param object $post */ public function description_meta_box ( $post ) { ?> <label class="screen-reader-text" for="excerpt"><?php _e( 'Description', 'woosidebars' ); ?></label><textarea rows="1" cols="40" name="excerpt" tabindex="6" id="excerpt"><?php echo $post->post_excerpt; // textarea_escaped ?></textarea> <p><?php printf( __( 'Add an optional description, to be displayed when adding widgets to this widget area on the %sWidgets%s screen.', 'woosidebars' ), '<a href="' . esc_url( admin_url( 'widgets.php' ) ) . '">', '</a>' ); ?></p> <?php } // End description_meta_box() /** * enter_title_here function. * * @access public * @param string $title * @return void */ public function enter_title_here ( $title ) { if ( get_post_type() == $this->token ) { $title = __( 'Enter widget area name here', 'woosidebars' ); } return $title; } // End enter_title_here() /** * update_messages function. * * @access public * @param array $messages * @return void */ public function update_messages ( $messages ) { if ( get_post_type() != $this->token ) { return $messages; } $messages[$this->token][1] = __( 'Widget Area updated.', 'woosidebars' ); return $messages; } // End update_messages() /** * get_registered_sidebars function. * * @access public * @return void */ public function get_registered_sidebars () { global $wp_registered_sidebars; $sidebars = array(); $to_ignore = array(); $custom_sidebars = get_posts( array( 'post_type' => 'sidebar', 'numberposts' => intval( $this->upper_limit ), 'suppress_filters' => 'false' ) ); if ( ! is_wp_error( $custom_sidebars ) && count( $custom_sidebars ) > 0 ) { foreach ( $custom_sidebars as $k => $v ) { $to_ignore[] = $v->post_name; } } if ( is_array( $wp_registered_sidebars ) && ( count( $wp_registered_sidebars ) > 0 ) ) { foreach ( $wp_registered_sidebars as $k => $v ) { if ( ! stristr( $v['id'], $this->prefix ) && ! stristr( $v['id'], 'woo_sbm_' ) && ! in_array( $v['id'], $to_ignore ) ) { $sidebars[$k] = $v; } } } return $sidebars; } // End get_registered_sidebars() /** * register_custom_sidebars function. * * @access public * @return void */ public function register_custom_sidebars () { $sidebars = get_posts( array( 'post_type' => 'sidebar', 'posts_per_page' => intval( $this->upper_limit ), 'suppress_filters' => 'false' ) ); if ( count( $sidebars ) > 0 ) { foreach ( $sidebars as $k => $v ) { $args = apply_filters( 'woosidebars_sidebar_args', array( 'name' => $v->post_title, 'id' => $v->post_name, 'description' => $v->post_excerpt, ), $v, $this ); register_sidebar( $args ); } } } // End register_custom_sidebars() /** * init_sidebar_replacement function. * * @access public * @return void */ public function init_sidebar_replacement () { add_filter( 'sidebars_widgets', array( $this, 'replace_sidebars' ) ); } // End init_sidebar_replacement() /** * replace_sidebars function. * * @access public * @param array $sidebars_widgets * @return void */ public function replace_sidebars ( $sidebars_widgets ) { if ( is_admin() ) { return $sidebars_widgets; } // Determine the conditions to construct the query. $conditions = $this->conditions->conditions; if ( ! isset( $this->conditions->conditions ) || count( $this->conditions->conditions ) <= 0 ) { return $sidebars_widgets; } global $woo_custom_sidebar_data; if ( ! isset( $woo_custom_sidebar_data ) ) { $conditions_str = join( ', ', $conditions ); $args = array( 'post_type' => $this->token, 'posts_per_page' => intval( $this->upper_limit ), 'suppress_filters' => true ); $meta_query = array( 'key' => '_sidebar_to_replace', 'compare' => '!=', 'value' => '' ); $args['meta_query'][] = $meta_query; $meta_query = array( 'key' => '_condition', 'compare' => 'IN', 'value' => $conditions ); $args['meta_query'][] = $meta_query; $sidebars = get_posts( $args ); if ( count( $sidebars ) > 0 ) { foreach ( $sidebars as $k => $v ) { if ( defined( 'ICL_LANGUAGE_CODE' ) ) { // get the post language $wpml_element = apply_filters( 'wpml_element_language_code', ICL_LANGUAGE_CODE, array( 'element_id' => intval( $v->ID ), 'element_type' => 'post_sidebar' ) ); // check if the current language matches the language of the sidebar if ( $wpml_element != ICL_LANGUAGE_CODE ) { continue; } } $to_replace = get_post_meta( $v->ID, '_sidebar_to_replace', true ); $sidebars[$k]->to_replace = $to_replace; $conditions = get_post_meta( $v->ID, '_condition', false ); $sidebars[$k]->conditions = array(); // Remove any irrelevant conditions from the array. if ( is_array( $conditions ) ) { foreach ( $conditions as $i => $j ) { if ( in_array( $j, $this->conditions->conditions ) ) { $sidebars[$k]->conditions[] = $j; } } } } } $woo_custom_sidebar_data = $sidebars; } // Make sure only the most appropriate sidebars are kept. // $woo_custom_sidebar_data = $this->remove_unwanted_sidebars( $woo_custom_sidebar_data ); $woo_custom_sidebar_data = $this->find_best_sidebars( $woo_custom_sidebar_data ); if ( count( $woo_custom_sidebar_data ) > 0 ) { foreach ( $woo_custom_sidebar_data as $k => $v ) { $sidebar_id = $v->post_name; // $sidebar_id = $this->prefix . $v->ID; if ( isset( $sidebars_widgets[$sidebar_id] ) && isset( $v->to_replace ) && $v->to_replace != '' ) { $widgets = $sidebars_widgets[$sidebar_id]; unset( $sidebars_widgets[$sidebar_id] ); $sidebars_widgets[$v->to_replace] = $widgets; } } } return $sidebars_widgets; } // End replace_sidebars() /** * find_best_sidebars function. * * @access public * @param array $sidebars * @return array $sorted_sidebars */ public function find_best_sidebars ( $sidebars ) { $sorted_sidebars = array(); if ( ! isset( $this->conditions->conditions ) || count( $this->conditions->conditions ) <= 0 ) { return $sidebars; } // Keep track of each sidebar we'd like to replace widgets for. foreach ( $sidebars as $k => $v ) { if ( isset( $v->to_replace ) && ( $v->to_replace != '' ) && ! isset( $sorted_sidebars[$v->to_replace] ) ) { $sorted_sidebars[$v->to_replace] = ''; } } foreach ( $sidebars as $k => $v ) { if ( isset( $sorted_sidebars[$v->to_replace] ) && ( $sorted_sidebars[$v->to_replace] == '' ) ) { $sorted_sidebars[$v->to_replace] = $v; } else { continue; } } return $sorted_sidebars; } // End find_best_sidebars() /** * enqueue_styles function. * * @access public * @return void */ public function enqueue_styles () { global $pagenow; if ( in_array( $pagenow, array( 'edit.php', 'post.php', 'post-new.php' ) ) ) { if ( get_post_type() != $this->token ) { return; } wp_enqueue_style( 'jquery-ui-tabs' ); wp_register_style( $this->token . '-admin', $this->assets_url . '/css/admin.css', array(), '1.0.0' ); wp_enqueue_style( $this->token . '-admin' ); wp_dequeue_style( 'jquery-ui-datepicker' ); if ( class_exists( 'WPSEO_Metabox' ) ) { // Dequeue unused WordPress SEO CSS files. wp_dequeue_style( 'edit-page' ); wp_dequeue_style( 'metabox-tabs' ); $color = get_user_meta( get_current_user_id(), 'admin_color', true ); if ( '' == $color ) $color = 'fresh'; wp_dequeue_style( 'metabox-' . $color ); } } if ( in_array( $pagenow, array( 'edit.php' ) ) ) { wp_register_style( $this->token . '-admin-posts', $this->assets_url . '/css/admin-posts.css', array(), '1.0.0' ); wp_enqueue_style( $this->token . '-admin-posts' ); } } // End enqueue_styles() /** * add_post_column_headings function. * * @access public * @param array $defaults * @return array $new_columns */ public function add_post_column_headings ( $defaults ) { $defaults['woosidebars_enable'] = __( 'Custom Sidebars', 'woosidebars' ); return $defaults; } // End add_post_column_headings() /** * add_post_column_data function. * * @access public * @param string $column_name * @param int $id * @return void */ public function add_post_column_data ( $column_name, $id ) { global $wpdb, $post; $meta = get_post_custom( $id ); switch ( $column_name ) { case 'woosidebars_enable': $image = 'success-off'; $value = ''; $class = 'custom-sidebars-disabled'; if ( isset( $meta['_enable_sidebar'] ) && ( $meta['_enable_sidebar'][0] != '' ) && ( $meta['_enable_sidebar'][0] == 'yes' ) ) { $image = 'success'; $class = 'custom-sidebars-enabled'; } $url = wp_nonce_url( admin_url( 'admin-ajax.php?action=woosidebars-post-enable&post_id=' . $post->ID ), 'woosidebars-post-enable' ); $value = '<span class="' . esc_attr( $class ) . '"><a href="' . esc_url( $url ) . '"><img src="' . esc_url( $this->assets_url . '/images/' . $image . '.png' ) . '" /></a></span>'; echo $value; break; default: break; } } // End add_post_column_data() /** * enable_custom_post_sidebars function. * * @access public * @return void */ public function enable_custom_post_sidebars () { if( ! is_admin() ) die; if( ! current_user_can( 'edit_posts' ) ) wp_die( __( 'You do not have sufficient permissions to access this page.', 'woosidebars' ) ); if( ! check_admin_referer( 'woosidebars-post-enable' ) ) wp_die( __( 'You have taken too long. Please go back and retry.', 'woosidebars' ) ); $post_id = isset( $_GET['post_id'] ) && (int)$_GET['post_id'] ? (int)$_GET['post_id'] : ''; if( ! $post_id ) die; $post = get_post( $post_id ); if( ! $post ) die; $meta = get_post_meta( $post->ID, '_enable_sidebar', true ); if ( $meta == 'yes' ) { update_post_meta($post->ID, '_enable_sidebar', 'no' ); } else { update_post_meta($post->ID, '_enable_sidebar', 'yes' ); } $sendback = remove_query_arg( array( 'trashed', 'untrashed', 'deleted', 'ids' ), wp_get_referer() ); wp_safe_redirect( esc_url( $sendback ) ); } // End enable_custom_post_sidebars() /** * multidimensional_search function. * * @access public * @param string $needle * @param array $haystack * @return string $m */ public function multidimensional_search ( $needle, $haystack ) { if (empty( $needle ) || empty( $haystack ) ) { return false; } foreach ( $haystack as $key => $value ) { $exists = 0; foreach ( (array)$needle as $nkey => $nvalue) { if ( ! empty( $value[$nvalue] ) && is_array( $value[$nvalue] ) ) { return $value[$nvalue]['label']; } } } return false; } // End multidimensional_search() /** * load_localisation function. * * @access public * @since 1.0.0 * @return void */ public function load_localisation () { $lang_dir = trailingslashit( str_replace( 'classes', 'lang', plugin_basename( dirname(__FILE__) ) ) ); load_plugin_textdomain( 'woosidebars', false, $lang_dir ); } // End load_localisation() /** * activation function. * * @access public * @since 1.0.0 * @return void */ public function activation () { $this->register_plugin_version(); } // End activation() /** * register_plugin_version function. * * @access public * @since 1.0.0 * @return void */ public function register_plugin_version () { if ( $this->version != '' ) { update_option( 'woosidebars' . '-version', $this->version ); } } // End register_plugin_version() } // End Class ?>