ProShell v2.0
Dashboard
Server Info
Server: 158.106.128.192
PHP: 8.2.33
home
planet5
public_html
bansibaba.com
wp-includes
2026-09-17 09:26:15
Editing: PrliLink.php
Cancel
Save Changes
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } class PrliLink { public $table_name; public static $cpt = 'pretty-link'; public static $nonce_str = 'pretty-link-nonce'; public function __construct() { global $wpdb; $this->table_name = "{$wpdb->prefix}prli_links"; } public static function get_count() { global $wpdb, $prli_link; $q = "SELECT COUNT(*) FROM {$prli_link->table_name} WHERE link_status='enabled'"; return $wpdb->get_var($q); } public static function get_first_date() { global $wpdb, $prli_link; $q = "SELECT min(created_at) FROM {$prli_link->table_name} WHERE link_status='enabled'"; return $wpdb->get_var($q); } public function create( $values ) { global $wpdb, $prli_link_meta; static $slugs_done; if(!isset($slugs_done) || !is_array($slugs_done)) { $slugs_done = array(); } if(!empty($values['slug'])) { if(isset($slugs_done[$values['slug']]) && $slugs_done[$values['slug']] > 0) { return $slugs_done[$values['slug']]; // Return existing link id so we don't create a duplicate } } $now = current_time('mysql'); $values = $this->sanitize($values); $values['created_at'] = $values['updated_at'] = $now; if($values['link_cpt_id'] == 0) { ## Autocreate CPT $post_id = $this->create_cpt_for_link($values['name'], $now, $now); if($post_id == 0 || is_wp_error($post_id)) { error_log("Unable to create CPT Post for Link"); } $values['link_cpt_id'] = $post_id; } if(empty($values['name'])) { if(in_array($values['redirect_type'], array('pixel', 'prettypay_link_stripe'), true)) { $values['name'] = $values['slug']; } else { $values['name'] = PrliUtils::get_page_title($values['url'],$values['slug']); } // Update the post_title field directly so we don't activate the action // that ultimately calls this function lest we get into an infinite loop $q = $wpdb->prepare("UPDATE {$wpdb->posts} SET post_title=%s WHERE ID=%d", $values['name'], $values['link_cpt_id']); $wpdb->query($q); } $query_results = $wpdb->insert($this->table_name, $values); $link_id = ($query_results ? $wpdb->insert_id : false); // Static caching - already here during this request // Prevents dups $slugs_done[$values['slug']] = $link_id; //If JS or MetaRefresh are the default types we need to set this to 0 or the redirects will fail if($link_id) { $prli_link_meta->update_link_meta($link_id, 'delay', 0); } $this->update_cpt_title($values['link_cpt_id'], $values['name']); $this->update_cpt_status($values['link_cpt_id']); $this->update_cpt_post_date($values['link_cpt_id'], $now); do_action('prli-create-link', $link_id, $values); return $link_id; } public function update( $id, $values ) { global $wpdb, $prli_link; $now = current_time('mysql'); $values = $this->sanitize($values); $values['updated_at'] = $now; $title = isset($values['name'])?trim($values['name']):''; if(empty($title)) { if(in_array($values['redirect_type'], array('pixel', 'prettypay_link_stripe'), true)) { $title = $values['slug']; } else { $title = PrliUtils::get_page_title($values['url'],$values['slug']); } } $query_results = $wpdb->update($this->table_name, $values, array('id' => $id)); $link = $this->getOne($id); $this->update_cpt_title($link->link_cpt_id, $title); $this->update_cpt_status($link->link_cpt_id); $this->update_cpt_post_modified($link->link_cpt_id, $now); return $id; } public function disable_link($id) { return $this->update_link_status( $id, 'disabled' ); } public function enable_link($id) { return $this->update_link_status( $id, 'enabled' ); } public function update_link_status( $id, $link_status='enabled' ) { global $wpdb; $q = $wpdb->prepare(" UPDATE {$this->table_name} SET link_status=%s WHERE id=%d ", $link_status, $id ); return $wpdb->query($q); } public function update_group($id, $value, $group_id) { global $wpdb; if (isset($value)) { $query = $wpdb->prepare( "UPDATE {$this->table_name} SET group_id = %d WHERE id = %d", $group_id, $id ); } else { $query = $wpdb->prepare( "UPDATE {$this->table_name} SET group_id = NULL WHERE id = %d", $id ); } $query_results = $wpdb->query($query); return $query_results; } public function destroy($id, $delete_mode='delete_cpt') { global $wpdb, $prli_click, $prli_link_meta; do_action('prli_delete_link', $id); $link = $this->getOne($id); if($delete_mode=='delete_cpt' && $link->link_cpt_id > 0) { wp_delete_post($link->link_cpt_id, true); } $metas = $wpdb->prepare("DELETE FROM {$prli_link_meta->table_name} WHERE link_id=%d",$id); $reset = $wpdb->prepare("DELETE FROM {$prli_click->table_name} WHERE link_id=%d",$id); $destroy = $wpdb->prepare("DELETE FROM {$this->table_name} WHERE id=%d",$id); $wpdb->query($metas); $wpdb->query($reset); return $wpdb->query($destroy); } public function reset($id) { global $wpdb, $prli_click, $prli_link_meta; $prli_link_meta->delete_link_meta($id, 'static-clicks'); $prli_link_meta->delete_link_meta($id, 'static-uniques'); $reset = $wpdb->prepare("DELETE FROM {$prli_click->table_name} WHERE link_id=%d", $id); return $wpdb->query($reset); } public function getOneFromSlug( $slug, $return_type = OBJECT, $include_stats = false, $exclude_disabled=true ) { return $this->get_one_by( 'slug', $slug, $return_type, $include_stats, $exclude_disabled ); } public function getOne( $id, $return_type = OBJECT, $include_stats = false, $exclude_disabled=true ) { return $this->get_one_by( 'id', $id, $return_type, $include_stats, $exclude_disabled ); } public function get_one_by( $field, $val, $return_type = OBJECT, $include_stats = false, $exclude_disabled=true ) { global $wpdb, $prli_click, $prli_options, $prli_link_meta, $prli_blogurl; $struct = PrliUtils::get_permalink_pre_slug_uri(); if($include_stats) { $query = "SELECT li.*, CONCAT(\"{$prli_blogurl}\",\"{$struct}\",li.slug) AS pretty_url, "; $op = $prli_click->get_exclude_where_clause( ' AND' ); if($prli_options->extended_tracking != 'count') { $query .= " ( SELECT COUNT(*) FROM {$prli_click->table_name} AS cl WHERE cl.link_id = li.id {$op} ) as clicks, ( SELECT COUNT(*) FROM {$prli_click->table_name} AS cl WHERE cl.link_id = li.id AND cl.first_click <> 0 {$op} ) as uniques "; } else { $query .= " ( SELECT lm.meta_value FROM {$prli_link_meta->table_name} AS lm WHERE lm.meta_key=\"static-clicks\" AND lm.link_id=li.id LIMIT 1 ) as clicks, ( SELECT lm.meta_value FROM {$prli_link_meta->table_name} AS lm WHERE lm.meta_key=\"static-uniques\" AND lm.link_id=li.id LIMIT 1 ) as uniques "; } } else { $query = "SELECT li.*, CONCAT(\"{$prli_blogurl}\",\"{$struct}\",li.slug) AS pretty_url"; } $query .= " FROM {$this->table_name} AS li WHERE {$field}=%s "; if($exclude_disabled) { $query .= " AND link_status='enabled' "; } $query = $wpdb->prepare($query, $val); $link = $wpdb->get_row($query, $return_type); //get_row returns a null if not found - we don't want nulls if(!$link) { $link = false; } if($include_stats and $link and $prli_options->extended_tracking == 'count') { $link->clicks = $prli_link_meta->get_link_meta($link->id,'static-clicks',true); $link->uniques = $prli_link_meta->get_link_meta($link->id,'static-uniques',true); } return $link; } public function find_first_target_url($target_url) { global $wpdb; $query_str = "SELECT id FROM {$this->table_name} WHERE link_status='enabled' AND url=%s LIMIT 1"; $query = $wpdb->prepare($query_str,$target_url); return $wpdb->get_var($query); } public function get_or_create_pretty_link_for_target_url( $target_url, $group=0 ) { global $wpdb; $query_str = "SELECT * FROM {$this->table_name} WHERE link_status='enabled' AND url=%s LIMIT 1"; $query = $wpdb->prepare($query_str,$target_url); $pretty_link = $wpdb->get_row($query); if(empty($pretty_link) or !$pretty_link) { $pl_insert_id = prli_create_pretty_link( $target_url, '', '', '', $group ); $pretty_link = $this->getOne($pl_insert_id); } if( !isset($pretty_link) or empty($pretty_link) or !$pretty_link ) return false; else return $pretty_link; } public function is_pretty_link($url, $check_domain=true) { global $prli_blogurl; if( !$check_domain or preg_match( '#^' . preg_quote( $prli_blogurl ) . '#', $url ) ) { $uri = preg_replace('#' . preg_quote($prli_blogurl) . '#', '', $url); // Resolve WP installs in sub-directories preg_match('#^(https?://.*?)(/.*)$#', $prli_blogurl, $subdir); $struct = PrliUtils::get_permalink_pre_slug_regex(); $subdir_str = (isset($subdir[2])?$subdir[2]:''); $match_str = '#^'.$subdir_str.'('.$struct.')([^\?]*?)([\?].*?)?$#'; if(preg_match($match_str, $uri, $match_val)) { // Match longest slug -- this is the most common if( $pretty_link_found = $this->is_pretty_link_slug( $match_val[2] ) ) return compact('pretty_link_found'); } } return false; } public function is_pretty_link_slug($slug) { return apply_filters('prli-check-if-slug', $this->getOneFromSlug( rawurldecode($slug) ), rawurldecode($slug)); } public function get_link_min( $id, $return_type = OBJECT ) { global $wpdb, $prli_link_meta; $query_str = "SELECT * FROM {$this->table_name} WHERE link_status='enabled' AND id=%d"; $query = $wpdb->prepare($query_str, $id); $res = $wpdb->get_row($query, $return_type); //Load in some meta data too if($res && $return_type == ARRAY_A) { $res['delay'] = (int)$prli_link_meta->get_link_meta($id, 'delay', true); $res['google_tracking'] = (int)$prli_link_meta->get_link_meta($id, 'google_tracking', true); } return $res; } public function getAll($where = '', $order_by = '', $return_type = OBJECT, $include_stats = false) { global $wpdb, $prli_click, $prli_group, $prli_link_meta, $prli_options, $prli_utils, $prli_blogurl; $struct = PrliUtils::get_permalink_pre_slug_regex(); $op = $prli_click->get_exclude_where_clause( ' AND' ); if($include_stats) { $query = "SELECT li.*, CONCAT(\"{$prli_blogurl}\",\"{$struct}\",li.slug) AS pretty_url, "; if($prli_options->extended_tracking != 'count') { $query .= " ( SELECT COUNT(*) FROM {$prli_click->table_name} AS cl WHERE cl.link_id = li.id {$op} ) as clicks, ( SELECT COUNT(*) FROM {$prli_click->table_name} AS cl WHERE cl.link_id = li.id AND cl.first_click <> 0 {$op} ) as uniques "; } else { $query .= " ( SELECT lm.meta_value FROM {$prli_link_meta->table_name} AS lm WHERE lm.meta_key=\"static-clicks\" AND lm.link_id=li.id LIMIT 1 ) as clicks, ( SELECT lm.meta_value FROM {$prli_link_meta->table_name} AS lm WHERE lm.meta_key=\"static-uniques\" AND lm.link_id=li.id LIMIT 1 ) as uniques "; } } else { $query = "SELECT li.*,CONCAT(\"{$prli_blogurl}\",\"{$struct}\",li.slug) AS pretty_url "; } $query .= "FROM {$this->table_name} AS li WHERE li.link_status='enabled' " . $prli_utils->prepend_and_or_where(' AND', $where) . $order_by; return $wpdb->get_results($query, $return_type); } public function generateValidSlug($num_chars = 4) { global $wpdb, $plp_update, $plp_options; $slug_prefix = ''; //Maybe use a different number of characters? if($plp_update->is_installed()) { if(!empty($plp_options->base_slug_prefix)) { $slug_prefix = $plp_options->base_slug_prefix . '/'; } $num_chars = $plp_options->num_slug_chars; } $slug = $slug_prefix . PrliUtils::gen_random_string($num_chars); // Intentionally not checking to see if link is enabled or disabled $query = "SELECT slug FROM {$this->table_name}"; $slugs = $wpdb->get_col($query,0); // It is highly unlikely that we'll ever see 2 identical random slugs // but just in case, here's some code to prevent collisions while(in_array($slug, $slugs) || is_wp_error(PrliUtils::is_slug_available($slug))) { $slug = $slug_prefix . PrliUtils::gen_random_string($num_chars); } return apply_filters('prli-auto-generated-slug', $slug, $slugs, $num_chars); } public function get_pretty_link_url($slug, $esc_url=false) { global $prli_blogurl; $link = $this->getOneFromSlug($slug); $pretty_link_url = $prli_blogurl . PrliUtils::get_permalink_pre_slug_uri() . $link->slug; if($esc_url) { $pretty_link_url = esc_url($pretty_link_url); } else { $pretty_link_url = $pretty_link_url; } if( ( !isset($link->param_forwarding) || empty($link->param_forwarding) || $link->param_forwarding=='off' ) && ( isset($link->redirect_type) && $link->redirect_type == 'pixel' ) ) { return '<img src="'.$pretty_link_url.'" width="1" height="1" style="display: none" />'; } else { return $pretty_link_url; } } /** * Sanitize the given link options and return them * * @param array $values * @return array */ public function sanitize($values) { $sanitized = array( 'redirect_type' => isset($values['redirect_type']) && is_string($values['redirect_type']) ? sanitize_key($values['redirect_type']) : '307', 'url' => isset($values['url']) && is_string($values['url']) ? esc_url_raw(trim($values['url'])) : '', 'slug' => isset($values['slug']) && is_string($values['slug']) ? sanitize_text_field($values['slug']) : '', 'name' => isset($values['name']) && is_string($values['name']) ? sanitize_text_field($values['name']) : '', 'description' => isset($values['description']) && is_string($values['description']) ? sanitize_textarea_field($values['description']) : '', 'group_id' => isset($values['group_id']) && is_numeric($values['group_id']) ? (int) $values['group_id'] : null, 'nofollow' => isset($values['nofollow']) ? 1 : 0, 'sponsored' => isset($values['sponsored']) ? 1 : 0, 'param_forwarding' => isset($values['param_forwarding']) ? 1 : 0, 'track_me' => isset($values['track_me']) ? 1 : 0, 'link_cpt_id' => isset($values['link_cpt_id']) && is_numeric($values['link_cpt_id']) ? (int) $values['link_cpt_id'] : 0, 'prettypay_link' => isset($values['prettypay_link']) ? 1 : 0 ); return $sanitized; } public function validate( $values , $id = null ) { global $wpdb, $prli_utils, $prli_blogurl; $values = $this->sanitize($values); $errors = array(); if( empty($values['url']) && !in_array($values['redirect_type'], array('pixel', 'prettypay_link_stripe'), true ) ) { $errors[] = __("Target URL can't be blank", 'pretty-link'); } if( $values['url'] == $prli_blogurl.PrliUtils::get_permalink_pre_slug_uri().$values['slug'] ) { $errors[] = __("Target URL must be different than the Pretty Link", 'pretty-link'); } if( !empty($values['url']) && !PrliUtils::is_url($values['url']) ) { $errors[] = __("Link URL must be a correctly formatted url", 'pretty-link'); } if( preg_match('/^[\?\&\#]+$/', $values['slug'] ) ) { $errors[] = __("Pretty Link slugs must not contain question marks, ampersands or number signs.", 'pretty-link'); } if( preg_match('#/$#', $values['slug']) ) { $errors[] = __("Pretty Link slugs must not end with a slash (\"/\")", 'pretty-link'); } $slug_is_available = PrliUtils::is_slug_available($values['slug'],$id); if(is_wp_error($slug_is_available)) { $errors[] = $slug_is_available->get_error_message(); } return $errors; } public function get_link_slug($url) { global $prli_blogurl; $ugh = preg_quote($prli_blogurl.PrliUtils::get_permalink_pre_slug_uri(), '!'); $mod = preg_replace("!^{$ugh}!", '', $url); return "\"{$mod}\""; } public function get_target_to_pretty_urls($urls=array(),$create_pretty_links=false) { global $wpdb, $prli_blogurl; if(empty($urls)) { return false; } $decoded_urls = array_map( function($url) { return esc_url_raw(html_entity_decode(rawurldecode($url))); }, $urls ); // Filter out urls that are already Pretty Links $where = "IN (" . implode( ',', array_map( array($this, 'get_link_slug'), $decoded_urls ) ) . ")"; $query = " SELECT CONCAT(%s, li.slug) AS pretty_url FROM {$this->table_name} AS li WHERE li.link_status='enabled' AND li.slug {$where} "; $query = $wpdb->prepare($query, $prli_blogurl.PrliUtils::get_permalink_pre_slug_uri()); $plinks = $wpdb->get_col($query); $decoded_urls = array_diff($decoded_urls, $plinks); if(empty($decoded_urls)) { return false; } $where = "IN (" . implode( ',', array_map( function($url) { return "\"{$url}\""; }, $decoded_urls ) ) . ")"; $query = " SELECT li.url AS target_url, CONCAT(%s, li.slug) AS pretty_url FROM {$this->table_name} AS li WHERE li.link_status='enabled' "; $query = $wpdb->prepare($query, $prli_blogurl.PrliUtils::get_permalink_pre_slug_uri()); $query .= " AND li.url {$where}"; $results = (array)$wpdb->get_results($query); $prli_lookup = array(); foreach($results as $url_hash) { if(isset($prli_lookup[$url_hash->target_url])) { $prli_lookup[$url_hash->target_url][] = $url_hash->pretty_url; } else { $prli_lookup[$url_hash->target_url] = array($url_hash->pretty_url); } } if($create_pretty_links) { foreach($decoded_urls as $url) { if(!isset($prli_lookup[$url])) { if( $id = prli_create_pretty_link( $url ) ) { $prli_lookup[$url] = array(prli_get_pretty_link_url($id)); } } } } return $prli_lookup; } public static function bookmarklet_link() { global $prli_options; $site_url = site_url(); return "javascript:location.href='{$site_url}/index.php?action=prli_bookmarklet&k={$prli_options->bookmarklet_auth}&target_url='+escape(location.href);"; } public function get_link_from_cpt($cpt_id) { global $wpdb; $q = $wpdb->prepare(" SELECT id FROM {$this->table_name} WHERE link_cpt_id=%d ", $cpt_id ); $link_id = $wpdb->get_var($q); if(empty($link_id)) { $link_id = 0; } return $link_id; } public function update_link_cpt($link_id, $cpt_id) { global $wpdb; $q = $wpdb->prepare(" UPDATE {$this->table_name} SET link_cpt_id=%d WHERE id=%d ", $cpt_id, $link_id ); return $wpdb->get_var($q); } /** We do this directly in the database because wp_insert_post is very slow */ public function create_cpt_for_link($title, $created_at, $updated_at) { global $wpdb; if (empty($created_at)) { $created_at = current_time('mysql'); } if (empty($updated_at)) { $updated_at = current_time('mysql'); } $inserted = $wpdb->insert( $wpdb->posts, array( 'post_author' => get_current_user_id(), 'post_title' => stripslashes($title), 'post_type' => PrliLink::$cpt, 'post_status' => 'publish', 'post_date' => $created_at, 'post_date_gmt' => get_gmt_from_date($created_at), 'post_modified' => $updated_at, 'post_modified_gmt' => get_gmt_from_date($updated_at), 'comment_status' => 'closed', 'ping_status' => 'closed' ), array('%d','%s','%s','%s','%s','%s','%s','%s') ); return $inserted ? $wpdb->insert_id : false; } public function update_cpt_title($cpt_id, $title) { global $wpdb; $q = $wpdb->prepare(" UPDATE {$wpdb->posts} SET `post_title` = %s WHERE `ID` = %d AND `post_type` = %s ", stripslashes($title), $cpt_id, PrliLink::$cpt ); return $wpdb->query($q); } public function update_cpt_status($cpt_id, $status='publish') { global $wpdb; $q = $wpdb->prepare(" UPDATE {$wpdb->posts} SET `post_status` = %s WHERE `ID` = %d AND `post_type` = %s ", $status, $cpt_id, PrliLink::$cpt ); return $wpdb->query($q); } public function update_cpt_post_date($cpt_id, $now=false) { global $wpdb; if(empty($now)) { $now = current_time('mysql'); } $wpdb->update( $wpdb->posts, array( 'post_date' => $now, 'post_date_gmt' => get_gmt_from_date($now) ), array( 'ID' => $cpt_id, 'post_type' => PrliLink::$cpt ), array('%s', '%s'), array('%d', '%s') ); } public function update_cpt_post_modified($cpt_id, $now=false) { global $wpdb; if(empty($now)) { $now = current_time('mysql'); } $wpdb->update( $wpdb->posts, array( 'post_modified' => $now, 'post_modified_gmt' => get_gmt_from_date($now) ), array( 'ID' => $cpt_id, 'post_type' => PrliLink::$cpt ), array('%s', '%s'), array('%d', '%s') ); } /** For legacy handling of groups filter */ public function get_all_legacy_groups() { global $wpdb; $prli_db = new PrliDb(); $groups_table = "{$wpdb->prefix}prli_groups"; $groups = array(); if($prli_db->table_exists($groups_table)) { $q = "SELECT * FROM {$groups_table} ORDER BY `name`"; $groups = $wpdb->get_results($q); } return $groups; } public function count_links($prettypay_link = null) { global $wpdb; $query = "SELECT post_status, COUNT(*) AS num_posts FROM {$wpdb->posts} p JOIN {$wpdb->prefix}prli_links pl ON pl.link_cpt_id = p.ID WHERE post_type = %s"; if(is_user_logged_in()) { $post_type_object = get_post_type_object(PrliLink::$cpt); if(!current_user_can($post_type_object->cap->read_private_posts)) { $query .= $wpdb->prepare( " AND (post_status != 'private' OR (post_author = %d AND post_status = 'private'))", get_current_user_id() ); } } if(!is_null($prettypay_link)) { $query .= $wpdb->prepare( " AND pl.prettypay_link = %d", $prettypay_link ); } $query .= ' GROUP BY post_status'; $results = (array)$wpdb->get_results($wpdb->prepare($query, PrliLink::$cpt), ARRAY_A); $counts = array_fill_keys(get_post_stati(), 0); foreach($results as $row) { $counts[$row['post_status']] = $row['num_posts']; } return (object) $counts; } public function is_post_prettypay_link($post_id) { global $wpdb; $query = $wpdb->prepare("SELECT prettypay_link FROM {$wpdb->prefix}prli_links WHERE link_cpt_id = %d", $post_id); return (bool) $wpdb->get_var($query); } }
Upload Files
Cancel
Upload
Create New
Cancel
Create
Change Permissions
Cancel
Save
Change Date
Cancel
Save
Rename Item
Cancel
Save
Confirm Delete
Are you sure you want to delete the selected items?
Cancel
Delete