plugin_constant = $plugin_constant; $this->plugin_url = $this->replace_if_ssl ( WP_PLUGIN_URL ) . '/' . $this->plugin_constant . '/'; $this->plugin_dir = WP_PLUGIN_DIR. '/' . $this->plugin_constant . '/'; $this->plugin_file = $this->plugin_constant . '/' . $this->plugin_constant . '.php'; $this->plugin_version = $plugin_version; $this->plugin_name = $plugin_name; $this->defaults = $defaults; $this->plugin_settings_page = $this->plugin_constant .'-settings'; $this->donation_link = $donation_link; $this->button_save = $this->plugin_constant . '-save'; $this->button_delete = $this->plugin_constant . '-delete'; $this->broadcast_message = self::broadcast_url . $this->plugin_constant . '.message'; $this->donation_business_name = 'PeterMolnar_WordPressPlugins_' . $this->plugin_constant . '_HU'; $this->donation_item_name = $this->plugin_name; /* we need network wide plugin check functions */ if ( ! function_exists( 'is_plugin_active_for_network' ) ) require_once( ABSPATH . 'wp-admin/includes/plugin.php' ); /* check if plugin is network-activated */ if ( @is_plugin_active_for_network ( $this->plugin_file ) ) { $this->network = true; $this->settings_slug = 'settings.php'; } else { $this->settings_slug = 'options-general.php'; } /* set the settings page link string */ $this->settings_link = $this->settings_slug . '?page=' . $this->plugin_settings_page; /* initialize plugin, plugin specific init functions */ $this->plugin_init(); /* get the options */ $this->plugin_options_read(); /* setup plugin, plugin specific setup functions that need options */ $this->plugin_setup(); add_action( 'admin_enqueue_scripts', array(&$this,'enqueue_admin_css_js')); register_activation_hook( $this->plugin_file , 'plugin_activate' ); register_deactivation_hook( $this->plugin_file , 'plugin_deactivate' ); register_uninstall_hook( $this->plugin_file , 'plugin_uninstall' ); /* register settings pages */ if ( $this->network ) add_filter( "network_admin_plugin_action_links_" . $this->plugin_file, array( $this, 'plugin_settings_link' ) ); else add_filter( "plugin_action_links_" . $this->plugin_file, array( $this, 'plugin_settings_link' ) ); /* register admin init, catches $_POST and adds submenu to admin menu */ if ( $this->network ) add_action('network_admin_menu', array( $this , 'plugin_admin_init') ); else add_action('admin_menu', array( $this , 'plugin_admin_init') ); } /** * activation hook function, to be extended */ abstract function plugin_activate(); /** * deactivation hook function, to be extended */ abstract function plugin_deactivate (); /** * uninstall hook function, to be extended */ abstract function plugin_uninstall(); /** * first init hook function, to be extended, before options were read */ abstract function plugin_init(); /** * second init hook function, to be extended, after options were read */ abstract function plugin_setup(); /** * admin panel, the HTML usually */ abstract function plugin_admin_panel(); /** * admin init called by WordPress add_action, needs to be public */ public function plugin_admin_init() { /* save parameter updates, if there are any */ if ( isset( $_POST[ $this->button_save ] ) ) { $this->plugin_options_save(); $this->status = 1; header( "Location: ". $this->settings_link . self::slug_save ); } /* delete parameters if requested */ if ( isset( $_POST[ $this->button_delete ] ) ) { $this->plugin_options_delete(); $this->status = 2; header( "Location: ". $this->settings_link . self::slug_delete ); } /* load additional moves */ $this->plugin_hook_admin_init(); /* get broadcast message, if available */ $this->broadcast_message = @file_get_contents( $this->broadcast_message ); /* add submenu to settings pages */ add_submenu_page( $this->settings_slug, $this->plugin_name . __( ' options' , $this->plugin_constant ), $this->plugin_name, $this->capability, $this->plugin_settings_page, array ( $this , 'plugin_admin_panel' ) ); } /** * to be extended * */ abstract function plugin_hook_admin_init(); /** * callback function to add settings link to plugins page * * @param array $links Current links to add ours to * */ public function plugin_settings_link ( $links ) { $settings_link = '' . __( 'Settings', $this->plugin_constant ) . ''; array_unshift( $links, $settings_link ); return $links; } /* add admin styling */ public function enqueue_admin_css_js(){ /* jquery ui tabs is provided by WordPress */ wp_enqueue_script ( "jquery-ui-tabs" ); wp_enqueue_script ( "jquery-ui-slider" ); /* additional admin styling */ $css_handle = $this->plugin_constant . '-admin-css'; $css_file = $this->plugin_constant . '-admin.css'; if ( @file_exists ( $this->plugin_dir . $css_file ) ) { $css_src = $this->plugin_url . $css_file; wp_register_style( $css_handle, $css_src, false, false, 'all' ); wp_enqueue_style( $css_handle ); } } /** * deletes saved options from database */ protected function plugin_options_delete () { /* get the currently saved options */ if ( $this->network ) delete_site_option( $this->plugin_constant ); else delete_option( $this->plugin_constant ); /* additional moves */ $this->plugin_hook_options_delete(); } /** * hook to add functionality into plugin_options_read */ abstract function plugin_hook_options_delete (); /** * reads options stored in database and reads merges them with default values */ protected function plugin_options_read () { /* get the currently saved options */ if ( $this->network ) $options = get_site_option( $this->plugin_constant ); else $options = get_option( $this->plugin_constant ); /* this is the point to make any migrations from previous versions */ $this->plugin_hook_options_migrate( $options ); /* map missing values from default */ foreach ( $this->defaults as $key => $default ) if ( !@array_key_exists ( $key, $options ) ) $options[$key] = $default; /* removed unused keys, rare, but possible */ foreach ( array_keys ( $options ) as $key ) if ( !@array_key_exists( $key, $this->defaults ) ) unset ( $options[$key] ); /* any additional read hook */ $this->plugin_hook_options_read( $options ); $this->options = $options; } /** * hook for parameter migration, runs right after options read from DB */ abstract function plugin_hook_options_migrate( &$options ); /** * hook to add functionality into plugin_options_read, runs after defaults check */ abstract function plugin_hook_options_read ( &$options ); /** * used on update and to save current options to database * * @param boolean $activating [optional] true on activation hook * */ protected function plugin_options_save ( $activating = false ) { /* only try to update defaults if it's not activation hook, $_POST is not empty and the post is ours */ if ( !$activating && !empty ( $_POST ) && isset( $_POST[ $this->button_save ] ) ) { /* we'll only update those that exist in the defaults array */ $options = $this->defaults; foreach ( $options as $key => $default ) { /* $_POST element is available */ if ( !empty( $_POST[$key] ) ) { $update = $_POST[$key]; /* get rid of slashes in strings, just in case */ if ( is_string ( $update ) ) $update = stripslashes($update); $options[$key] = $update; } /* empty $_POST element: when HTML form posted, empty checkboxes a 0 input values will not be part of the $_POST array, thus we need to check if this is the situation by checking the types of the elements, since a missing value means update from an integer to 0 */ elseif ( empty( $_POST[$key] ) && ( is_bool ( $default ) || is_int( $default ) ) ) { $options[$key] = 0; } } /* update the options array */ $this->options = $options; } /* set plugin version */ $this->options['version'] = $this->plugin_version; /* call hook function for additional moves before saving the values */ $this->plugin_hook_options_save( $activating ); /* save options to database */ if ( $this->network ) update_site_option( $this->plugin_constant , $this->options ); else update_option( $this->plugin_constant , $this->options ); } /** * hook to add functionality into plugin_options_save */ abstract function plugin_hook_options_save ( $activating ); /** * sends message to sysog * * @param string $message message to add besides basic info * @param int $log_level [optional] Level of log, info by default * */ protected function log ( $message, $log_level = LOG_INFO ) { if ( @is_array( $message ) || @is_object ( $message ) ) $message = serialize($message); if (! $this->config['log'] ) return false; switch ( $log_level ) { case LOG_ERR : if ( function_exists( 'syslog' ) ) syslog( $log_level , self::plugin_constant . $message ); /* error level is real problem, needs to be displayed on the admin panel */ throw new Exception ( $message ); break; default: if ( function_exists( 'syslog' ) && $this->config['debug'] ) syslog( $log_level , self::plugin_constant . $message ); break; } } /** * replaces http:// with https:// in an url if server is currently running on https * * @param string $url URL to check * * @return string URL with correct protocol * */ protected function replace_if_ssl ( $url ) { if ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) $_SERVER['HTTPS'] = 'on'; if ( isset($_SERVER['HTTPS']) && (( strtolower($_SERVER['HTTPS']) == 'on' ) || ( $_SERVER['HTTPS'] == '1' ) )) $url = str_replace ( 'http://' , 'https://' , $url ); return $url; } /** * function to easily print a variable * * @param mixed $var Variable to dump * @param boolean $ret Return text instead of printing if true * */ protected function print_var ( $var , $ret = false ) { if ( @is_array ( $var ) || @is_object( $var ) || @is_bool( $var ) ) $var = var_export ( $var, true ); if ( $ret ) return $var; else echo $var; } /** * print value of an element from defaults array * * @param mixed $e Element index of $this->defaults array * */ protected function print_default ( $e ) { _e('Default : ', $this->plugin_constant); $select = 'select_' . $e; if ( @is_array ( $this->$select ) ) { $x = $this->$select; $this->print_var ( $x[ $this->defaults[ $e ] ] ); } else { $this->print_var ( $this->defaults[ $e ] ); } } /** * select options field processor * * @param elements * array to build $name ) { //$disabled .= ( @array_key_exists( $valid[ $value ] ) && $valid[ $value ] == false ) ? ' disabled="disabled"' : ''; $opt .= '