');
// Global variables
$adinj_total_top_ads_used = 0;
$adinj_total_random_ads_used = 0;
$adinj_total_bottom_ads_used = 0;
$adinj_data = array();
require_once(ADINJ_PATH . '/adshow.php');
if (is_admin()){
require_once(ADINJ_PATH . '/ad-injection-admin.php');
}
function adinj_admin_menu_hook(){
$options_page = add_options_page('Ad Injection', 'Ad Injection', 'manage_options', basename(__FILE__), 'adinj_options_page');
add_action("admin_print_scripts-".$options_page, "adinj_admin_print_scripts_main");
add_action("admin_print_scripts-widgets.php", "adinj_admin_print_scripts_widgets");
}
function adinj_options_link_hook($links, $file) {
static $this_plugin;
if (!$this_plugin) $this_plugin = plugin_basename(__FILE__);
if ($file == $this_plugin){
$link = "" . __("Settings") . "";
array_unshift($links, $link);
}
return $links;
}
function adinj_options($reset=false){
global $adinj_data;
if (empty($adinj_data) || $reset !== false){
$adinj_data = get_option('adinj_options');
}
return $adinj_data;
}
function adinj_option($option){
$ops = adinj_options();
return $ops[$option];
}
// TODO make the cookie domain from wp-config.php accessible to script
//$cookie_domain = COOKIE_DOMAIN; // TODO test
//var adinj_cookie_domain = "$cookie_domain"; //JS line. TODO test
function adinj_print_referrers_hook(){
// TODO can re-enable this check once the widget ads are factored in.
//if (adinj_ads_completely_disabled_from_page()) return;
$sevisitors = adinj_ticked('sevisitors_only');
$block = adinj_ticked('block_keywords');
if (!$sevisitors && !$block) return;
echo <<\n";
}
function adinj_quote_list($option){
$ops = adinj_options();
$list = $ops[$option];
// I'm sure this whole thing could be done with a much simpler single
// line of PHP - but right now my brain isn't up to thinking about it!
$lines = explode("\n", $list);
foreach ($lines as $line){
$stripped_lines[] = preg_replace("/\/\/.*/", "", $line);
}
$list = implode(" ", $stripped_lines);
$list = preg_replace("/'/", "", $list);
$referrers = preg_split("/[\s,]+/", $list, -1, PREG_SPLIT_NO_EMPTY);
if (empty($referrers)) return '';
foreach ($referrers as $referrer){
$newlist[] = "'" . $referrer . "'";
}
return implode(", ", $newlist);
}
function adinj_addsevjs_hook(){
// TODO can re-enable this check once the widget ads are factored in.
//if (adinj_ads_completely_disabled_from_page()) return;
if (!adinj_ticked('sevisitors_only') && !adinj_ticked('block_keywords')) return;
// Put the search engine detection / cookie setting script in the footer
wp_enqueue_script('adinj_sev', WP_PLUGIN_URL.'/ad-injection/adinj-sev.js', NULL, NULL, true);
}
function adinj_get_ad_code($adtype, $ads_db){
$ops = adinj_options();
$ads_live = NULL;
$ads_split = NULL;
$alt_live = NULL;
$alt_split = NULL;
$formatting = NULL;
if (adinj_mfunc_mode()){
adinj_live_ads_array($adtype, $ads_db, $ads_live, $ads_split, 'string');
if (adinj_db_version($ads_db) >= 2){
adinj_live_ads_array($adtype.'_alt', $ads_db, $alt_live, $alt_split, 'string');
}
$formatting = adinj_formatting_options($adtype, $ads_db, 'string');
} else {
$ads_live = array();
$ads_split = array();
$alt_live = array();
$alt_split = array();
adinj_live_ads_array($adtype, $ads_db, $ads_live, $ads_split, 'array');
if (adinj_db_version($ads_db) >= 2){
adinj_live_ads_array($adtype.'_alt', $ads_db, $alt_live, $alt_split, 'array');
}
$formatting = adinj_formatting_options($adtype, $ads_db, 'array');
}
if (empty($ads_live) && empty($alt_live)){
return "";
}
if (adinj_mfunc_mode()){
return adinj_ad_code_eval("\n
");
}
// else dynamic ad
if (adshow_show_adverts() !== true){
$adname = adshow_pick_value($alt_live, $alt_split);
} else {
$adname = adshow_pick_value($ads_live, $ads_split);
}
$ad = $ads_db[$adname];
if (empty($ad)){
return "";
}
$ad = adshow_add_formatting($ad, $formatting);
return "".adinj_ad_code_eval($ad);
}
function adinj_ad_code_random(){
return adinj_get_ad_code('random', adinj_options());
}
function adinj_ad_code_top(){
return adinj_get_ad_code('top', adinj_options());
}
function adinj_ad_code_bottom(){
return adinj_get_ad_code('bottom', adinj_options());
}
function adinj_ad_code_footer(){
return adinj_get_ad_code('footer', adinj_options());
}
/**
Old:
ad_code_random_1 <-> ad_random_1.txt
New:
ad_code_random_1:ad_code_random_1_split <-> ad_random_1.txt
ad_code_random_alt_1:ad_code_random_alt_1_split <-> ad_random-alt_1.txt
*/
function adinj_live_ads_array($type, $ads_option, &$ads, &$split, $output_type="string"){
$op_stem = "";
$file_stem = "";
if ($type == 'random' || $type == 'top' || $type == 'bottom' || $type == 'footer' ||
$type == 'random_alt' || $type == 'top_alt' || $type == 'bottom_alt' || $type == 'footer_alt'){
$op_stem = 'ad_code_'.$type.'_';
$file_stem = 'ad_'.$type.'_';
} else if (preg_match("/widget_[\d+]/i", $type)){
if (strpos($type, '_alt') === false){
$op_stem = 'advert_';
} else {
$op_stem = 'advert_alt_';
}
$file_stem = 'ad_'.$type.'_';
}
if (adinj_db_version($ads_option) == 1){
// old DB support (no ad rotation support) - TODO delete later
if ($type == 'random'|| $type == 'top' || $type == 'bottom'){
if ($output_type == "string"){
$ads = "'ad_".$type."_1.txt'";
} else {
$ads[] = 'ad_code_'.$type.'_1';
}
} else if (preg_match("/widget_[\d+]/i", $type)){
if ($output_type == "string"){
$ads = "'ad_".$type.".txt'";
} else {
$ads[] = 'advert';
}
}
return;
}
// DB with support for ad rotation
for ($i=1; $i<=10; ++$i){
$ad_name = $op_stem.$i;
if (!array_key_exists($ad_name.'_split', $ads_option)) return;
$split_val = $ads_option[$ad_name.'_split'];
if (!empty($ads_option[$ad_name]) && is_numeric($split_val) && $split_val > 0){
if ($output_type == "string"){
if (!empty($ads)) $ads .= ",";
$ads .= "'".$file_stem."$i.txt'";
if (!empty($split)) $split .= ",";
$split .= $split_val;
} else {
$ads[] = $ad_name;
$split[] = $split_val;
}
}
}
}
function adinj_formatting_options($adtype, $ops, $output_type="string"){
$align = "";
$clear = "";
$margin_top = "";
$margin_bottom = "";
$padding_top = "";
$padding_bottom = "";
$prefix = '';
if ($adtype == 'random') $prefix = 'rnd_';
if ($adtype == 'top') $prefix = 'top_';
if ($adtype == 'bottom') $prefix = 'bottom_';
if ($adtype == 'footer') $prefix = 'footer_';
//widgets have no prefix
$align = $ops[$prefix.'align'];
$clear = $ops[$prefix.'clear'];
$margin_top = $ops[$prefix.'margin_top'];
$margin_bottom = $ops[$prefix.'margin_bottom'];
$padding_top = $ops[$prefix.'padding_top'];
$padding_bottom = $ops[$prefix.'padding_bottom'];
if (adinj_not_set($align)) $align = "";
if (adinj_not_set($clear)) $clear = "";
if (adinj_not_set($margin_top)) $margin_top = "";
if (adinj_not_set($margin_bottom)) $margin_bottom = "";
if (adinj_not_set($padding_top)) $padding_top = "";
if (adinj_not_set($padding_bottom)) $padding_bottom = "";
if ($output_type == "string"){
return "'align' => '$align', 'clear' => '$clear', 'margin_top' => '$margin_top', 'margin_bottom' => '$margin_bottom', 'padding_top' => '$padding_top', 'padding_bottom' => '$padding_bottom'";
} else {
return array('align' => $align,
'clear' => $clear,
'margin_top' => $margin_top,
'margin_bottom' => $margin_bottom,
'padding_top' => $padding_top,
'padding_bottom' => $padding_bottom);
}
}
function adinj_ad_code_eval($ad){
if (strlen($ad) == 0) return $ad;
if (stripos($ad, '
");
}
return "";
}
function read_ad_from_file($ad_path){
$contents = "";
if (file_exists($ad_path)){
$contents = file_get_contents($ad_path);
if ($contents === false) return "Error: can't read from file: $ad_path";
}
return $contents;
}
// Based on: http://www.wprecipes.com/wordpress-hack-how-to-display-ads-on-old-posts-only
// Only use for pages and posts. Not for archives, categories, home page, etc.
function adinj_is_old_post($adtype){
$ops = adinj_options();
if ($adtype == 'widget'){
$days = $ops['widgets_on_page_older_than'];
} else {
$days = $ops['ads_on_page_older_than'];
}
if ($days == 0) return true;
if(is_single() || is_page()) {
$current_date = time();
$offset = $days * 60*60*24;
$post_date = get_the_time('U');
if(($post_date + $offset) > $current_date){
return false;
} else {
return true;
}
}
return false;
}
function adinj_adverts_disabled_flag(){
$custom_fields = get_post_custom();
if (isset($custom_fields['disable_adverts'])){
$disable_adverts = $custom_fields['disable_adverts'];
return ($disable_adverts[0] == 1);
}
return 0;
}
function adinj($content, $message){
if (!adinj_ticked('debug_mode')) return $content;
global $adinj_total_top_ads_used, $adinj_total_random_ads_used, $adinj_total_bottom_ads_used;
$ops = adinj_options();
$rnd_start_at = $ops['random_ads_start_at'];
$rnd_start_mode = $ops['random_ads_start_mode'];
if ($rnd_start_mode == 'after') $rnd_start_mode = 'at or after';
$rnd_start_unit = $ops['random_ads_start_unit'];
$rnd_end_at = $ops['random_ads_end_at'];
$rnd_end_mode = $ops['random_ads_end_mode'];
$rnd_end_unit = $ops['random_ads_end_unit'];
$rnd_end_unit_dir = $ops['random_ads_end_direction'];
$mode = $ops['ad_insertion_mode'];
$posttype = get_post_type() . ' (';
if (is_archive()) $posttype .= ' archive';
if (is_front_page()) $posttype .= ' front';
if (is_home()) $posttype .= ' home';
if (is_page()) $posttype .= ' page';
if (is_search()) $posttype .= ' search';
if (is_single()) $posttype .= ' single';
if (is_404()) $posttype .= ' 404';
$posttype .= ')';
if(is_single() || is_page()) {
$currentdate = time();
$postdate = get_the_time('U');
$currentday = $currentdate / 24 / 60 / 60;
$postday = $postdate / 24 / 60 / 60;
}
return $content."
\n";
}
// todo check exclude options for hardcoded ads
function adinj_excluded_by_tick_box($prefix){
if (is_front_page() && adinj_ticked($prefix.'exclude_front') ||
is_home() && adinj_ticked($prefix.'exclude_home') ||
is_search() && adinj_ticked($prefix.'exclude_search') ||
is_404() && adinj_ticked($prefix.'exclude_404') ||
is_page() && adinj_ticked($prefix.'exclude_page') ||
is_single() && adinj_ticked($prefix.'exclude_single') ||
is_archive() && adinj_ticked($prefix.'exclude_archive')){
return true;
}
return false;
}
function adinj_ads_completely_disabled_from_page($adtype, $content=NULL){
$ops = adinj_options();
if ($ops['ads_enabled'] == 'off' ||
$ops['ads_enabled'] == ''){
return "NOADS: Ads are not switched on";
}
if ($ops['ads_enabled'] == 'test' && !current_user_can('activate_plugins')){
return "NOADS: test mode enabled - ads only shown admins";
}
// check for ads on certain page types being disabled
if (is_front_page() && adinj_ticked('exclude_front')){ return "NOADS: excluded from front page"; }
if (is_home() && adinj_ticked('exclude_home')){ return "NOADS: excluded from home page"; }
if (is_search() && adinj_ticked('exclude_search')){ return "NOADS: excluded from search pages"; }
if (is_404() && adinj_ticked('exclude_404')){ return "NOADS: excluded from 404 pages"; }
if ((is_page() && adinj_ticked('exclude_page')) ||
(is_single() && adinj_ticked('exclude_single')) ||
(is_archive() && adinj_ticked('exclude_archive'))){
return "NOADS: excluded from this page type: ".get_post_type();
}
// if disable_adverts==1
if (adinj_adverts_disabled_flag()) return "NOADS: adverts_disabled_flag";
// no ads on old posts/pages if rule is enabled
if((is_page() || is_single()) && !adinj_is_old_post($adtype)) return "NOADS: !is_old_post";
if (!adinj_allowed_in_category('global', $ops)) return "NOADS: globally blocked from category";
if (!adinj_allowed_in_tag('global', $ops)) return "NOADS: globally blocked from tag";
if (!adinj_allowed_in_author('global', $ops)) return "NOADS: globally blocked from author";
if (!adinj_allowed_in_id('global', $ops)) return "NOADS: globally blocked from post/page id";
// manual ad disabling tags
if ($content == NULL) return false;
if (stripos($content, "") !== false) return "NOADS: noadsense tag"; // 'Adsense Injection' tag
if (stripos($content, "") !== false) return "NOADS: no-adsense tag"; // 'Whydowork Adsense' tag
if (stripos($content,'') !== false) return "NOADS: NoAds tag"; // 'Quick Adsense' tag
if (stripos($content,'') !== false) return "NOADS: OffAds tag"; // 'Quick Adsense' tag
return false;
}
function adinj_allowed_in_list($all_entries, $config_entries, $mode, $func){
if (is_array($all_entries)){
foreach($all_entries as $entry){
$string = $func($entry);
$decoded = rawurldecode($string); //allow UTF-8 encoded strings
if (in_array($string, $config_entries) || in_array($decoded, $config_entries)){
if (adinj_mode_only_show_in($mode)){
return true;
} else if (adinj_mode_never_show_in($mode)){
return false;
}
}
}
}
if (adinj_mode_only_show_in($mode)){
return false;
} else if (adinj_mode_never_show_in($mode)){
return true;
}
echo ("");
return true;
}
function adinj_mode_only_show_in($mode){
return ($mode == ADINJ_ONLY_SHOW_IN || $mode == 'o');
}
function adinj_mode_never_show_in($mode){
return ($mode == ADINJ_NEVER_SHOW_IN || $mode == 'n');
}
function adinj_allowed_in_category($scope, $ops){
$conditions = adinj_split_comma_list($ops[$scope.'_category_condition_entries']);
if (empty($conditions)) return true;
$mode = $ops[$scope.'_category_condition_mode'];
// widget ads and footer ad
if (!in_the_loop() && adinj_mode_only_show_in($mode) && !(is_single() || is_category())){
return false;
}
if (in_the_loop() && adinj_mode_only_show_in($mode) && !(is_single() || is_home() || is_category())){
return false;
}
$categories = array();
global $post;
if (in_the_loop() && (is_single() || is_home())){
$categories = get_the_category($post->ID);
} else if (!in_the_loop() && is_single()){
$cat_ids = wp_get_object_terms($post->ID, 'category', 'fields=all');
foreach($cat_ids as $id){
$categories[] = get_category($id);
}
} else if (is_category()){
$categories[] = get_category(get_query_var('cat'));
} // else cat array is empty
return adinj_allowed_in_list($categories, $conditions, $mode, 'adinj_category_nicename');
}
function adinj_allowed_in_tag($scope, $ops){
$conditions = adinj_split_comma_list($ops[$scope.'_tag_condition_entries']);
if (empty($conditions)) return true;
$mode = $ops[$scope.'_tag_condition_mode'];
if (!in_the_loop() && adinj_mode_only_show_in($mode) && !(is_single() || is_tag())){
return false;
}
if (in_the_loop() && adinj_mode_only_show_in($mode) && !(is_single() || is_home() || is_tag())){
return false;
}
$tags = array();
global $post;
if (in_the_loop() && (is_single() || is_home())){
$tags = get_the_tags($post->ID);
} else if (!in_the_loop() && is_single()){
$tag_ids = wp_get_object_terms($post->ID, 'post_tag', 'fields=all');
foreach($tag_ids as $id){
$tags[] = get_tag($id);
}
} else if (is_tag()){
$tags[] = get_tag(get_query_var('tag_id'));
} // else tag array is empty
return adinj_allowed_in_list($tags, $conditions, $mode, 'adinj_tag_slug');
}
function adinj_allowed_in_author($scope, $ops){
$conditions = adinj_split_comma_list($ops[$scope.'_author_condition_entries']);
if (empty($conditions)) return true;
$mode = $ops[$scope.'_author_condition_mode'];
if (!in_the_loop() && adinj_mode_only_show_in($mode) && !(is_single() || is_page() || is_author())){
return false;
}
if (in_the_loop()&& adinj_mode_only_show_in($mode) && !(is_single() || is_page() || is_home() || is_author())){
return false;
}
$user = array();
if (is_single() || is_page() || is_home()){
$data = get_the_author_meta('user_login'); // works in and out of the loop
$user[] = $data; //need to make it into array
} else if (is_author()){
$curauth = get_userdata(get_query_var('author'));
$user[] = $curauth->user_login;
} // else author array is empty
return adinj_allowed_in_list($user, $conditions, $mode, 'adinj_author_data');
}
function adinj_allowed_in_id($scope, $ops){
$conditions = adinj_split_comma_list($ops[$scope.'_id_condition_entries']);
if (empty($conditions)) return true;
if (!is_single() && !is_page()){
return true;
}
$postid = -1;
if (in_the_loop()){
global $post;
$postid = $post->ID;
} else {
global $wp_query;
$postid = $wp_query->post->ID;
}
$mode = $ops[$scope.'_id_condition_mode'];
return adinj_allowed_in_list(array($postid), $conditions, $mode, 'adinj_post_id');
}
//function parameters
function adinj_category_nicename($category){ return $category->category_nicename; }
function adinj_tag_slug($tag){ return $tag->slug; }
function adinj_author_data($data){ return $data; }
function adinj_post_id($data){ return $data; }
function adinj_split_comma_list($list){
return preg_split("/[\s,]+/", $list, -1, PREG_SPLIT_NO_EMPTY);
}
function adinj_footer_hook(){
if (is_feed()) return; // TODO feed specific ads
if (adinj_num_footer_ads_to_insert() <= 0) return;
echo adinj_ad_code_footer();
}
function adinj_debug_on(){
$ops = adinj_options();
return $ops['debug_mode'];
}
function adinj_content_hook($content){
if (is_feed()) return $content; // TODO feed specific ads
if (!in_the_loop()) return $content; // Don't insert ads into meta description tags
$ops = adinj_options();
if(empty($ops)){
return $content;
}
$debug_on = $ops['debug_mode'];
$debug = "";
if ($debug_on) echo "";
adinj_upgrade_db_if_necessary();
global $adinj_total_random_ads_used, $adinj_total_top_ads_used, $adinj_total_bottom_ads_used;
if(!is_archive() && (is_page() || is_single())){
// On single page the_content may be called more than once - e.g. for
// description meta tag and for content.
$adinj_total_top_ads_used = 0;
$adinj_total_random_ads_used = 0;
$adinj_total_bottom_ads_used = 0;
}
$reason = adinj_ads_completely_disabled_from_page('in-content', $content);
if ($reason !== false){
return adinj($content, $reason);
}
if ($debug_on && adinj_direct_mode()){
$showads = adshow_show_adverts();
if ($showads !== true){
$debug .= "\nNOADS: ad blocked at run time reason=$showads";
}
}
$ad_include = "";
if (adinj_mfunc_mode()){
$ad_include = adinj_ad_code_include();
}
# Ad sandwich mode
if(is_page() || is_single()){
if(stripos($content, "") !== false) return adinj($ad_include.adinj_ad_code_top().$content.adinj_ad_code_bottom(), "Ads=sandwich" . $debug);
if(stripos($content, "") !== false) return adinj($content.$ad_include.adinj_ad_code_bottom(), "Ads=footer" . $debug);
}
# Get content length for ad placement settings
$rawlength = strlen($content);
$length = 0;
if ($ops['content_length_unit'] == 'all'){
$length = $rawlength;
} else if ($ops['content_length_unit'] == 'viewable'){
$length = strlen(strip_tags($content));
} else {
$length = str_word_count_utf8(strip_tags($content));
}
# Record original paragraph positions
$original_paragraph_positions = array();
$prevpos = -1;
while(($prevpos = stripos($content, ADINJ_PARA, $prevpos+1)) !== false){
$original_paragraph_positions[] = $prevpos + strlen(ADINJ_PARA);
}
$paracount = count($original_paragraph_positions);
if ($debug_on) $debug .= "\nContent length=$length (".$ops['content_length_unit'].") Raw character length=$rawlength Paragraph count=$paracount";
if($paracount == 0) if ($debug_on) $debug .= "\nNo </p> tags found";
$topad = adinj_ad_code_top();
if (empty($topad)) { if ($debug_on) $debug .= "\nNo top ad defined in any of the ad code boxes"; }
$randomad = adinj_ad_code_random();
if (empty($randomad)) { if ($debug_on) $debug .= "\nNo random ad defined in any of the ad code boxes"; }
$bottomad = adinj_ad_code_bottom();
if (empty($bottomad)) { if ($debug_on) $debug .= "\nNo bottom ad defined in any of the ad code boxes"; }
# Positions to insert ads
$top_ad_paragraph = -1;
$random_ad_paragraphs = array();
$bottom_ad_paragraph = -1;
$fixed_top = stripos($content, "");
$fixed_random = stripos($content, "");
$fixed_bottom = stripos($content, "");
# Find top ad position
if ($fixed_top === false){
if (adinj_num_top_ads_to_insert($length, $debug) > 0){
$top_ad_paragraph = adinj_get_paragraph('top', $content, $original_paragraph_positions, $debug);
}
}
if ($debug_on) $debug .= "\nTop ad paragraph: $top_ad_paragraph";
# Find bottom ad position
if ($fixed_bottom === false){
if (adinj_num_bottom_ads_to_insert($length, $debug) > 0){
$bottom_ad_paragraph = adinj_get_paragraph('bottom', $content, $original_paragraph_positions, $debug);
}
if ($bottom_ad_paragraph !== -1){
$bottom_ad_paragraph = $paracount - $bottom_ad_paragraph;
}
}
if ($debug_on) $debug .= "\nBottom ad paragraph: $bottom_ad_paragraph";
# Find random ad positions
if ($fixed_random === false){
$random_ad_paragraphs = adinj_get_random_paragraphs($content, $length, $original_paragraph_positions, $debug);
$random_ads_to_insert_count = sizeof($random_ad_paragraphs);
if ($random_ads_to_insert_count == 0){
if ($debug_on) $debug .= "\nWarning: No random ad injection positions";
}
}
# Insert the adverts into the content. Scan through the paragraph list in reverse order.
$adpos = count($random_ad_paragraphs);
for ($i=$paracount; $i>0; --$i){
if ($i === $bottom_ad_paragraph){
$content = substr_replace($content, $bottomad, $original_paragraph_positions[$i-1], 0);
++$adinj_total_bottom_ads_used;
}
for ($j=$adpos-1; $j>=0; --$j){
$rnd = $random_ad_paragraphs[$j];
if ($i==$rnd){
if (adinj_ticked('rnd_reselect_ad_per_position_in_post')){
$randomad = adinj_ad_code_random();
}
$content = substr_replace($content, $randomad, $original_paragraph_positions[$rnd-1], 0);
++$adinj_total_random_ads_used;
--$adpos;
} else {
break;
}
}
if ($i === $top_ad_paragraph){
$content = substr_replace($content, $topad, $original_paragraph_positions[$i-1], 0);
++$adinj_total_top_ads_used;
}
}
if ($top_ad_paragraph === 0){ // default is special case
$content = $topad.$content;
++$adinj_total_top_ads_used;
}
if ($bottom_ad_paragraph !== -1 && $adinj_total_bottom_ads_used == 0){
$content = $content.$bottomad;
++$adinj_total_bottom_ads_used;
}
if($fixed_top) {
adinj_insert_fixed_ad($content, $topad, 'top', $adinj_total_top_ads_used, $debug);
}
if($fixed_random) {
adinj_insert_fixed_ad($content, $randomad, 'random', $adinj_total_random_ads_used, $debug);
}
if($fixed_bottom) {
adinj_insert_fixed_ad($content, $bottomad, 'bottom', $adinj_total_bottom_ads_used, $debug);
}
$content = $ad_include.$content;
return adinj($content, "Ad Injection in-content injections complete!" . $debug);
}
function adinj_insert_fixed_ad(&$content, $ad, $adname, &$counter, &$debug){
if (!adinj_excluded_by_tick_box($adname.'_')){
$tagname = $adname.'ad';
if (adinj_debug_on()) $debug .= "\n$adname ad position(s) fixed by '$tagname' tag";
$counter += substr_count($content, "");
$content = str_replace("", $ad, $content);
} else {
if (adinj_debug_on()) $debug .= "\nFixed $adname ad excluded by tick box";
}
}
// length here can be raw characters, displayable, or number of words
// returns array of paragraph positions to insert rnd ads into
function adinj_get_random_paragraphs($content, $length, $original_paragraph_positions, &$debug){
$ops = adinj_options();
$debug_on = adinj_debug_on();
$random_ad_paragraphs = array();
$random_start_paragraph = 0;
$random_end_paragraph = 0;
adinj_get_random_ad_start_end_paragraph($content, $original_paragraph_positions, $random_start_paragraph, $random_end_paragraph, $debug);
if ($debug_on) $debug .= "\n1st Injected random ads range starts at: $random_start_paragraph, and ends at: $random_end_paragraph";
$paracount = count($original_paragraph_positions);
$random_end_paragraph = min($random_end_paragraph, $paracount);
if (!adinj_ticked('rnd_allow_ads_on_last_paragraph')){
if ($random_end_paragraph == $paracount) --$random_end_paragraph;
if ($random_end_paragraph == 0){
if ($debug_on) $debug .= "\nNo random ads: no potential inj positions after removing last paragraph position";
return;
}
}
if ($random_start_paragraph <= 0 || $random_end_paragraph <= 0 ||
$random_end_paragraph - $random_start_paragraph < 0){
if ($debug_on) $debug .= "\nWarning: No paragraphs: random_start_paragraph:$random_start_paragraph random_end_paragraph:$random_end_paragraph";
return array();
}
if ($debug_on) $debug .= "\n2nd Injected random ads range starts at: $random_start_paragraph, and ends at: $random_end_paragraph";
$potential_random_ad_paragraphs = range($random_start_paragraph, $random_end_paragraph);
if ($debug_on) $debug .= "\npotential_random_ad_paragraphs:".sizeof($potential_random_ad_paragraphs);
if (sizeof($potential_random_ad_paragraphs) == 0){
if ($debug_on) $debug .= "\nNo random ads: no potential inj positions found in content";
return array();
}
# Checks to see if we can inject random ads
$requested_num_rand_ads_to_insert = adinj_num_rand_ads_to_insert($length, $debug);
if ($debug_on) $debug .= "\nrequested_num_rand_ads_to_insert:$requested_num_rand_ads_to_insert";
if ($requested_num_rand_ads_to_insert <= 0) {
if ($debug_on) $debug .= "\nNo random ads enabled on this post";
return array();
}
$num_rand_ads_to_insert = $requested_num_rand_ads_to_insert;
# We have to put the first ad at the first position we already selected unless the first ad can start 'anywhere'
if ($ops['random_ads_start_mode'] != 'anywhere' && $ops['random_ads_start_mode'] != 'after'){
$random_ad_paragraphs[] = array_shift($potential_random_ad_paragraphs);
--$num_rand_ads_to_insert;
}
# Pick the correct number of random injection points
if (sizeof($potential_random_ad_paragraphs) > 0 && $num_rand_ads_to_insert > 0){
if (!adinj_ticked('multiple_ads_at_same_position')){
// Each ad is inserted into a unique position
if (sizeof($potential_random_ad_paragraphs) < $num_rand_ads_to_insert){
$debug .= "\nNum random ads requested=$requested_num_rand_ads_to_insert. But restricted to ". (sizeof($potential_random_ad_paragraphs) + sizeof($random_ad_paragraphs)) . " due to limited injection points.";
$num_rand_ads_to_insert = sizeof($potential_random_ad_paragraphs);
}
$rand_positions = array_rand(array_flip($potential_random_ad_paragraphs), $num_rand_ads_to_insert);
if ($num_rand_ads_to_insert == 1){
// Add the single value to the array
$random_ad_paragraphs[] = $rand_positions;
} else {
// Merge the values with the array
$random_ad_paragraphs = array_merge($random_ad_paragraphs, $rand_positions);
}
} else {
// Multiple ads may be inserted at the same position
$injections = 0;
while($injections++ < $num_rand_ads_to_insert){
$rnd = array_rand($potential_random_ad_paragraphs);
$random_ad_paragraphs[] = $potential_random_ad_paragraphs[$rnd];
}
}
}
# Sort positions
sort($random_ad_paragraphs);
if ($debug_on){
$injected_list = '';
foreach($random_ad_paragraphs as $pos){
$injected_list .= "$pos ";
}
$debug .= "\nInjected ads at: $injected_list";
}
return $random_ad_paragraphs;
}
// for top/bottom ad
// returns valid paragraph or -1
// will return 0 if the position is 0
function adinj_get_paragraph($op, $content, $original_paragraph_positions, &$debug){ // op is top or bottom
$ops = adinj_options();
$position = $ops[$op.'_ad_position'];
$paracount = count($original_paragraph_positions);
$rawlength = strlen($content);
$ad_paragraph = 0;
if ($position != 0){
if ($ops[$op.'_ad_position_unit'] == 'paragraph'){
if ($paracount < $position){
$ad_paragraph = -1;
if (adinj_debug_on()) $debug .= "\nPost too short for $op ad paracount($paracount) < para-position($position)";
} else {
$ad_paragraph = $position;
}
} else { //unit==character
if ($rawlength < $position){
$ad_paragraph = -1;
if (adinj_debug_on()) $debug .= "\nPost too short for $op ad rawlength($rawlength) < char-position($position)";
} else {
$ad_paragraph = adinj_get_paragraph_from_position($content, $position, $original_paragraph_positions, 1);
}
}
}
return (int)$ad_paragraph;
}
// Return a valid paragraph or -1
function adinj_get_paragraph_from_position($content, $offset, $original_paragraph_positions, $adjust=0, $mode='fromstart'){
$paracount = count($original_paragraph_positions);
if ($paracount == 0) return -1;
$contentlength = strlen($content);
if ($offset > $contentlength) return -1;
if ($mode == 'fromend') $offset = $contentlength - $offset;
$position = stripos($content, ADINJ_PARA, $offset);
if ($position === false) return -1;
$position += strlen(ADINJ_PARA);
for ($i=0; $i<$paracount; ++$i){
if ($position == $original_paragraph_positions[$i]) {
$paragraph = $i+$adjust;
return min($paragraph, $paracount);
}
}
return -1;
}
// Can return 0 as the end paragraph - meaning no random ads TODO check
function adinj_get_random_ad_start_end_paragraph($content, $original_paragraph_positions, &$start, &$end, &$debug){
$ops = adinj_options();
$debug_on = adinj_debug_on();
$paracount = count($original_paragraph_positions);
if ($paracount == 0){
$start = -1;
$end = -1;
return;
}
// initialise to 'anywhere' max range
$start = 1;
$end = $paracount;
// todo docs: should include these tags on same line as paragraph or can affect paragraph count
$tagposition = stripos($content, '');
if ($tagposition === false) $tagposition = stripos($content, '');
if ($tagposition === false){
$start = adinj_get_random_ad_paragraph($content, $original_paragraph_positions, 'start', $start, $debug);
} else {
$start = adinj_get_paragraph_from_position($content, $tagposition, $original_paragraph_positions, 1);
if ($debug_on) $debug .= "\nFound hardcoded start tag. Starting ads at paragraph $start";
}
$tagposition = stripos($content, '');
if ($tagposition === false) $tagposition = stripos($content, '');
if ($tagposition === false){
$end = adinj_get_random_ad_paragraph($content, $original_paragraph_positions, 'end', $end, $debug);
} else {
$end = adinj_get_paragraph_from_position($content, $tagposition, $original_paragraph_positions, 0);
if ($debug_on) $debug .= "\nFound hardcoded end tag. Ending ads at paragraph $end";
}
}
// Returns -1 if paragraph can't be located
function adinj_get_random_ad_paragraph($content, $original_paragraph_positions, $opname, $default, &$debug){
$ops = adinj_options();
$mode = $ops['random_ads_'.$opname.'_mode'];
$paracount = count($original_paragraph_positions);
$rawlength = strlen($content);
$paragraph = -1;
if ($mode == 'anywhere'){
$paragraph = $default;
} else if ($mode == 'at' || $mode == 'after'){
$position = $ops['random_ads_'.$opname.'_at'];
$unit = $ops['random_ads_'.$opname.'_unit'];
$direction = $ops['random_ads_'.$opname.'_direction'];
if ($unit == 'character'){
$adjust = ($direction == 'fromend') ? 0 : 1;
$paragraph = adinj_get_paragraph_from_position($content, $position, $original_paragraph_positions, $adjust, $direction);
if ($opname == 'end' && $direction == 'fromstart' && $paragraph == -1){
$paragraph = $paracount;
}
} else {
// paragraph is same as value in UI
$paragraph = $position;
if ($direction == 'fromend'){
$paragraph = $paracount - $paragraph;
}
}
} else if ($mode == 'middleback'){
$pos = round(($rawlength / 2), 0);
$paragraph = adinj_get_paragraph_from_position($content, $pos, $original_paragraph_positions, 0);
} else if ($mode == 'middleforward'){
$pos = round(($rawlength / 2), 0);
$paragraph = adinj_get_paragraph_from_position($content, $pos, $original_paragraph_positions, 1);
} else if ($mode == 'middleparaback'){
$val = ($paracount % 2 == 0) ? 0 : 0.5;
$paragraph = intval(round((($paracount-$val) / 2), 0)); // todo test with 0 and 1 paragraphs
} else if ($mode == 'middleparaforward'){
$paragraph = intval(round(($paracount / 2), 0));
} else if ($mode == 'twothirds'){
$pos = round(($rawlength * 0.66), 0);
$paragraph = adinj_get_paragraph_from_position($content, $pos, $original_paragraph_positions, 1);
}
if ($paragraph == -1){
if ($debug_on) $debug .= "\nParagraph not found - mode:$randomaftermode op:$opname";
}
return $paragraph;
}
//http://php.net/manual/en/function.str-word-count.php
define("WORD_COUNT_MASK", "/\p{L}[\p{L}\p{Mn}\p{Pd}'\x{2019}]*/u");
function str_word_count_utf8($str){
if (@preg_match('/\pL/u', 'a') == 1) { // check if utf8 support is compile in
return preg_match_all(WORD_COUNT_MASK, $str, $matches);
} else {
return str_word_count($str);
}
}
function adinj_ads_filtered_out($adname, &$debug){
$ops = adinj_options();
if (!adinj_allowed_in_category($adname, $ops)){
$debug .= "\n$adname ad filtered out by categories";
return true;
}
if (!adinj_allowed_in_tag($adname, $ops)){
$debug .= "\n$adname ad filtered out by tags";
return true;
}
if (!adinj_allowed_in_author($adname, $ops)){
$debug .= "\n$adname ad filtered out by authors";
return true;
}
if (!adinj_allowed_in_id($adname, $ops)){
$debug .= "\n$adname ad filtered out by ids";
return true;
}
return false;
}
function adinj_get_current_page_type_prefix(){
if (is_home()) return 'home_';
if (is_archive()) return 'archive_';
return '';
}
function adinj_num_top_ads_to_insert($content_length, &$debug){
if (adinj_excluded_by_tick_box('top_')) return 0;
$ops = adinj_options();
$prefix = adinj_get_current_page_type_prefix();
$max_num_ads_to_insert = 0;
if (is_single() || is_page()){
$max_num_ads_to_insert = 1;
} else {
global $adinj_total_top_ads_used;
$max_num_ads_to_insert = $ops[$prefix.'max_num_top_ads_per_page'] - $adinj_total_top_ads_used;
}
if ($max_num_ads_to_insert <= 0) return 0;
if (adinj_ads_filtered_out('top', $debug)) return 0;
$val = $ops[$prefix.'top_ad_if_longer_than'];
if (adinj_not_set($val) || adinj_true_if($content_length, '>', $val)){
return 1;
}
$debug .= "\nNo top ad because post length < $val";
return 0;
}
function adinj_num_bottom_ads_to_insert($content_length, &$debug){
if (adinj_excluded_by_tick_box('bottom_')) return 0;
$ops = adinj_options();
$prefix = adinj_get_current_page_type_prefix();
$max_num_ads_to_insert = 0;
if (is_single() || is_page()){
$max_num_ads_to_insert = 1;
} else {
global $adinj_total_bottom_ads_used;
$max_num_ads_to_insert = $ops[$prefix.'max_num_bottom_ads_per_page'] - $adinj_total_bottom_ads_used;
}
if ($max_num_ads_to_insert <= 0) return 0;
if (adinj_ads_filtered_out('bottom', $debug)) return 0;
$val = $ops[$prefix.'bottom_ad_if_longer_than'];
if (adinj_not_set($val) || adinj_true_if($content_length, '>', $val)){
return 1;
}
$debug .= "\nNo bottom ad because post length < $val";
return 0;
}
function adinj_num_rand_ads_to_insert($content_length, &$debug){
if (adinj_excluded_by_tick_box('random_')) return 0;
global $adinj_total_random_ads_used; // a page can be more than one post
$ops = adinj_options();
$max_ads_in_post = 0;
$prefix = adinj_get_current_page_type_prefix();
if (is_single() || is_page()){
$max_num_rand_ads_to_insert = $ops['max_num_of_ads'] - $adinj_total_random_ads_used;
$max_ads_in_post = $max_num_rand_ads_to_insert;
} else if (is_home() || is_archive()){
$max_num_rand_ads_to_insert = $ops[$prefix.'max_num_random_ads_per_page'] - $adinj_total_random_ads_used;
$max_ads_in_post = $ops[$prefix.'max_num_random_ads_per_post'];
} else {
$debug .= "\nNo random ads because not correct page type";
return 0;
}
$max_num_rand_ads_to_insert = min($max_num_rand_ads_to_insert, $max_ads_in_post);
if ($max_num_rand_ads_to_insert <= 0) {
$debug .= "\nNo random ads to insert in this post";
return 0;
}
if (adinj_ads_filtered_out('random', $debug)) return 0;
$length = $content_length;
$conditionlength = $ops[$prefix.'no_random_ads_if_shorter_than'];
if (adinj_true_if($length, '<', $conditionlength)){
$debug .= "\nNo random ads because post length < $conditionlength";
return 0;
}
$conditionlength = $ops[$prefix.'one_ad_if_shorter_than'];
if (adinj_true_if($length, '<', $conditionlength)){
$debug .= "\nOnly 1 random ad because post length < $conditionlength";
return 1;
}
$conditionlength = $ops[$prefix.'two_ads_if_shorter_than'];
if (adinj_true_if($length, '<', $conditionlength)){
$debug .= "\nLimit on random ads because post length < $conditionlength";
return min(2, $max_num_rand_ads_to_insert);
}
$conditionlength = $ops[$prefix.'three_ads_if_shorter_than'];
if (adinj_true_if($length, '<', $conditionlength)){
$debug .= "\nLimit on random ads because post length < $conditionlength";
return min(3, $max_num_rand_ads_to_insert);
}
return $max_num_rand_ads_to_insert;
}
function adinj_num_footer_ads_to_insert(){
if (adinj_excluded_by_tick_box('footer_')) return 0;
$reason = adinj_ads_completely_disabled_from_page('footer', $content);
if ($reason !== false){
return 0;
}
$ops = adinj_options();
if (adinj_ads_filtered_out('footer', $debug)) return 0;
return 1;
}
function adinj_true_if($rule_value, $condition, $content_length){
if ($condition == '>'){
return ($rule_value >= $content_length);
} else if ($condition == '<'){
return ($rule_value <= $content_length);
} else {
die("adinj_true_if bad condition: $condition");
}
}
function adinj_direct_mode(){
$ops = adinj_options();
return ($ops['ad_insertion_mode'] != 'mfunc');
}
function adinj_mfunc_mode(){
$ops = adinj_options();
return ($ops['ad_insertion_mode'] == 'mfunc');
}
function adinj_rule_disabled($value){
return "$value" == ADINJ_RULE_DISABLED || "$value" == ADINJ_DISABLED || "$value" == 'd' || "$value" == '';
}
function adinj_not_set($value){
return adinj_rule_disabled($value);
}
function adinj_ticked($option, $ops=array()){
if (empty($ops)) $ops = adinj_options();
if (!empty($ops[$option]) && $ops[$option] != 'off') return 'checked="checked"';
return false;
}
function adinj_upgrade_db_if_necessary(){
$cached_options = adinj_options();
if(empty($cached_options)){
// 1st Install.
require_once(ADINJ_PATH . '/ad-injection-admin.php');
adinj_install_db();
return;
}
$cached_dbversion = adinj_db_version($cached_options);
if (ADINJ_DB_VERSION != $cached_dbversion){
require_once(ADINJ_PATH . '/ad-injection-admin.php');
adinj_upgrade_db();
}
}
// Main options table and widgets could have different db version at the same
// time depending on when the settings were last saved
function adinj_db_version($ops){
if (!array_key_exists('db_version', $ops)){
return 1;
} else {
return $ops['db_version'];
}
}
// template ads
function adinj_print_ad($adname=''){
$reason = adinj_ads_completely_disabled_from_page('template', "");
if ($reason !== false){
return;
}
if (adinj_excluded_by_tick_box('template_')) return;
if ($adname == 'random'){
echo adinj_ad_code_random();
} else if ($adname == 'top'){
echo adinj_ad_code_top();
} else if ($adname == 'bottom'){
echo adinj_ad_code_bottom();
} else if ($adname == 'footer'){
echo adinj_ad_code_footer();
} else if (preg_match("/.+\.txt/i", $adname)){
adshow_display_ad_file_v2($adname);
}
}
// Widget support
require_once('ad-injection-widget.php');
add_action('widgets_init', 'adinj_widgets_init');
function adinj_widgets_init() {
register_widget('Ad_Injection_Widget');
}
// activate
register_activation_hook(__FILE__, 'adinj_activate_hook');
// Content injection
add_action('wp_enqueue_scripts', 'adinj_addsevjs_hook');
add_filter('the_content', 'adinj_content_hook'); // TODO allow priority to be changed? e.g. TheTravelTheme is setting its formatting at priority 99
add_action('wp_footer', 'adinj_footer_hook');
add_action('wp_footer', 'adinj_print_referrers_hook');
?>