prefix; $table_name = $wpdb->prefix . 'acf_Feeders'; $base_path = '/'.get_option('access-code-feeder-base-url','feeder').'/'; if( strpos($_SERVER["REQUEST_URI"],$base_path) === 0 ) { //our url header("X-Robots-Tag: noindex, nofollow", true); $s_url = str_replace($base_path,'',$_SERVER["REQUEST_URI"]); $r_url = trim($s_url,'/'); //remove last slash if present $url_params = explode('/',$r_url); $feeder_key = $url_params[0]; $sql_rows = $wpdb->prepare("SELECT `id`,`key`,`wp_owner_id`,`content`,`options` FROM $table_name WHERE `key` = %s ",array($feeder_key)); $rows = $wpdb->get_results($sql_rows); if($rows === FALSE){wp_die('Database Error on Feeder Fetch');} if(!isset($rows[0])){die('');} //key is not in the DB - simulate empty feeder $row = $rows[0]; $id = $row->id; $content = $row->content; $wp_owner_id = $row->wp_owner_id; $a_options = json_decode($row->options,true); $a_codes = explode(PHP_EOL,$content); $count_codes = count($a_codes); if($a_codes[0] == ''){ //explode on empty string still returns array $count_codes = 0; } if(count($url_params) === 1){ if($count_codes > 0){ if($a_options['feeder_mode'] == 'TR'){ if( ($count_codes - 1) == ($a_options['feeder_limit']) ){ //to prevent triggering on 0 several times $this->notify_feeder_owner_on_low_count($wp_owner_id,$a_options['feeder_name'],$a_options['feeder_location'],$a_options['feeder_limit']); } $top_item = array_shift($a_codes); echo(stripslashes($top_item)); $content = implode(PHP_EOL,$a_codes); }//TR if($a_options['feeder_mode'] == 'RR'){ $rand_key = array_rand($a_codes, 1); $rand_item = $a_codes[$rand_key]; if( ($count_codes - 1) == ($a_options['feeder_limit']) ){ //to prevent triggering on 0 several times $this->notify_feeder_owner_on_low_count($wp_owner_id,$a_options['feeder_name'],$a_options['feeder_location'],$a_options['feeder_limit']); } unset( $a_codes[$rand_key]); echo(stripslashes($rand_item)); $content = implode(PHP_EOL,$a_codes); }//RR if($a_options['feeder_mode'] == 'RK'){ $rand_key = array_rand($a_codes, 1); $rand_item = $a_codes[$rand_key]; echo(stripslashes($rand_item)); $content = implode(PHP_EOL,$a_codes); }//RR $sql_update = $wpdb->prepare("UPDATE $table_name SET `content` = %s WHERE `id` = %d",array($content,$id)); if($wpdb->query($sql_update) === FALSE){wp_die('Database Error updating Feeder' );} }else{ echo(""); //no items left } exit(); }else{//url has extra parts if($url_params [1] == 'COUNT'){ if(strlen($a_codes[0]) > 0){ echo($count_codes); }else{ echo('0'); } exit(); } } exit(); //we always exit here }//our URL }//serve_feeder function add_settings_link( $links ) { $img = ''; $settings_link = '' . $img . __( 'Settings' ) . ''; array_unshift($links , $settings_link); return $links; }//add_settings_link() function notify_feeder_owner_on_low_count($wp_owner_id,$feeder_name,$feeder_edit_url,$feeder_limit){ $user_info = get_userdata($wp_owner_id); $current_locale = get_locale(); //gotta switch back after email is sent $feeder_owner_locale = get_user_locale($wp_owner_id); //gotta send email in language of bond owner switch_to_locale($feeder_owner_locale); $user_name = $user_info->display_name; $user_email = $user_info->user_email; $site_title = get_bloginfo('name'); $site_email = get_bloginfo('admin_email'); $site_description = get_bloginfo('description'); $site_url = get_bloginfo('url'); $email_text = __(" Hello %%USERNAME%%
Feeder '%%FEEDERNAME%%' now has %%CODECOUNT%% access codes left.
You've received this email because the Feeder is configured to notify the owner on low content count.

Have a nice day!
%%SITENAME%% ", 'access-code-feeder' ); $email_text = str_replace('%%USERNAME%%',$user_name,$email_text); $email_text = str_replace('%%FEEDERNAME%%',$feeder_name,$email_text); $email_text = str_replace('%%CODECOUNT%%',$feeder_limit,$email_text); $email_text = str_replace('%%CONFIGURL%%',$feeder_edit_url,$email_text); $email_text = str_replace('%%SITENAME%%',$site_description,$email_text); $email_text = str_replace('%%SITEURL%%',$site_url,$email_text); $email_subject = __("Feeder '%%FEEDERNAME%%' requires attention !", 'access-code-feeder' ); $email_subject = str_replace('%%FEEDERNAME%%',$feeder_name,$email_subject); $headers = array( 'content-type: text/html', //must have ); add_filter( 'wp_mail_from_name', array( $this, 'email_replace_name_from' )); wp_mail( $user_email, $email_subject, $email_text , $headers ); remove_filter( 'wp_mail_from_name', array( $this, 'email_replace_name_from' )); switch_to_locale($current_locale); //return to normal }//notify_feeder_owner_on_low_count function email_replace_name_from($from_name){ return get_bloginfo('name'); //replace "WordPress" to site name. Headers do not work for some servers } function init() { load_plugin_textdomain( 'access-code-feeder', FALSE, basename( dirname( __FILE__ ) ) . '/languages' ); } function load_plugin_textdomain(){ // load_plugin_textdomain( 'access-code-feeder', FALSE, basename( dirname( __FILE__ ) ) . '/languages' ); } function prepare_db_tables(){ global $wpdb; $db_prefix = $wpdb->prefix; $charset_collate = $wpdb->get_charset_collate(); $create_table_feeders_sql = "CREATE TABLE IF NOT EXISTS `".$db_prefix."acf_Feeders` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `wp_owner_id` INT(11) unsigned NOT NULL, `key` VARCHAR(100) NOT NULL DEFAULT 1, `options` VARCHAR(4096) NOT NULL DEFAULT '', `content` MEDIUMTEXT NOT NULL DEFAULT '', `created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `feeder_key` (`key`) )"; $wpdb->show_errors(); if($wpdb->query($create_table_feeders_sql) === FALSE){wp_die();} }//prepare_db_tables function admin_init() { register_setting( 'Access_Code_Feeder_Options', 'access-code-feeder-base-url' ); $this->prepare_db_tables(); } function admin_menu() { add_options_page( __( 'Access Code Feeder', 'access-code-feeder' ), __( 'Access Code Feeder', 'access-code-feeder' ), 'manage_options', 'access-code-feeder', array( $this, 'render_options' ) ); } public function enqueue_scripts_and_styles(){ wp_enqueue_style('messagebox-css', plugin_dir_url(__FILE__) . 'assets/messagebox.css'); wp_enqueue_script( 'messagebox-js', plugin_dir_url(__FILE__) . 'assets/messagebox.js'); wp_enqueue_style('access-code-feeder-css', plugin_dir_url(__FILE__) . 'assets/accesscodefeeder.css'); wp_enqueue_script('access-code-feeder-js', plugin_dir_url(__FILE__) . 'assets/accesscodefeeder.js'); }//enqueue_scripts_and_styles() public function bootstrap_scripts_and_styles(){ wp_register_style( 'bootstrap.min', plugin_dir_url(__FILE__) . 'assets/bootstrap.min.css' ); wp_enqueue_style('bootstrap.min'); wp_register_script( 'bootstrap.min', plugin_dir_url(__FILE__) . 'assets/bootstrap.min.js' ); wp_enqueue_script('bootstrap.min'); }//bootstrap_scripts_and_styles() function render_options() { echo('

'); _e( 'Access Code Feeder', 'access-code-feeder' ); echo('

'); echo( '

' ); _e( 'Use Feeders to pass unique access code to chat bots, merchant software, etc.', 'access-code-feeder' ) ; echo( ' ' ); _e( 'Watch Video', 'access-code-feeder' ) ; echo( '

' ); $this->render_base_url(); $this->render_feeders(); } function render_base_url() { echo('
'); echo('
'); echo( '

' . __( 'Base URL', 'access-code-feeder' ) . '

'); echo('
');//panel-heading echo('
'); echo('

'.__('just a second...', 'access-code-feeder').'

'); echo('
'); //panel-body echo('
'); //panel echo($this->admin_action_js()); } function get_html_feeders() { $this->bootstrap_scripts_and_styles(); $this->enqueue_scripts_and_styles(); $must_be_user = '
' . __('Please Register or Login to access this page !', 'access-code-feeder'); if(!is_user_logged_in()){ return($must_be_user); //we done } $ret = ''; $ret .= '
'; $ret .= '
'; $ret .= '

'; $ret .= '' . __( 'Feeders', 'access-code-feeder' ) . ''; $ret .= ' '; $ret .= ' '; $ret .= '

'; $ret .= '

'; //panel-heading $ret .= '
'; $ret .= ''; $ret .= ''; $ret .= ''; $ret .= ''; $ret .= ''; $ret .= ''; $ret .= ''; $ret .= ''; $ret .= $this->get_feeder_rows(100); $ret .= ''; $ret .= '

'.__('Feeder Name', 'access-code-feeder').'

'.__('Mode', 'access-code-feeder').'

'.__('Items', 'access-code-feeder').'

'.__('Actions', 'access-code-feeder').'

'; $ret .= '
'; // panel-body $ret .= '
'; //panel $ret .= '
'; $ret .= $this->feeders_action_js(); return($ret); } function render_feeders() { echo($this->get_html_feeders()); } function base_url_action(){ //ajax! if ( isset($_REQUEST) ) { $new_url = $_REQUEST['new_url']; update_option('access-code-feeder-base-url', $new_url); echo(get_option('access-code-feeder-base-url','feeder')); } wp_die(); } function feeder_action(){ //ajax! global $wpdb; $table_name = $wpdb->prefix . 'acf_Feeders'; //wp_die('MSG' . print_r($_REQUEST,true)); //testing if ( isset($_REQUEST) ) { $command = ''; $param0 = ''; $param1 = ''; $param2 = ''; if ( isset($_REQUEST['command']) ) $command = sanitize_text_field($_REQUEST['command']); //type of operation if ( isset($_REQUEST['param0']) ) $param0 = sanitize_text_field($_REQUEST['param0']); //feeder_id, $feeder_name if ( isset($_REQUEST['param1']) ) $param1 = wp_strip_all_tags($_REQUEST['param1']); //save feeder content if($command == 'DELETEFEEDER'){ $feeder_id = $param0; $feeder_owner = get_current_user_id(); $sql_delete = $wpdb->prepare("DELETE FROM $table_name WHERE `wp_owner_id` = %d AND `id` = %d",array($feeder_owner,$feeder_id)); if($wpdb->query($sql_delete) === FALSE){wp_die('MSG Database Error on deleting Feeder');} wp_die("#feeder-row-".$feeder_id); //we done }//DELETEFEEDER if($command == 'REFRESHLIST'){ wp_die($this->get_feeder_rows(100)); //we done }//REFRESHLIST if($command == 'FETCHCONTENT'){ $feeder_id = $param0; $feeder_owner = get_current_user_id(); $sql_content = $wpdb->prepare("SELECT `content` FROM $table_name WHERE `wp_owner_id` = %d AND `id` = %d",array($feeder_owner,$feeder_id)); $feeder_content = stripslashes($wpdb->get_var($sql_content)); if($feeder_content === FALSE){wp_die('MSG Database Error on fetching Feeder Content');} wp_die(''.$feeder_content); //we done }//FETCHCONTENT if($command == 'SAVECONTENT'){ $feeder_id = $param0; $feeder_content = $param1; $a_content = explode("\n",$feeder_content); $a_content_filtered = array(); for($i=0; ($i < count($a_content)) && ($i < 1000); $i++){ $item = trim($a_content[$i]); if( (strlen($item) >= 1) && (strlen($item) <= 100)){ array_push($a_content_filtered,$item); } } $feeder_content = implode(PHP_EOL,$a_content_filtered); $feeder_owner = get_current_user_id(); $sql_content = $wpdb->prepare("UPDATE $table_name SET `content` = %s WHERE `wp_owner_id` = %d AND `id` = %d",array($feeder_content,$feeder_owner,$feeder_id)); if($wpdb->query($sql_content) === FALSE){wp_die('MSG Database Error on saving Feeder Content');} wp_die(); //we done }//SAVECONTENT if($command == 'FETCHSETTINGS'){ $feeder_id = $param0; if($feeder_id < 0) { //it's new Fer - no id yet wp_die(''); //nothing to fetch } $feeder_owner = get_current_user_id(); $sql_options = $wpdb->prepare("SELECT `options` FROM $table_name WHERE `wp_owner_id` = %d AND `id` = %d",array($feeder_owner,$feeder_id)); $feeder_options = ($wpdb->get_var($sql_options)); if($feeder_options === FALSE){wp_die('MSG Database Error on fetching Feeder Content');} wp_die($feeder_options); //we done }// FETCHSETTINGS if($command == 'SAVESETTINGS'){ $json_options = stripslashes($param0); //get_magic_quotes_gpc()? $a_options = json_decode($json_options,true); $feeder_owner = get_current_user_id(); $feeder_id = sanitize_text_field($a_options['feeder_id']); $safe_options = array(); foreach($a_options as $option_key => $option_val) { $safe_options[$option_key] = trim(sanitize_text_field(str_replace(array("\\","'",'"'),array(' ','`','`'),$option_val))); } $db_options = json_encode($safe_options); //echo("MSG $feeder_id ");wp_die(print_r($safe_options,true)); //test if($feeder_id < 0){ //create new $feeder_key = md5(rand()); $feeder_content = "Test Access Code 1" . PHP_EOL . "Test Access Code 2" . PHP_EOL . "Test Access Code 3"; $sql_count = $wpdb->prepare("SELECT COUNT(*) as feeders from $table_name WHERE `wp_owner_id` = %d",array($feeder_owner)); $count_feeders = $wpdb->get_var($sql_count); if($count_feeders > 100){ wp_die('MSG' . __('Too many Feeders', 'access-code-feeder') ); } $sql_add = $wpdb->prepare("INSERT IGNORE INTO $table_name (`wp_owner_id`,`options`,`key`,`content`) VALUES (%d,%s,%s,%s)",array($feeder_owner,$db_options,$feeder_key,$feeder_content)); if($wpdb->query($sql_add) === FALSE){wp_die('MSG Database Error on adding new Feeder');} $ret = $this->get_feeder_rows(1); //last one wp_die($ret); //we done }else{ //update old $sql_add = $wpdb->prepare("UPDATE $table_name SET `options` = %s WHERE `wp_owner_id` = %d AND `id` = %d",array($db_options,$feeder_owner,$feeder_id)); if($wpdb->query($sql_add) === FALSE){wp_die('MSG Database Error on updating Feeder');} $ret = $this->get_feeder_rows(1); //last one wp_die($ret); //we done } wp_die(''.$feeder_options); //we done }//SAVESETTINGS wp_die('MSG Unknown command "' . $command . '"'); //if we are here - command is nnot recognized } wp_die('MSG No params'); } function get_feeder_rows($limit){ global $wpdb; $table_name = $wpdb->prefix . 'acf_Feeders'; $feeder_owner = get_current_user_id(); $owner_sql = "`wp_owner_id` = %d"; if(is_admin() && in_array('administrator', wp_get_current_user()->roles)){ $extra_sql = "OR 1"; $limit = 99999; } $sql_rows = $wpdb->prepare("SELECT `id`, `wp_owner_id`, `options`,`key`, LENGTH( TRIM(`content`)) as `total_len`, ( LENGTH(`content`) - LENGTH(REPLACE(`content`, CHAR(10), '')) ) as line_count FROM $table_name WHERE (`wp_owner_id` = %d $extra_sql ) ORDER BY `id` DESC LIMIT $limit",array($feeder_owner)); $rows = $wpdb->get_results($sql_rows); if($rows === FALSE){wp_die('MSG Database Error on getting Feeders');} $ret = ''; for($i = 0; $i < count($rows); $i++){ $row = $rows[$i]; $line_count = $row->line_count + 1; //last line foes not have newline if($row->total_len == 0) //empty $line_count = 0; // $from_db_options = $row->options; $a_options = json_decode($from_db_options,true); $feeder_name = $a_options['feeder_name']; $ret .= $this->make_feeder_row($row->id,$feeder_name,$a_options['feeder_mode'],$row->key,$line_count,$row->wp_owner_id ); } return($ret); }//get_feeder_rows() function make_feeder_row($id,$name,$mode,$key,$linecount,$wp_owner_id){ $mode_title = ''; $mode_label = ''; if($mode == 'TR') {$mode_title = __( 'feed Top item, than Remove it', 'access-code-feeder' ); $mode_label='label-primary';} if($mode == 'RR') {$mode_title = __( 'feed Random item, than Remove it', 'access-code-feeder' ); $mode_label='label-success';} if($mode == 'RK') {$mode_title = __( 'feed Random item, than Keep it', 'access-code-feeder' ); $mode_label='label-info';} $feeder_name = $name; if( $wp_owner_id != get_current_user_id() ){ $feeder_name = '(' . $wp_owner_id . ')' . $feeder_name; } $td1 = "" . $feeder_name . ""; $td2 = "" . $mode . ""; $td3 = "" . $linecount . ""; $td4 = ""; $td4 .= ' '; $td4 .= ' '; $td4 .= ' '; $td4 .= ' '; $td4 .= ""; $ret = "" . $td1 . $td2 . $td3 . $td4 . ""; return($ret); }//make_feeder_row() function admin_action_js(){ //returns Js to serve with base_url ?> prefix . 'acf_Feeders'; $sql = "DROP TABLE IF EXISTS $table_name"; $wpdb->query($sql); } register_uninstall_hook(__FILE__, 'ACF1984S_delete_plugin_database_table');