PluginProbe ʕ •ᴥ•ʔ
Advanced Ads – Ad Manager & AdSense / 1.29.0
Advanced Ads – Ad Manager & AdSense v1.29.0
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
EDD_SL_Plugin_Updater.php 4 years ago ad-ajax.php 5 years ago ad-debug.php 6 years ago ad-health-notices.php 5 years ago ad-model.php 5 years ago ad-select.php 9 years ago ad.php 4 years ago ad_ajax_callbacks.php 5 years ago ad_group.php 4 years ago ad_placements.php 4 years ago ad_type_abstract.php 5 years ago ad_type_content.php 5 years ago ad_type_dummy.php 5 years ago ad_type_group.php 5 years ago ad_type_image.php 5 years ago ad_type_plain.php 4 years ago checks.php 5 years ago compatibility.php 4 years ago display-conditions.php 4 years ago filesystem.php 8 years ago frontend-notices.php 6 years ago frontend_checks.php 4 years ago inline-css.php 4 years ago plugin.php 4 years ago upgrades.php 6 years ago utils.php 5 years ago visitor-conditions.php 4 years ago widget.php 4 years ago
widget.php
308 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 /**
13 * Ad widget
14 */
15 class Advanced_Ads_Widget extends WP_Widget {
16
17 /**
18 * Allows the REST API to see the widgets instance.
19 *
20 * @deprecated deprecated since WordPress version 5.8
21 * @var bool
22 */
23 public $show_instance_in_rest = true;
24
25 /**
26 * Advanced_Ads_Widget constructor.
27 */
28 public function __construct() {
29 $prefix = Advanced_Ads_Plugin::get_instance()->get_frontend_prefix();
30 $classname = $prefix . 'widget';
31
32 $widget_ops = array(
33 'classname' => $classname,
34 'show_instance_in_rest' => true,
35 'description' => __( 'Display Ads and Ad Groups.', 'advanced-ads' ),
36 );
37 $control_ops = array();
38 $base_id = self::get_base_id();
39
40 parent::__construct( $base_id, 'Advanced Ads', $widget_ops, $control_ops );
41
42 add_filter( 'q2w3-fixed-widgets', array( $this, 'q2w3_replace_frontend_id' ) );
43 }
44
45 /**
46 * Echoes the widget content.
47 *
48 * @param array $args Display arguments including 'before_title', 'after_title', 'before_widget', and 'after_widget'.
49 * @param array $instance The settings for the particular instance of the widget.
50 */
51 public function widget( $args, $instance ) {
52 /** This filter is documented in wp-includes/default-widgets.php */
53 $title = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base );
54
55 $item_id = empty( $instance['item_id'] ) ? '' : $instance['item_id'];
56
57 $output = self::output( $item_id );
58 if ( ! $output ) {
59 return;
60 }
61
62 $before_widget = isset( $args['before_widget'] ) ? $args['before_widget'] : '';
63 $after_widget = isset( $args['after_widget'] ) ? $args['after_widget'] : '';
64
65 $before_widget = $this->maybe_replace_frontend_id( $before_widget, $instance );
66
67 //phpcs:disable
68 echo $before_widget;
69 if ( ! empty( $title ) ) {
70 echo $args['before_title'] . $title . $args['after_title'];
71 }
72 echo $output;
73 echo $after_widget;
74 //phpcs:enable
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 ( array() === $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 array(
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 <?php
146 }
147
148 /**
149 * Get items for widget select field
150 *
151 * @return array $select items for select field.
152 */
153 public static function items_for_select() {
154 $select = array();
155 $model = Advanced_Ads::get_instance()->get_model();
156
157 // load all ads.
158 $ads = $model->get_ads(
159 array(
160 'orderby' => 'title',
161 'order' => 'ASC',
162 )
163 );
164 foreach ( $ads as $_ad ) {
165 $select['ads'][ 'ad_' . $_ad->ID ] = $_ad->post_title;
166 }
167
168 // load all ad groups.
169 $groups = $model->get_ad_groups();
170 foreach ( $groups as $_group ) {
171 $select['groups'][ 'group_' . $_group->term_id ] = $_group->name;
172 }
173
174 return $select;
175 }
176
177 /**
178 * Get widget placements for select field
179 *
180 * @return array $items for select field.
181 */
182 public static function widget_placements_for_select() {
183 $select = array();
184 $placements = Advanced_Ads::get_ad_placements_array();
185
186 if ( is_array( $placements ) ) {
187 ksort( $placements );
188 }
189
190 foreach ( $placements as $_placement_slug => $_placement ) {
191 if ( isset( $_placement['type'] ) && 'sidebar_widget' === $_placement['type'] ) {
192 $select['placements'][ 'placement_' . $_placement_slug ] = $_placement['name'];
193 }
194 }
195
196 return $select;
197 }
198
199 /**
200 * Return content of an in a widget
201 *
202 * @param string $id slug of the display.
203 * @return bool|string
204 */
205 public static function output( $id = '' ) {
206 // get placement data for the slug.
207 if ( empty( $id ) ) {
208 return; }
209
210 $item = explode( '_', $id, 2 );
211
212 if ( isset( $item[1] ) ) {
213 $item_id = $item[1];
214 } elseif ( empty( $item_id ) ) {
215 return;
216 }
217
218 // return either ad or group content.
219 if ( 'ad' === $item[0] ) {
220 return get_ad( absint( $item_id ) );
221 } elseif ( 'group' === $item[0] ) {
222 return get_ad_group( absint( $item_id ) );
223 } elseif ( 'placement' === $item[0] ) {
224 return get_ad_placement( $item_id );
225 }
226 }
227
228 /**
229 * Get the base id of the widget
230 *
231 * @return string
232 */
233 public static function get_base_id() {
234 $options = Advanced_Ads_Plugin::get_instance()->options();
235
236 // deprecated to keep previously changed prefixed working.
237 $prefix2 = ( isset( $options['id-prefix'] ) && '' !== $options['id-prefix'] ) ? $options['id-prefix'] : 'advads_ad_';
238 return $prefix2 . 'widget';
239 }
240
241 /**
242 * Get frontend widget id.
243 *
244 * @param int $number Unique ID number of the current widget instance.
245 * @return string
246 */
247 private function get_frontend_id( $number ) {
248 $prefix = Advanced_Ads_Plugin::get_instance()->get_frontend_prefix();
249 return $prefix . 'widget-' . $number;
250 }
251
252 /**
253 * Make it harder for ad blockers to block the widget.
254 * removes the pre-defined widget ID (e.g., advads_ad_widget-20) and replaces it with one that uses the individual frontend prefix
255 *
256 * @param string $before_widget content before the widget.
257 * @param array $instance Settings for the current widget instance.
258 * @return string $before_widget
259 */
260 private function maybe_replace_frontend_id( $before_widget, $instance ) {
261 if ( ! empty( $instance['remove-widget-id'] )
262 || defined( 'JNEWS_THEME_ID' ) // the JNews theme overrides the widget ID and resets it, so we target this specifically.
263 ) {
264 $pattern = '#\sid=("|\')[^"\']+["\']#';
265 if ( ( defined( 'ADVANCED_ADS_SHOW_WIDGET_ID' ) && ADVANCED_ADS_SHOW_WIDGET_ID )
266 || ! empty( $instance['q2w3_fixed_widget'] )
267 ) {
268 // Replace id.
269 $number = ! empty( $this->number ) ? $this->number : '';
270 $before_widget = preg_replace( $pattern, ' id=$01' . $this->get_frontend_id( $number ) . '$01', $before_widget );
271 } else {
272 // Remove id.
273 $before_widget = preg_replace( $pattern, '', $before_widget );
274 }
275 }
276 return $before_widget;
277 }
278
279 /**
280 * Provide the 'Q2W3 Fixed Widget' plugin with the new frontend widget id.
281 *
282 * @param array $sidebars_widgets existing sidebar widgets.
283 * @return array $sidebars_widgets
284 */
285 public function q2w3_replace_frontend_id( $sidebars_widgets ) {
286 foreach ( $sidebars_widgets as $sidebar => $widgets ) {
287 foreach ( $widgets as $k => $widget ) {
288 // after Fixed Widget 5.3.0, the widget option includes '#'. It didn’t before. We store the information since we need it later again.
289 $has_hash = strpos( $widget, '#' ) !== false;
290 $widget = str_replace( '#', '', $widget );
291 $pos = strrpos( $widget, '-' );
292 $option_name = substr( $widget, 0, $pos );
293 $number = substr( $widget, $pos + 1 );
294
295 if ( self::get_base_id() === $option_name ) {
296 $widget_options = get_option( 'widget_' . $option_name );
297 if ( ! empty( $widget_options[ $number ]['remove-widget-id'] ) ) {
298 // add a hash if the widget had one before. See comment above
299 $sidebars_widgets[ $sidebar ][ $k ] = $has_hash ? ( '#' . $this->get_frontend_id( $number ) ) : $this->get_frontend_id( $number );
300 }
301 }
302 }
303 }
304 return $sidebars_widgets;
305 }
306
307 }
308