PluginProbe ʕ •ᴥ•ʔ
Advanced Ads – Ad Manager & AdSense / 1.53.2
Advanced Ads – Ad Manager & AdSense v1.53.2
2.0.23 2.0.22 2.0.21 1.38.0 1.39.0 1.39.1 1.39.2 1.39.3 1.39.4 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.40.0 1.40.1 1.40.2 1.41.0 1.42.0 1.42.1 1.42.2 1.43.0 1.44.0 1.44.1 1.45.0 1.45.1 1.46.0 1.47.0 1.47.1 1.47.2 1.47.3 1.47.4 1.47.5 1.48.0 1.48.1 1.49.0 1.5.0 1.5.0.1 1.5.1 1.5.2 1.5.2.1 1.5.4 1.5.4.1 1.5.5 1.50.0 1.51.0 1.51.1 1.51.2 1.51.3 1.52.0 1.52.1 1.52.2 1.52.3 1.52.4 1.53.0 1.53.1 1.53.2 1.54.0 1.54.1 1.55.0 1.56.0 1.56.1 1.56.2 1.56.3 1.56.4 1.6 1.6.1 1.6.10 1.6.10.1 1.6.10.2 1.6.11 1.6.11.1 1.6.12 1.6.13 1.6.14 1.6.15 1.6.16 1.6.17 1.6.17.1 1.6.17.2 1.6.2 1.6.2.1 1.6.3 1.6.4 1.6.4.1 1.6.5 1.6.6 1.6.6.1 1.6.7 1.6.7.1 1.6.8 1.6.8.1 1.6.8.2 1.6.8.3 1.6.9 1.6.9.1 1.6.9.2 1.6.9.3 1.6.9.4 1.7 1.7.0.1 1.7.0.2 1.7.0.3 1.7.1 1.7.1.1 1.7.1.2 1.7.1.3 1.7.1.4 1.7.1.5 1.7.10 trunk 1.7.11 1.0.1 1.7.12 1.0.2 1.7.13 1.0.3 1.7.14 1.1.0 1.7.15 1.1.1 1.7.16 1.1.2 1.7.17 1.1.3 1.7.18 1.10 1.7.19 1.10.1 1.7.2 1.10.10 1.7.2.1 1.10.11 1.7.20 1.10.12 1.7.21 1.10.2 1.7.22 1.10.3 1.7.23 1.10.4 1.7.24 1.10.5 1.7.25 1.10.6 1.7.3 1.10.7 1.7.4 1.10.8 1.7.4.1 1.10.9 1.7.4.2 1.11 1.7.4.3 1.11.1 1.7.4.4 1.11.2 1.7.4.5 1.12 1.7.5 1.13 1.7.5.1 1.13.1 1.7.6 1.13.2 1.7.7 1.13.3 1.7.8 1.13.4 1.7.9 1.13.5 1.7.9.1 1.13.6 1.7.9.2 1.13.7 1.7.9.3 1.13.8 1.8 1.14 1.8.1 1.14.1 1.8.10 1.14.10 1.8.11 1.14.11 1.8.12 1.14.2 1.8.13 1.14.3 1.8.14 1.14.4 1.8.15 1.14.5 1.8.16 1.14.6 1.8.17 1.14.7 1.8.18 1.14.8 1.8.19 1.14.9 1.8.2 1.15 1.8.20 1.16 1.8.21 1.16.1 1.8.22 1.17 1.8.23 1.17.1 1.8.24 1.17.10 1.8.25 1.17.10-rc.1 1.8.26 1.17.11 1.8.27 1.17.12 1.8.28 1.17.12-rc.1 1.8.29 1.17.2 1.8.3 1.17.3 1.8.30 1.17.4 1.8.4 1.17.5 1.8.5 1.17.6 1.8.6 1.17.7 1.8.7 1.17.8 1.8.8 1.17.9 1.8.9 1.17.9-beta.1 1.9 1.18.0 2.0.0 1.19.0 2.0.1 1.19.1 2.0.10 1.2 2.0.11 1.2.1 2.0.12 1.2.2 2.0.13 1.2.3 2.0.14 1.2.4 2.0.15 1.2.5 2.0.16 1.2.6 2.0.17 1.2.7 2.0.18 1.20.0 2.0.19 1.20.0-rc.1 2.0.2 1.20.0-rc.2 2.0.20 1.20.1 2.0.3 1.20.2 2.0.4 1.20.3 2.0.5 1.21.0 2.0.6 1.21.1 2.0.7 1.22.0 2.0.8 1.22.1 2.0.9 1.22.2 1.23.0 1.23.1 1.23.2 1.24.0 1.24.1 1.24.2 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.29.0 1.29.1 1.3 1.3.1 1.3.10 1.3.11 1.3.12 1.3.13 1.3.14 1.3.15 1.3.16 1.3.17 1.3.18 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.30.0 1.30.1 1.30.2 1.30.2-rc.1 1.30.3 1.30.4 1.30.4-rc.1 1.30.5 1.31.0 1.31.1 1.32.0 1.32.0-rc.1 1.33.0 1.33.1 1.33.2 1.34.0 1.35.0 1.35.1 1.36.0 1.36.1 1.36.2 1.36.3 1.37.0 1.37.1 1.37.2
advanced-ads / classes / widget.php
advanced-ads / classes Last commit date
Advanced_Ads_Modal.php 2 years ago EDD_SL_Plugin_Updater.php 2 years ago ad-ajax.php 2 years ago ad-debug.php 2 years ago ad-expiration.php 3 years ago ad-health-notices.php 2 years ago ad-model.php 2 years ago ad-select.php 3 years ago ad.php 2 years ago ad_ajax_callbacks.php 2 years ago ad_group.php 1 year ago ad_placements.php 2 years ago ad_type_abstract.php 2 years ago ad_type_content.php 2 years ago ad_type_dummy.php 2 years ago ad_type_group.php 2 years ago ad_type_image.php 2 years ago ad_type_plain.php 2 years ago checks.php 2 years ago class-translation-promo.php 2 years ago compatibility.php 2 years ago display-conditions.php 2 years ago filesystem.php 2 years ago frontend_checks.php 2 years ago in-content-injector.php 2 years ago inline-css.php 2 years ago plugin.php 1 year ago upgrades.php 1 year ago utils.php 3 years ago visitor-conditions.php 2 years ago widget.php 2 years ago
widget.php
324 lines
1 <?php
2 /**
3 * Advanced Ads Widget
4 *
5 * @package Advanced_Ads_Widget
6 * @author Thomas Maier <support@wpadvancedads.com>
7 * @license GPL-2.0+
8 * @link https://wpadvancedads.com
9 * @copyright 2014 Thomas Maier, Advanced Ads GmbH
10 */
11
12 use AdvancedAds\Utilities\Groups;
13
14 /**
15 * Ad widget
16 */
17 class Advanced_Ads_Widget extends WP_Widget {
18
19 /**
20 * Allows the REST API to see the widgets instance.
21 *
22 * @deprecated deprecated since WordPress version 5.8
23 * @var bool
24 */
25 public $show_instance_in_rest = true;
26
27 /**
28 * Advanced_Ads_Widget constructor.
29 */
30 public function __construct() {
31 $prefix = Advanced_Ads_Plugin::get_instance()->get_frontend_prefix();
32 $classname = $prefix . 'widget';
33
34 $widget_ops = [
35 'classname' => $classname,
36 'show_instance_in_rest' => true,
37 'description' => __( 'Display Ads and Ad Groups.', 'advanced-ads' ),
38 ];
39 $control_ops = [];
40 $base_id = self::get_base_id();
41
42 parent::__construct( $base_id, 'Advanced Ads', $widget_ops, $control_ops );
43
44 add_filter( 'q2w3-fixed-widgets', [ $this, 'q2w3_replace_frontend_id' ] );
45 }
46
47 /**
48 * Echoes the widget content.
49 *
50 * @param array $args Display arguments including 'before_title', 'after_title', 'before_widget', and 'after_widget'.
51 * @param array $instance The settings for the particular instance of the widget.
52 */
53 public function widget( $args, $instance ) {
54 /** This filter is documented in wp-includes/default-widgets.php */
55 $title = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base );
56
57 $item_id = empty( $instance['item_id'] ) ? '' : $instance['item_id'];
58
59 $output = self::output( $item_id );
60 if ( ! $output ) {
61 return;
62 }
63
64 $before_widget = isset( $args['before_widget'] ) ? $args['before_widget'] : '';
65 $after_widget = isset( $args['after_widget'] ) ? $args['after_widget'] : '';
66
67 $before_widget = $this->maybe_replace_frontend_id( $before_widget, $instance );
68
69 echo $before_widget;
70 if ( ! empty( $title ) ) {
71 echo $args['before_title'] . $title . $args['after_title'];
72 }
73 echo $output;
74 echo $after_widget;
75 }
76
77 /**
78 * Updates a particular instance of a widget.
79 *
80 * This function should check that `$new_instance` is set correctly. The newly-calculated
81 * value of `$instance` should be returned. If false is returned, the instance won't be
82 * saved/updated.
83 *
84 * @param array $new_instance New settings for this instance as input by the user via WP_Widget::form().
85 * @param array $old_instance Old settings for this instance.
86 * @return array Settings to save or bool false to cancel saving.
87 */
88 public function update( $new_instance, $old_instance ) {
89 $instance = $old_instance;
90 $instance['title'] = $new_instance['title'];
91 $instance['item_id'] = $new_instance['item_id'];
92
93 // Allow to remove/replace id for new widgets and if it was allowed earlier.
94 if ( [] === $old_instance || ! empty( $old_instance['remove-widget-id'] ) ) {
95 $instance['remove-widget-id'] = true;
96 }
97 return $instance;
98 }
99
100 /**
101 * Outputs the settings update form.
102 *
103 * @param array $instance Current settings.
104 */
105 public function form( $instance ) {
106 $instance = wp_parse_args(
107 (array) $instance,
108 [
109 'title' => '',
110 'item_id' => '',
111 ]
112 );
113 $title = strip_tags( $instance['title'] );
114 $elementid = $instance['item_id'];
115
116 ?><p><label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"><?php esc_html_e( 'Title:', 'advanced-ads' ); ?></label>
117 <input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" /></p>
118 <?php
119 $items = array_merge( self::items_for_select(), self::widget_placements_for_select() );
120 ?>
121 <select id="<?php echo esc_attr( $this->get_field_id( 'item_id' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'item_id' ) ); ?>">
122 <option value=""><?php esc_html_e( '--empty--', 'advanced-ads' ); ?></option>
123 <?php if ( isset( $items['placements'] ) ) : ?>
124 <optgroup label="<?php esc_html_e( 'Placements', 'advanced-ads' ); ?>">
125 <?php foreach ( $items['placements'] as $_item_id => $_item_title ) : ?>
126 <option value="<?php echo esc_attr( $_item_id ); ?>" <?php selected( $_item_id, $elementid ); ?>><?php echo esc_attr( $_item_title ); ?></option>
127 <?php endforeach; ?>
128 </optgroup>
129 <?php endif; ?>
130 <?php if ( isset( $items['groups'] ) ) : ?>
131 <optgroup label="<?php esc_html_e( 'Ad Groups', 'advanced-ads' ); ?>">
132 <?php foreach ( $items['groups'] as $_item_id => $_item_title ) : ?>
133 <option value="<?php echo esc_attr( $_item_id ); ?>" <?php selected( $_item_id, $elementid ); ?>><?php echo esc_html( $_item_title ); ?></option>
134 <?php endforeach; ?>
135 </optgroup>
136 <?php endif; ?>
137 <?php if ( isset( $items['ads'] ) ) : ?>
138 <optgroup label="<?php esc_html_e( 'Ads', 'advanced-ads' ); ?>">
139 <?php foreach ( $items['ads'] as $_item_id => $_item_title ) : ?>
140 <option value="<?php echo esc_attr( $_item_id ); ?>" <?php selected( $_item_id, $elementid ); ?>><?php echo esc_html( $_item_title ); ?></option>
141 <?php endforeach; ?>
142 </optgroup>
143 <?php endif; ?>
144 </select>
145
146 <?php
147 $this->display_hints( $elementid );
148 }
149
150 /**
151 * Display hints related to the currently selected item in the dropdown.
152 *
153 * @param string $elementid Currently selected item.
154 */
155 private function display_hints( $elementid ) {
156 $elementid_parts = explode( '_', $elementid );
157 if ( ! isset( $elementid_parts[1] ) || $elementid_parts[0] !== 'group' ) {
158 return;
159 }
160
161 echo Groups::build_hints_html( new Advanced_Ads_Group( $elementid_parts[1] ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
162 }
163
164 /**
165 * Get items for widget select field
166 *
167 * @return array $select items for select field.
168 */
169 public static function items_for_select() {
170 $select = [];
171 $model = Advanced_Ads::get_instance()->get_model();
172
173 // load all ads.
174 $ads = $model->get_ads(
175 [
176 'orderby' => 'title',
177 'order' => 'ASC',
178 ]
179 );
180 foreach ( $ads as $_ad ) {
181 $select['ads'][ 'ad_' . $_ad->ID ] = $_ad->post_title;
182 }
183
184 // load all ad groups.
185 $groups = $model->get_ad_groups();
186 foreach ( $groups as $_group ) {
187 $select['groups'][ 'group_' . $_group->term_id ] = $_group->name;
188 }
189
190 return $select;
191 }
192
193 /**
194 * Get widget placements for select field
195 *
196 * @return array $items for select field.
197 */
198 public static function widget_placements_for_select() {
199 $select = [];
200 $placements = Advanced_Ads::get_instance()->get_model()->get_ad_placements_array();
201
202 if ( is_array( $placements ) ) {
203 ksort( $placements );
204 }
205
206 foreach ( $placements as $placement_slug => $placement ) {
207 if ( isset( $placement['type'] ) && in_array( $placement['type'], [ 'sidebar_widget', 'default' ], true ) ) {
208 $select['placements'][ 'placement_' . $placement_slug ] = $placement['name'];
209 }
210 }
211
212 return $select;
213 }
214
215 /**
216 * Return content of an in a widget
217 *
218 * @param string $id slug of the display.
219 * @return bool|string
220 */
221 public static function output( $id = '' ) {
222 // get placement data for the slug.
223 if ( empty( $id ) ) {
224 return; }
225
226 $item = explode( '_', $id, 2 );
227
228 if ( isset( $item[1] ) ) {
229 $item_id = $item[1];
230 } elseif ( empty( $item_id ) ) {
231 return;
232 }
233
234 // return either ad or group content.
235 if ( 'ad' === $item[0] ) {
236 return get_ad( absint( $item_id ) );
237 } elseif ( 'group' === $item[0] ) {
238 return get_ad_group( absint( $item_id ) );
239 } elseif ( 'placement' === $item[0] ) {
240 return get_ad_placement( $item_id );
241 }
242 }
243
244 /**
245 * Get the base id of the widget
246 *
247 * @return string
248 */
249 public static function get_base_id() {
250 $options = Advanced_Ads_Plugin::get_instance()->options();
251
252 // deprecated to keep previously changed prefixed working.
253 $prefix2 = ( isset( $options['id-prefix'] ) && '' !== $options['id-prefix'] ) ? $options['id-prefix'] : 'advads_ad_';
254 return $prefix2 . 'widget';
255 }
256
257 /**
258 * Get frontend widget id.
259 *
260 * @param int $number Unique ID number of the current widget instance.
261 * @return string
262 */
263 private function get_frontend_id( $number ) {
264 $prefix = Advanced_Ads_Plugin::get_instance()->get_frontend_prefix();
265 return $prefix . 'widget-' . $number;
266 }
267
268 /**
269 * Make it harder for ad blockers to block the widget.
270 * removes the pre-defined widget ID (e.g., advads_ad_widget-20) and replaces it with one that uses the individual frontend prefix
271 *
272 * @param string $before_widget content before the widget.
273 * @param array $instance Settings for the current widget instance.
274 * @return string $before_widget
275 */
276 private function maybe_replace_frontend_id( $before_widget, $instance ) {
277 if ( ! empty( $instance['remove-widget-id'] )
278 || defined( 'JNEWS_THEME_ID' ) // the JNews theme overrides the widget ID and resets it, so we target this specifically.
279 ) {
280 $pattern = '#\sid=("|\')[^"\']+["\']#';
281 if ( ( defined( 'ADVANCED_ADS_SHOW_WIDGET_ID' ) && ADVANCED_ADS_SHOW_WIDGET_ID )
282 || ! empty( $instance['q2w3_fixed_widget'] )
283 ) {
284 // Replace id.
285 $number = ! empty( $this->number ) ? $this->number : '';
286 $before_widget = preg_replace( $pattern, ' id=$01' . $this->get_frontend_id( $number ) . '$01', $before_widget );
287 } else {
288 // Remove id.
289 $before_widget = preg_replace( $pattern, '', $before_widget );
290 }
291 }
292 return $before_widget;
293 }
294
295 /**
296 * Provide the 'Q2W3 Fixed Widget' plugin with the new frontend widget id.
297 *
298 * @param array $sidebars_widgets existing sidebar widgets.
299 * @return array $sidebars_widgets
300 */
301 public function q2w3_replace_frontend_id( $sidebars_widgets ) {
302 foreach ( $sidebars_widgets as $sidebar => $widgets ) {
303 foreach ( $widgets as $k => $widget ) {
304 // after Fixed Widget 5.3.0, the widget option includes '#'. It didn’t before. We store the information since we need it later again.
305 $has_hash = strpos( $widget, '#' ) !== false;
306 $widget = str_replace( '#', '', $widget );
307 $pos = strrpos( $widget, '-' );
308 $option_name = substr( $widget, 0, $pos );
309 $number = substr( $widget, $pos + 1 );
310
311 if ( self::get_base_id() === $option_name ) {
312 $widget_options = get_option( 'widget_' . $option_name );
313 if ( ! empty( $widget_options[ $number ]['remove-widget-id'] ) ) {
314 // add a hash if the widget had one before. See comment above
315 $sidebars_widgets[ $sidebar ][ $k ] = $has_hash ? ( '#' . $this->get_frontend_id( $number ) ) : $this->get_frontend_id( $number );
316 }
317 }
318 }
319 }
320 return $sidebars_widgets;
321 }
322
323 }
324