PluginProbe ʕ •ᴥ•ʔ
Advanced Ads – Ad Manager & AdSense / 2.0.26
Advanced Ads – Ad Manager & AdSense v2.0.26
2.0.26 2.0.25 2.0.24 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 / includes / class-widget.php
advanced-ads / includes Last commit date
abstracts 3 weeks ago admin 3 weeks ago ads 3 weeks ago compatibility 3 weeks ago crons 3 weeks ago frontend 3 weeks ago groups 3 weeks ago importers 3 weeks ago installation 3 weeks ago interfaces 3 weeks ago license 3 weeks ago placements 3 weeks ago rest 3 weeks ago traits 3 weeks ago utilities 3 weeks ago class-assets-registry.php 1 month ago class-autoloader.php 1 month ago class-cache-invalidator.php 3 weeks ago class-constants.php 3 weeks ago class-content-injector.php 3 weeks ago class-entities.php 5 months ago class-modal.php 3 weeks ago class-modules.php 3 weeks ago class-options.php 3 weeks ago class-plugin.php 3 weeks ago class-post-data.php 1 year ago class-shortcodes.php 3 weeks ago class-upgrades.php 3 weeks ago class-widget.php 3 weeks ago default-hooks.php 6 months ago functions-ad.php 3 weeks ago functions-components.php 3 weeks ago functions-conditional.php 1 year ago functions-core.php 1 year ago functions-group.php 3 weeks ago functions-placement.php 3 weeks ago functions.php 3 weeks ago index.php 2 years ago load_modules.php 3 weeks ago
class-widget.php
303 lines
1 <?php
2 /**
3 * Advanced Ads Widget
4 *
5 * @package AdvancedAds
6 * @author Advanced Ads <info@wpadvancedads.com>
7 * @since 1.47.0
8 */
9
10 namespace AdvancedAds;
11
12 use AdvancedAds\Utilities\Data;
13
14 defined( 'ABSPATH' ) || exit;
15
16 /**
17 * Ad widget
18 */
19 class Widget extends \WP_Widget {
20
21 /**
22 * The constructor.
23 */
24 public function __construct() {
25 $prefix = wp_advads()->get_frontend_prefix();
26 $classname = $prefix . 'widget';
27
28 $widget_ops = [
29 'classname' => $classname,
30 'show_instance_in_rest' => true,
31 'description' => __( 'Display Ads and Ad Groups.', 'advanced-ads' ),
32 ];
33 $control_ops = [];
34 $base_id = self::get_base_id();
35
36 parent::__construct( $base_id, 'Advanced Ads', $widget_ops, $control_ops );
37
38 add_filter( 'q2w3-fixed-widgets', [ $this, 'q2w3_replace_frontend_id' ] );
39 }
40
41 /**
42 * Echoes the widget content.
43 *
44 * @param array<string, mixed> $args Display arguments including 'before_title', 'after_title', 'before_widget', and 'after_widget'.
45 * @param array<string, mixed> $instance The settings for the particular instance of the widget.
46 *
47 * @return void
48 */
49 public function widget( $args, $instance ): void {
50 $item_id = empty( $instance['item_id'] ) ? '' : $instance['item_id'];
51 $output = self::output( $item_id );
52 if ( ! $output ) {
53 return;
54 }
55
56 $title = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base );
57 $before_widget = isset( $args['before_widget'] ) ? $args['before_widget'] : '';
58 $after_widget = isset( $args['after_widget'] ) ? $args['after_widget'] : '';
59
60 $before_widget = $this->maybe_replace_frontend_id( $before_widget, $instance );
61
62 // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped
63 echo $before_widget;
64 if ( ! empty( $title ) ) {
65 echo $args['before_title'] . $title . $args['after_title'];
66 }
67 echo $output;
68 echo $after_widget;
69 // phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped
70 }
71
72 /**
73 * Updates a particular instance of a widget.
74 *
75 * This function should check that `$new_instance` is set correctly. The newly-calculated
76 * value of `$instance` should be returned. If false is returned, the instance won't be
77 * saved/updated.
78 *
79 * @param array<string, mixed> $new_instance New settings for this instance as input by the user via WP_Widget::form().
80 * @param array<string, mixed> $old_instance Old settings for this instance.
81 * @return array<string, mixed> Settings to save or bool false to cancel saving.
82 */
83 public function update( $new_instance, $old_instance ) {
84 $instance = $old_instance;
85 $instance['title'] = $new_instance['title'];
86 $instance['item_id'] = $new_instance['item_id'];
87
88 // Allow to remove/replace id for new widgets and if it was allowed earlier.
89 if ( [] === $old_instance || ! empty( $old_instance['remove-widget-id'] ) ) {
90 $instance['remove-widget-id'] = true;
91 }
92
93 return $instance;
94 }
95
96 /**
97 * Outputs the settings update form.
98 *
99 * @param array<string, mixed> $instance Current settings.
100 */
101 public function form( $instance ) {
102 $instance = wp_parse_args(
103 (array) $instance,
104 [
105 'title' => '',
106 'item_id' => '',
107 ]
108 );
109
110 $elementid = $instance['item_id'];
111 $title = wp_strip_all_tags( $instance['title'] );
112 $items = array_merge( self::items_for_select(), self::widget_placements_for_select() );
113 ?>
114 <p>
115 <label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"><?php esc_html_e( 'Title:', 'advanced-ads' ); ?></label>
116 <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 ); ?>" />
117 </p>
118 <select id="<?php echo esc_attr( $this->get_field_id( 'item_id' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'item_id' ) ); ?>">
119 <option value=""><?php esc_html_e( '--empty--', 'advanced-ads' ); ?></option>
120 <?php if ( isset( $items['placements'] ) ) : ?>
121 <optgroup label="<?php esc_html_e( 'Placements', 'advanced-ads' ); ?>">
122 <?php foreach ( $items['placements'] as $_item_id => $_item_title ) : ?>
123 <option value="<?php echo esc_attr( $_item_id ); ?>" <?php selected( $_item_id, $elementid ); ?>><?php echo esc_attr( $_item_title ); ?></option>
124 <?php endforeach; ?>
125 </optgroup>
126 <?php endif; ?>
127 <?php if ( isset( $items['groups'] ) ) : ?>
128 <optgroup label="<?php esc_html_e( 'Ad Groups', 'advanced-ads' ); ?>">
129 <?php foreach ( $items['groups'] as $_item_id => $_item_title ) : ?>
130 <option value="<?php echo esc_attr( $_item_id ); ?>" <?php selected( $_item_id, $elementid ); ?>><?php echo esc_html( $_item_title ); ?></option>
131 <?php endforeach; ?>
132 </optgroup>
133 <?php endif; ?>
134 <?php if ( isset( $items['ads'] ) ) : ?>
135 <optgroup label="<?php esc_html_e( 'Ads', 'advanced-ads' ); ?>">
136 <?php foreach ( $items['ads'] as $_item_id => $_item_title ) : ?>
137 <option value="<?php echo esc_attr( $_item_id ); ?>" <?php selected( $_item_id, $elementid ); ?>><?php echo esc_html( $_item_title ); ?></option>
138 <?php endforeach; ?>
139 </optgroup>
140 <?php endif; ?>
141 </select>
142
143 <?php
144 $this->display_hints( $elementid );
145 }
146
147 /**
148 * Display hints related to the currently selected item in the dropdown.
149 *
150 * @param string $elementid Currently selected item.
151 */
152 private function display_hints( $elementid ) {
153 $elementid_parts = explode( '_', $elementid );
154 if ( ! isset( $elementid_parts[1] ) || 'group' !== $elementid_parts[0] ) {
155 return;
156 }
157
158 $group = wp_advads_get_group( absint( $elementid_parts[1] ) );
159 if ( ! $group ) {
160 return;
161 }
162
163 echo $group->get_hints_html(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
164 }
165
166 /**
167 * Get items for widget select field
168 *
169 * @return array<string, mixed> $select items for select field.
170 */
171 public static function items_for_select() {
172 return Data::items_for_select( [ 'placements' => false ] );
173 }
174
175 /**
176 * Get widget placements for select field
177 *
178 * @return array<string, mixed> $items for select field.
179 */
180 public static function widget_placements_for_select() {
181 $select = [];
182
183 foreach ( wp_advads_get_placement_summaries() as $id => $summary ) {
184 if ( in_array( $summary['type'] ?? '', [ 'sidebar_widget', 'default' ], true ) ) {
185 $select['placements'][ 'placement_' . $id ] = $summary['title'];
186 }
187 }
188
189 if ( ! empty( $select['placements'] ) ) {
190 asort( $select['placements'] );
191 }
192
193 return $select;
194 }
195
196 /**
197 * Return content of an in a widget
198 *
199 * @param string $id slug of the display.
200 * @return bool|string
201 */
202 public static function output( $id = '' ) {
203 // Early bail!!
204 if ( empty( $id ) ) {
205 return;
206 }
207
208 $item = explode( '_', $id, 2 );
209 if ( isset( $item[1] ) ) {
210 $item_id = $item[1];
211 }
212
213 if ( empty( $item_id ) ) {
214 return;
215 }
216
217 $func = 'get_the_' . $item[0];
218 return $func( absint( $item_id ) );
219 }
220
221 /**
222 * Get the base id of the widget
223 *
224 * @return string
225 */
226 public static function get_base_id() {
227 $options = \Advanced_Ads::get_instance()->options();
228
229 // deprecated to keep previously changed prefixed working.
230 $prefix2 = ( isset( $options['id-prefix'] ) && '' !== $options['id-prefix'] ) ? $options['id-prefix'] : 'advads_ad_';
231 return $prefix2 . 'widget';
232 }
233
234 /**
235 * Get frontend widget id.
236 *
237 * @param int $number Unique ID number of the current widget instance.
238 * @return string
239 */
240 private function get_frontend_id( $number ) {
241 $prefix = wp_advads()->get_frontend_prefix();
242 return $prefix . 'widget-' . $number;
243 }
244
245 /**
246 * Make it harder for ad blockers to block the widget.
247 * removes the pre-defined widget ID (e.g., advads_ad_widget-20) and replaces it with one that uses the individual frontend prefix
248 *
249 * @param string $before_widget content before the widget.
250 * @param array<string, mixed> $instance Settings for the current widget instance.
251 * @return string $before_widget
252 */
253 private function maybe_replace_frontend_id( $before_widget, $instance ) {
254 if (
255 ! empty( $instance['remove-widget-id'] )
256 || defined( 'JNEWS_THEME_ID' ) // the JNews theme overrides the widget ID and resets it, so we target this specifically.
257 ) {
258 $pattern = '#\sid=("|\')[^"\']+["\']#';
259 if (
260 ( defined( 'ADVANCED_ADS_SHOW_WIDGET_ID' ) && ADVANCED_ADS_SHOW_WIDGET_ID )
261 || ! empty( $instance['q2w3_fixed_widget'] )
262 ) {
263 // Replace id.
264 $number = ! empty( $this->number ) ? $this->number : '';
265 $before_widget = preg_replace( $pattern, ' id=$01' . $this->get_frontend_id( $number ) . '$01', $before_widget );
266 } else {
267 // Remove id.
268 $before_widget = preg_replace( $pattern, '', $before_widget );
269 }
270 }
271
272 return $before_widget;
273 }
274
275 /**
276 * Provide the 'Q2W3 Fixed Widget' plugin with the new frontend widget id.
277 *
278 * @param array<string, array<int, string>> $sidebars_widgets existing sidebar widgets.
279 * @return array<string, array<int, string>> $sidebars_widgets
280 */
281 public function q2w3_replace_frontend_id( $sidebars_widgets ) {
282 foreach ( $sidebars_widgets as $sidebar => $widgets ) {
283 foreach ( $widgets as $k => $widget ) {
284 // after Fixed Widget 5.3.0, the widget option includes '#'. It didn’t before. We store the information since we need it later again.
285 $has_hash = strpos( $widget, '#' ) !== false;
286 $widget = str_replace( '#', '', $widget );
287 $pos = strrpos( $widget, '-' );
288 $option_name = substr( $widget, 0, $pos );
289 $number = substr( $widget, $pos + 1 );
290
291 if ( self::get_base_id() === $option_name ) {
292 $widget_options = get_option( 'widget_' . $option_name );
293 if ( ! empty( $widget_options[ $number ]['remove-widget-id'] ) ) {
294 // Add a hash if the widget had one before. See comment above.
295 $sidebars_widgets[ $sidebar ][ $k ] = $has_hash ? ( '#' . $this->get_frontend_id( $number ) ) : $this->get_frontend_id( $number );
296 }
297 }
298 }
299 }
300 return $sidebars_widgets;
301 }
302 }
303