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;
add_action( 'init', array(&$this,'init'));
add_action( 'admin_enqueue_scripts', array(&$this,'enqueue_admin_css_js'));
}
/**
* 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();
public function init(){
/* 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();
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') );
}
/**
* 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' ) && function_exists ( 'openlog' ) ) {
openlog('wordpress('.$_SERVER['HTTP_HOST'].')',LOG_NDELAY|LOG_PID,LOG_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' ) && function_exists ( 'openlog' ) && $this->config['debug'] ) {
openlog('wordpress('.$_SERVER['HTTP_HOST'].')',LOG_NDELAY|LOG_PID,LOG_SYSLOG);
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 .= '