class-ad-type-adsense.php
270 lines
| 1 | <?php |
| 2 | |
| 3 | /** |
| 4 | * Advanced Ads dfp Ad Type |
| 5 | * |
| 6 | * @package Advanced_Ads |
| 7 | * @author Thomas Maier <thomas.maier@webgilde.com> |
| 8 | * @license GPL-2.0+ |
| 9 | * @link http://webgilde.com |
| 10 | * @copyright 2015 Thomas Maier, webgilde GmbH |
| 11 | * |
| 12 | * Class containing information about the adsense ad type |
| 13 | * |
| 14 | * see also includes/class-ad-type-abstract.php for basic object |
| 15 | * |
| 16 | */ |
| 17 | class Advanced_Ads_Ad_Type_Adsense extends Advanced_Ads_Ad_Type_Abstract { |
| 18 | |
| 19 | /** |
| 20 | * ID - internal type of the ad type |
| 21 | * |
| 22 | * must be static so set your own ad type ID here |
| 23 | * use slug like format, only lower case, underscores and hyphens |
| 24 | * |
| 25 | * @since 1.4 |
| 26 | */ |
| 27 | public $ID = 'adsense'; |
| 28 | |
| 29 | /** |
| 30 | * set basic attributes |
| 31 | * |
| 32 | * @since 1.4 |
| 33 | */ |
| 34 | public function __construct() { |
| 35 | $this->title = __( 'AdSense ad', 'advanced-ads' ); |
| 36 | $this->description = __( 'Use ads from your Google AdSense account', 'advanced-ads' ); |
| 37 | $this->parameters = array( |
| 38 | 'content' => '' |
| 39 | ); |
| 40 | } |
| 41 | |
| 42 | /** |
| 43 | * output for the ad parameters metabox |
| 44 | * |
| 45 | * this will be loaded using ajax when changing the ad type radio buttons |
| 46 | * echo the output right away here |
| 47 | * name parameters must be in the "advanced_ads" array |
| 48 | * |
| 49 | * @param obj $ad ad object |
| 50 | * @since 1.4 |
| 51 | */ |
| 52 | public function render_parameters($ad) { |
| 53 | $content = (string) ( isset( $ad->content ) ? $ad->content : '' ); |
| 54 | $unit_id = ''; |
| 55 | $unit_code = ''; |
| 56 | $unit_type = ''; |
| 57 | $unit_width = 0; |
| 58 | $unit_height = 0; |
| 59 | $json_content = ''; |
| 60 | $unit_resize = ''; |
| 61 | $extra_params = array( |
| 62 | 'default_width' => '', |
| 63 | 'default_height' => '', |
| 64 | 'at_media' => array(), |
| 65 | ); |
| 66 | |
| 67 | $db = Advanced_Ads_AdSense_Data::get_instance(); |
| 68 | $pub_id = trim( $db->get_adsense_id() ); |
| 69 | |
| 70 | // check pub_id for errors |
| 71 | $pub_id_errors = false; |
| 72 | if( $pub_id !== '' && 0 !== strpos( $pub_id, 'pub-' )){ |
| 73 | $pub_id_errors = __( 'The Publisher ID has an incorrect format. (must start with "pub-")', 'advanced-ads' ); |
| 74 | } |
| 75 | |
| 76 | if ( trim($content) !== '' ) { |
| 77 | |
| 78 | $json_content = stripslashes( $content ); |
| 79 | |
| 80 | // get json content striped by slashes |
| 81 | $content = json_decode( stripslashes( $content ) ); |
| 82 | |
| 83 | if ( isset($content->unitType) ) { |
| 84 | $content->json = $json_content; |
| 85 | $unit_type = $content->unitType; |
| 86 | $unit_code = $content->slotId; |
| 87 | $layout = isset( $content->layout ) ? $content->layout : ''; |
| 88 | $layout_key = isset( $content->layout_key ) ? $content->layout_key : ''; |
| 89 | |
| 90 | if ( 'responsive' != $content->unitType && 'link-responsive' != $content->unitType && 'matched-content' != $content->unitType ) { |
| 91 | // Normal ad unit |
| 92 | $unit_width = $ad->width; |
| 93 | $unit_height = $ad->height; |
| 94 | } else { |
| 95 | // Responsive && matched content |
| 96 | $unit_resize = (isset($content->resize)) ? $content->resize : 'auto'; |
| 97 | if ( 'auto' != $unit_resize ) { |
| 98 | $extra_params = apply_filters( 'advanced-ads-gadsense-ad-param-data', $extra_params, $content, $ad ); |
| 99 | } |
| 100 | } |
| 101 | if ( ! empty($pub_id) ) { |
| 102 | $unit_id = 'ca-' . $pub_id . ':' . $unit_code; |
| 103 | } |
| 104 | } |
| 105 | } |
| 106 | |
| 107 | if( '' === trim( $pub_id ) && '' !== trim( $unit_code ) ){ |
| 108 | $pub_id_errors = __( 'Your AdSense Publisher ID is missing.', 'advanced-ads' ); |
| 109 | } |
| 110 | |
| 111 | $default_template = GADSENSE_BASE_PATH . 'admin/views/adsense-ad-parameters.php'; |
| 112 | /** |
| 113 | * Inclusion of other UI template is done here. The content is passed in order to allow the inclusion of different |
| 114 | * templates file, depending of the ad. It's up to the developer to verify that $content is not an empty |
| 115 | * variable (which is the case for a new ad). |
| 116 | * |
| 117 | * Inclusion of .js and .css files for the ad creation/editon page are done by another hook. See |
| 118 | * 'advanced-ads-gadsense-ad-param-script' and 'advanced-ads-gadsense-ad-param-style' in "../admin/class-gadsense-admin.php". |
| 119 | */ |
| 120 | $template = apply_filters( 'advanced-ads-gadsense-ad-param-template', $default_template, $content ); |
| 121 | |
| 122 | require $template; |
| 123 | } |
| 124 | |
| 125 | /** |
| 126 | * sanitize content field on save |
| 127 | * |
| 128 | * @param str $content ad content |
| 129 | * @return str $content sanitized ad content |
| 130 | * @since 1.0.0 |
| 131 | */ |
| 132 | public function sanitize_content($content = '') { |
| 133 | return $content = wp_unslash( $content ); |
| 134 | } |
| 135 | |
| 136 | /** |
| 137 | * prepare the ads frontend output |
| 138 | * |
| 139 | * @param obj $ad ad object |
| 140 | * @return str $content ad content prepared for frontend output |
| 141 | * @since 1.0.0 |
| 142 | */ |
| 143 | public function prepare_output($ad) { |
| 144 | global $gadsense; |
| 145 | |
| 146 | $content = json_decode( stripslashes( $ad->content ) ); |
| 147 | |
| 148 | if( isset( $ad->args['wp_the_query']['is_404'] ) |
| 149 | && $ad->args['wp_the_query']['is_404'] |
| 150 | && ! defined( 'ADVADS_ALLOW_ADSENSE_ON_404' ) ){ |
| 151 | return ''; |
| 152 | } |
| 153 | |
| 154 | $output = ''; |
| 155 | $db = Advanced_Ads_AdSense_Data::get_instance(); |
| 156 | $pub_id = $db->get_adsense_id(); |
| 157 | $limit_per_page = $db->get_limit_per_page(); |
| 158 | |
| 159 | if ( ! isset($content->unitType) || empty($pub_id) ) { |
| 160 | return $output; } |
| 161 | // deprecated since the adsbygoogle.js file is now always loaded |
| 162 | if ( ! isset($gadsense['google_loaded']) || ! $gadsense['google_loaded'] ) { |
| 163 | $gadsense['google_loaded'] = true; |
| 164 | } |
| 165 | |
| 166 | //check if passive cb is used |
| 167 | if ( isset( $gadsense['adsense_count'] ) ) { |
| 168 | $gadsense['adsense_count']++; |
| 169 | } else { |
| 170 | $gadsense['adsense_count'] = 1; |
| 171 | } |
| 172 | |
| 173 | if ( $limit_per_page && 3 < $gadsense['adsense_count'] && $ad->global_output ) { |
| 174 | // The maximum allowed adSense ad per page count is 3 (according to the current Google AdSense TOS). |
| 175 | return ''; |
| 176 | } |
| 177 | |
| 178 | $output = apply_filters( 'advanced-ads-gadsense-output', false, $ad, $pub_id, $content ); |
| 179 | if ( $output !== false ) { |
| 180 | return $output; |
| 181 | } elseif ( advads_is_amp() ) { |
| 182 | // Prevent output on AMP pages. |
| 183 | return ''; |
| 184 | } |
| 185 | |
| 186 | $output = ''; |
| 187 | |
| 188 | // build static normal content ads first |
| 189 | if ( ! in_array( $content->unitType, array( 'responsive', 'link-responsive', 'matched-content', 'in-article', 'in-feed' ) ) ) { |
| 190 | $output .= '<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>' . "\n"; |
| 191 | $output .= '<ins class="adsbygoogle" '; |
| 192 | $output .= 'style="display:inline-block;width:' . $ad->width . 'px;height:' . $ad->height . 'px;" ' . "\n"; |
| 193 | $output .= 'data-ad-client="ca-' . $pub_id . '" ' . "\n"; |
| 194 | $output .= 'data-ad-slot="' . $content->slotId . '"'; |
| 195 | // ad type for static link unit |
| 196 | if( 'link' == $content->unitType ){ |
| 197 | $output .= "\n" . 'data-ad-format="link"'; |
| 198 | } |
| 199 | $output .= '></ins> ' . "\n"; |
| 200 | $output .= '<script> ' . "\n"; |
| 201 | $output .= '(adsbygoogle = window.adsbygoogle || []).push({}); ' . "\n"; |
| 202 | $output .= '</script>' . "\n"; |
| 203 | } else { |
| 204 | if ( ! isset($content->resize) || 'auto' == $content->resize ) { |
| 205 | $this->append_defaut_responsive_content( $output, $pub_id, $content ); |
| 206 | } else { |
| 207 | /** |
| 208 | * At this point, the ad is responsive ($ad->content->unitType == responsive) |
| 209 | * The value of $ad->content->resize should be tested to format the output correctly |
| 210 | * The $output variable already contains the first line which includes "adsbygoogle.js", |
| 211 | * The rest of the output should be appended to it. |
| 212 | */ |
| 213 | $unmodified = $output; |
| 214 | $output = apply_filters( 'advanced-ads-gadsense-responsive-output', $output, $ad, $pub_id ); |
| 215 | if ( $unmodified == $output ) { |
| 216 | /** |
| 217 | * If the output has not been modified, perform a default responsive output. |
| 218 | * A simple did_action check isn't sufficient, some hooks may be attached and fired but didn't touch the output |
| 219 | */ |
| 220 | $this->append_defaut_responsive_content( $output, $pub_id, $content ); |
| 221 | } |
| 222 | } |
| 223 | } |
| 224 | return $output; |
| 225 | } |
| 226 | |
| 227 | protected function append_defaut_responsive_content(&$output, $pub_id, $content) { |
| 228 | $format = ''; |
| 229 | $style = 'display:block;'; |
| 230 | switch( $content->unitType ){ |
| 231 | case 'matched-content' : |
| 232 | $format = 'autorelaxed'; |
| 233 | break; |
| 234 | case 'link-responsive' : |
| 235 | $format = 'link'; |
| 236 | break; |
| 237 | case 'in-feed' : |
| 238 | $format = 'fluid'; |
| 239 | $layout = $content->layout; |
| 240 | $layout_key = $content->layout_key; |
| 241 | break; |
| 242 | case 'in-article' : |
| 243 | $format = 'fluid'; |
| 244 | $layout = 'in-article'; |
| 245 | $style = 'display:block; text-align:center;'; |
| 246 | break; |
| 247 | case 'link-responsive' : |
| 248 | $format = 'link'; |
| 249 | break; |
| 250 | default : |
| 251 | $format = 'auto'; |
| 252 | } |
| 253 | |
| 254 | $output .= '<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>' . "\n"; |
| 255 | $output .= '<ins class="adsbygoogle" '; |
| 256 | $output .= 'style="'. $style .'" '; |
| 257 | $output .= 'data-ad-client="ca-' . $pub_id . '" ' . "\n"; |
| 258 | $output .= 'data-ad-slot="' . $content->slotId . '" ' . "\n"; |
| 259 | $output .= isset( $layout ) ? 'data-ad-layout="' . $layout . '"' . "\n" : ''; |
| 260 | $output .= isset( $layout_key ) ? 'data-ad-layout-key="' . $layout_key . '"' . "\n" : ''; |
| 261 | $output .= 'data-ad-format="'; |
| 262 | $output .= $format; |
| 263 | $output .= '"></ins>' . "\n"; |
| 264 | $output .= '<script> ' . "\n"; |
| 265 | $output .= apply_filters( 'advanced-ads-gadsense-responsive-adsbygoogle', '(adsbygoogle = window.adsbygoogle || []).push({}); ' . "\n"); |
| 266 | $output .= '</script>' . "\n"; |
| 267 | } |
| 268 | |
| 269 | } |
| 270 |