gabetu

AdSense post feed injection

Nov 12th, 2025
753
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 14.87 KB | None | 0 0
  1. // ============================================================================
  2. // AdSense Direct Injection System
  3. // ============================================================================
  4. // Code Snippets Compatible Version
  5. // ============================================================================
  6.  
  7. // Add AdSense Script to Head
  8. add_action('wp_head', 'add_adsense_injection_script', 1);
  9. function add_adsense_injection_script() {
  10.     echo '<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-XXXXXXXXXXXXXXXX" crossorigin="anonymous"></script>';
  11. }
  12.  
  13. // Main Ad Injection Function
  14. add_action('wp_enqueue_scripts', 'enqueue_adsense_feed_injection');
  15. function enqueue_adsense_feed_injection() {
  16.    
  17.     // Page Detection - Only load on pages with feeds
  18.     $should_load = false;
  19.    
  20.     //if (is_archive() || is_search() || is_home() || is_front_page()) {
  21.     //    $should_load = true;
  22.     //}
  23.    
  24.     //if (is_singular(array('post', 'place', 'event', 'job'))) {
  25.     //    $should_load = true;
  26.     //}
  27.    
  28.     $current_page_slug = get_post_field('post_name', get_the_ID());
  29.     $feed_page_slugs = array('explore');
  30.     if (in_array($current_page_slug, $feed_page_slugs)) {
  31.         $should_load = true;
  32.     }
  33.    
  34.     $should_load = apply_filters('direct_ads_should_load', $should_load);
  35.    
  36.     if (!$should_load) {
  37.         return;
  38.     }
  39.    
  40.     //wp_enqueue_script('jquery');
  41.  
  42.     // ========================================================================
  43.     // CONFIGURE YOUR ADSENSE ADS HERE
  44.     // ========================================================================
  45.     $multi_feed_config = array(
  46.        
  47.         'placesarchive' => array(
  48.             'selector' => '.placesfeed',
  49.             //'interval' => 4,
  50.             'positions' => array(1, 11, 21),
  51.             'ads' => array(
  52.                 array(
  53.                     'type' => 'adsense',
  54.                     'client' => 'ca-pub-XXXXXXXXXXXXXXXX',
  55.                     'slot' => 'XXXXXXXXXX',
  56.                     'format' => 'fluid', // or 'auto', 'rectangle', 'horizontal', 'vertical'
  57.                     'layout_key' => '-6r+di+5g-2m-8y', // copy from AdSense
  58.                     'priority' => 3,
  59.                     'enabled' => true
  60.                 ),
  61.                 array(
  62.                     'type' => 'adsense',
  63.                     'client' => 'ca-pub-XXXXXXXXXXXXXXXX',
  64.                     'slot' => 'XXXXXXXXXX',
  65.                     'format' => 'fluid',
  66.                     'layout_key' => '',
  67.                     'priority' => 2,
  68.                     'enabled' => true
  69.                 ),
  70.                 array(
  71.                     'type' => 'adsense',
  72.                     'client' => 'ca-pub-XXXXXXXXXXXXXXXX',
  73.                     'slot' => 'XXXXXXXXXX',
  74.                     'format' => 'fluid',
  75.                     'layout_key' => '',
  76.                     'priority' => 1,
  77.                     'enabled' => true
  78.                 ),
  79.             )
  80.         ),
  81.        
  82.         'eventsarchive' => array(
  83.             'selector' => '.eventsfeed',
  84.             'interval' => 4,
  85.             //'positions' => array(2, 8, 12),
  86.             'ads' => array(
  87.                 array(
  88.                     'type' => 'adsense',
  89.                     'client' => 'ca-pub-XXXXXXXXXXXXXXXX',
  90.                     'slot' => 'XXXXXXXXXX',
  91.                     'format' => 'fluid',
  92.                     'layout_key' => '',
  93.                     'priority' => 3,
  94.                     'enabled' => true
  95.                 ),
  96.                 array(
  97.                     'type' => 'adsense',
  98.                     'client' => 'ca-pub-XXXXXXXXXXXXXXXX',
  99.                     'slot' => 'XXXXXXXXXX',
  100.                     'format' => 'fluid',
  101.                     'layout_key' => '',
  102.                     'priority' => 2,
  103.                     'enabled' => true
  104.                 ),
  105.                 array(
  106.                     'type' => 'adsense',
  107.                     'client' => 'ca-pub-XXXXXXXXXXXXXXXX',
  108.                     'slot' => 'XXXXXXXXXX',
  109.                     'format' => 'fluid',
  110.                     'layout_key' => '',
  111.                     'priority' => 1,
  112.                     'enabled' => true
  113.                 ),
  114.             )
  115.         ),
  116.        
  117.         // add your own feed here
  118.  
  119.     );
  120.  
  121.     // Process feeds
  122.     $processed_feeds = array();
  123.    
  124.     foreach ($multi_feed_config as $feed_key => $feed_config) {
  125.         $ads = array();
  126.         $use_positions_mode = isset($feed_config['positions']) && is_array($feed_config['positions']);
  127.         $interval = isset($feed_config['interval']) ? $feed_config['interval'] : 0;
  128.         $max_ads = isset($feed_config['max_ads']) ? $feed_config['max_ads'] : 999;
  129.  
  130.         if (isset($feed_config['ads']) && is_array($feed_config['ads'])) {
  131.             foreach ($feed_config['ads'] as $index => $ad_config) {
  132.                 if (!isset($ad_config['enabled']) || !$ad_config['enabled']) {
  133.                     continue;
  134.                 }
  135.                 if (!isset($ad_config['type'])) {
  136.                     continue;
  137.                 }
  138.  
  139.                 $ad_data = array(
  140.                     'type' => $ad_config['type'],
  141.                     'priority' => isset($ad_config['priority']) ? $ad_config['priority'] : 0,
  142.                     'index' => $index
  143.                 );
  144.  
  145.                 if ($ad_config['type'] === 'adsense') {
  146.                     if (!isset($ad_config['client']) || !isset($ad_config['slot'])) {
  147.                         continue;
  148.                     }
  149.                     $ad_data['client'] = $ad_config['client'];
  150.                     $ad_data['slot'] = $ad_config['slot'];
  151.                     $ad_data['format'] = isset($ad_config['format']) ? $ad_config['format'] : 'auto';
  152.                     if (isset($ad_config['layout_key'])) {
  153.                         $ad_data['layout_key'] = $ad_config['layout_key'];
  154.                     }
  155.                 } elseif ($ad_config['type'] === 'html') {
  156.                     if (!isset($ad_config['content'])) {
  157.                         continue;
  158.                     }
  159.                     $ad_data['content'] = $ad_config['content'];
  160.                 } else {
  161.                     continue;
  162.                 }
  163.                
  164.                 $ads[] = $ad_data;
  165.             }
  166.         }
  167.  
  168.         usort($ads, function($a, $b) {
  169.             return $b['priority'] - $a['priority'];
  170.         });
  171.  
  172.         $processed_feeds[$feed_key] = array(
  173.             'selector' => $feed_config['selector'],
  174.             'ads' => $ads,
  175.             'config' => array(
  176.                 'mode' => $use_positions_mode ? 'positions' : 'interval',
  177.                 'interval' => $interval,
  178.                 'positions' => $use_positions_mode ? $feed_config['positions'] : array(),
  179.                 'max_ads' => $max_ads
  180.             )
  181.         );
  182.     }
  183.  
  184.     if (!empty($processed_feeds)) {
  185.         $json_data = wp_json_encode($processed_feeds);
  186.         wp_add_inline_script('jquery', 'var directAdsFeedData = ' . $json_data . ';');
  187.        
  188.         if (!defined('DONOTCACHEPAGE')) {
  189.             define('DONOTCACHEPAGE', true);
  190.         }
  191.     }
  192. }
  193.  
  194. // Output JavaScript in Footer
  195. add_action('wp_footer', 'output_adsense_injection_javascript', 20);
  196. function output_adsense_injection_javascript() {
  197.     ?>
  198.     <script>
  199.     jQuery(document).ready(function($) {
  200.         if (!window.directAdsFeedData) {
  201.             return;
  202.         }
  203.        
  204.         var feedStates = {};
  205.         var feedObservers = {};
  206.        
  207.         $.each(window.directAdsFeedData, function(feedKey, feedData) {
  208.             var $feedContainer = $(feedData.selector);
  209.             if (!$feedContainer.length) {
  210.                 return;
  211.             }
  212.            
  213.             feedStates[feedKey] = {
  214.                 adIndex: 0,
  215.                 usedPositions: {},
  216.                 totalInjectedCount: 0
  217.             };
  218.            
  219.             setupMutationObserver(feedKey, feedData, $feedContainer[0]);
  220.             insertAds(feedKey, feedData, $feedContainer);
  221.         });
  222.        
  223.         window.resetAndRunAdInjection = function(feedKey) {
  224.             if (feedKey && window.directAdsFeedData[feedKey]) {
  225.                 resetFeedState(feedKey);
  226.                 var feedData = window.directAdsFeedData[feedKey];
  227.                 var $feedContainer = $(feedData.selector);
  228.                 if ($feedContainer.length) {
  229.                     insertAds(feedKey, feedData, $feedContainer);
  230.                 }
  231.             } else {
  232.                 $.each(window.directAdsFeedData, function(key, feedData) {
  233.                     resetFeedState(key);
  234.                     var $feedContainer = $(feedData.selector);
  235.                     if ($feedContainer.length) {
  236.                         insertAds(key, feedData, $feedContainer);
  237.                     }
  238.                 });
  239.             }
  240.         };
  241.        
  242.         function resetFeedState(feedKey) {
  243.             feedStates[feedKey] = {
  244.                 adIndex: 0,
  245.                 usedPositions: {},
  246.                 totalInjectedCount: 0
  247.             };
  248.         }
  249.        
  250.         function insertAds(feedKey, feedData, $feedContainer) {
  251.             var ads = feedData.ads || [];
  252.             var config = feedData.config || {mode: 'interval', interval: 4, positions: [], max_ads: 999};
  253.             var state = feedStates[feedKey];
  254.             var postPreviews = $feedContainer.find('.ts-preview:not(.injected-ad)');
  255.             var positionsToInject = [];
  256.            
  257.             if (config.mode === 'positions' && config.positions.length > 0) {
  258.                 positionsToInject = config.positions.slice();
  259.             } else if (config.mode === 'interval' && config.interval > 0) {
  260.                 for (var i = config.interval; i <= postPreviews.length; i += config.interval) {
  261.                     positionsToInject.push(i);
  262.                     if (positionsToInject.length >= config.max_ads) break;
  263.                 }
  264.             }
  265.            
  266.             postPreviews.each(function(index) {
  267.                 var postNumber = index + 1;
  268.                 if (state.usedPositions[postNumber]) {
  269.                     return;
  270.                 }
  271.                 if (positionsToInject.indexOf(postNumber) !== -1) {
  272.                     if (state.adIndex < ads.length && state.totalInjectedCount < config.max_ads) {
  273.                         var adConfig = ads[state.adIndex];
  274.                         if (!$(this).next().hasClass('injected-ad')) {
  275.                             var $adBlock = createAdBlock(adConfig, feedKey, postNumber);
  276.                             $(this).after($adBlock);
  277.                             state.usedPositions[postNumber] = true;
  278.                             state.totalInjectedCount++;
  279.                             state.adIndex++;
  280.                             setTimeout(function() {
  281.                                 initializeAd($adBlock, adConfig, feedKey, postNumber);
  282.                             }, 300);
  283.                         }
  284.                     }
  285.                 }
  286.             });
  287.         }
  288.        
  289.         function createAdBlock(adConfig, feedKey, position) {
  290.             var $container = $('<div>', {
  291.                 'class': 'ts-preview injected-ad',
  292.                 'data-ad-type': adConfig.type,
  293.                 'data-feed-key': feedKey,
  294.                 'data-position': position
  295.             });
  296.            
  297.             var $adLabel = $('<small>', {
  298.                 'class': 'admark',
  299.                 html: 'SPONSORED CONTENT'
  300.             });
  301.             $container.append($adLabel);
  302.            
  303.             if (adConfig.type === 'adsense') {
  304.                 var adsenseAttrs = {
  305.                     'class': 'adsbygoogle',
  306.                     'data-ad-client': adConfig.client,
  307.                     'data-ad-slot': adConfig.slot,
  308.                     'data-ad-format': adConfig.format,
  309.                     'data-full-width-responsive': 'true',
  310.                     css: {display: 'block'}
  311.                 };
  312.                 if (adConfig.layout_key) {
  313.                     adsenseAttrs['data-ad-layout-key'] = adConfig.layout_key;
  314.                 }
  315.                 var $adsenseIns = $('<ins>', adsenseAttrs);
  316.                 $container.append($adsenseIns);
  317.             } else if (adConfig.type === 'html') {
  318.                 var $htmlContent = $('<div>', {
  319.                     'class': 'html-ad-container',
  320.                     html: adConfig.content
  321.                 });
  322.                 $container.append($htmlContent);
  323.             }
  324.            
  325.             return $container;
  326.         }
  327.        
  328.         function initializeAd($adBlock, adConfig, feedKey, position) {
  329.             if (adConfig.type === 'adsense') {
  330.                 initializeAdSenseAd($adBlock, feedKey, position);
  331.             }
  332.         }
  333.        
  334.         function initializeAdSenseAd($adBlock, feedKey, position) {
  335.             var $adsenseIns = $adBlock.find('.adsbygoogle');
  336.             if ($adsenseIns.length === 0) {
  337.                 return;
  338.             }
  339.             if ($adsenseIns.data('adsbygoogle-status')) {
  340.                 return;
  341.             }
  342.             try {
  343.                 (window.adsbygoogle = window.adsbygoogle || []).push({});
  344.             } catch (e) {
  345.                 console.error('AdSense init failed:', e);
  346.             }
  347.         }
  348.        
  349.         function setupMutationObserver(feedKey, feedData, feedContainer) {
  350.             if (feedObservers[feedKey]) {
  351.                 feedObservers[feedKey].disconnect();
  352.             }
  353.             try {
  354.                 feedObservers[feedKey] = new MutationObserver(function(mutationsList) {
  355.                     var isReset = false;
  356.                     for (var i = 0; i < mutationsList.length; i++) {
  357.                         var mutation = mutationsList[i];
  358.                         if (mutation.type === 'childList' && mutation.removedNodes.length > 0) {
  359.                             var removedPreviews = Array.from(mutation.removedNodes).some(function(node) {
  360.                                 return node.nodeType === 1 && node.classList.contains('ts-preview');
  361.                             });
  362.                             if (removedPreviews) {
  363.                                 isReset = true;
  364.                                 break;
  365.                             }
  366.                         }
  367.                     }
  368.                     if (isReset) {
  369.                         resetFeedState(feedKey);
  370.                     }
  371.                     var $feedContainer = $(feedData.selector);
  372.                     if ($feedContainer.length) {
  373.                         insertAds(feedKey, feedData, $feedContainer);
  374.                     }
  375.                 });
  376.                 feedObservers[feedKey].observe(feedContainer, {childList: true, subtree: true});
  377.             } catch (e) {
  378.                 console.error('MutationObserver failed:', e);
  379.             }
  380.         }
  381.        
  382.         $(document).on('voxel:search-results-updated', function() {
  383.             window.resetAndRunAdInjection();
  384.         });
  385.     });
  386.     </script>
  387.     <?php
  388. }
Tags: voxel postfeed
Advertisement
Add Comment
Please, Sign In to add comment