PluginProbe ʕ •ᴥ•ʔ
Advanced Ads – Ad Manager & AdSense / 2.0.24
Advanced Ads – Ad Manager & AdSense v2.0.24
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 / rest / class-groups.php
advanced-ads / includes / rest Last commit date
class-groups.php 1 day ago class-onboarding.php 1 year ago class-page-quick-edit.php 1 year ago class-placements.php 1 year ago class-utilities.php 1 year ago
class-groups.php
218 lines
1 <?php
2 /**
3 * Groups Rest route and endpoints
4 *
5 * @package AdvancedAds
6 * @author Advanced Ads <info@wpadvancedads.com>
7 * @since 1.50.0
8 */
9
10 namespace AdvancedAds\Rest;
11
12 use WP_REST_Server;
13 use AdvancedAds\Constants;
14 use AdvancedAds\Utilities\Conditional;
15 use AdvancedAds\Framework\Interfaces\Routes_Interface;
16
17 defined( 'ABSPATH' ) || exit;
18
19 /**
20 * Rest Groups.
21 */
22 class Groups implements Routes_Interface {
23 /**
24 * Registers routes with WordPress.
25 *
26 * @return void
27 */
28 public function register_routes(): void {
29 register_rest_route(
30 Constants::REST_BASE,
31 '/group',
32 [
33 'methods' => WP_REST_Server::ALLMETHODS,
34 'callback' => [ $this, 'call_endpoint' ],
35 'permission_callback' => function () {
36 return Conditional::user_can( 'advanced_ads_edit_ads' );
37 },
38 ]
39 );
40 }
41
42 /**
43 * Run a callback depending on the request method.
44 *
45 * @param \WP_REST_Request $request the request.
46 *
47 * @return array
48 */
49 public function call_endpoint( $request ): array {
50 switch ( $request->get_method() ) {
51 case 'POST':
52 return $this->create( $request );
53 case 'PUT':
54 return $this->update( $request );
55 case 'DELETE':
56 return $this->delete( $request );
57 default:
58 }
59
60 return [ 'error' => esc_html__( 'No endpoint found', 'advanced-ads' ) ];
61 }
62
63 /**
64 * Delete a group
65 *
66 * @param \WP_REST_Request $request the request.
67 *
68 * @return array
69 */
70 public function delete( $request ): array {
71 $payload = json_decode( $request->get_body(), true );
72
73 if ( ! wp_verify_nonce( $payload['nonce'], "delete-tag_{$payload['id']}" ) ) {
74 return [ 'error' => esc_html__( 'Sorry, you are not allowed to access this feature.', 'advanced-ads' ) ];
75 }
76
77 $group = wp_advads_get_group( $payload['id'] );
78
79 if ( $group ) {
80 $group->delete();
81 }
82
83 return [ 'done' => true ];
84 }
85
86 /**
87 * Create a new group
88 *
89 * @param \WP_REST_Request $request the request.
90 *
91 * @return array
92 */
93 public function create( $request ): array {
94 $payload = $this->get_payload( $request );
95
96 if ( ! wp_verify_nonce( $payload['nonce'], 'advads-create-group' ) ) {
97 return [ 'error' => esc_html__( 'Invalid nonce', 'advanced-ads' ) ];
98 }
99
100 $group_name = sanitize_text_field( $payload['advads-group-name'] );
101
102 if ( empty( $group_name ) ) {
103 return [ 'reload' => true ];
104 }
105
106 $posted_type = $payload['advads-group-type'] ?? 'default';
107
108 if ( ! wp_advads_has_group_type( $posted_type ) ) {
109 $posted_type = 'default';
110 }
111
112 $group = wp_advads_create_new_group( $posted_type );
113 $group->set_name( sanitize_text_field( wp_unslash( $group_name ) ) );
114 $group->set_type( $posted_type );
115 $group->set_ad_count( 1 );
116 $group->set_options( [] );
117 $group->save();
118
119 return [
120 'action' => 'create',
121 'group_data' => $group->get_data(),
122 ];
123 }
124
125 /**
126 * Update an existing group
127 *
128 * @param \WP_REST_Request $request the request.
129 *
130 * @return array
131 */
132 public function update( $request ): array {
133 $payload = $this->get_payload( $request );
134
135 if ( ! wp_verify_nonce( $payload['nonce'] ?? '', 'advads-update-group' ) ) {
136 return [ 'error' => esc_html__( 'Invalid nonce', 'advanced-ads' ) ];
137 }
138
139 $groups_data = wp_unslash( $payload['advads-groups'] ?? [] );
140 $data = is_array( $groups_data ) ? reset( $groups_data ) : null;
141
142 if ( ! is_array( $data ) ) {
143 return [ 'error' => esc_html__( 'Invalid group data.', 'advanced-ads' ) ];
144 }
145
146 $group = wp_advads_get_group( absint( $data['id'] ?? 0 ) );
147
148 if ( ! $group ) {
149 return [ 'error' => esc_html__( 'Group not found.', 'advanced-ads' ) ];
150 }
151
152 $name = sanitize_text_field( $data['name'] ?? '' );
153
154 if ( '' !== $name ) {
155 $group->set_name( $name );
156 }
157
158 $type = $data['type'] ?? $group->get_type();
159
160 if ( ! wp_advads_has_group_type( $type ) ) {
161 $type = 'default';
162 }
163
164 $group->set_type( $type );
165 $group->set_ad_count( $data['ad_count'] ?? $group->get_ad_count() );
166
167 $options = $data['options'] ?? [];
168 $group->set_options( is_array( $options ) ? $options : [] );
169 $group->set_ad_weights( $this->sanitize_ad_weights( $data['ads'] ?? [] ) );
170 $group->save();
171
172 return [
173 'action' => 'update',
174 'group_data' => $group->get_data(),
175 'reload' => true,
176 ];
177 }
178
179 /**
180 * Sanitize ad weights from REST payload.
181 *
182 * @param mixed $ads Raw ads payload.
183 *
184 * @return array<int, int>
185 */
186 private function sanitize_ad_weights( $ads ): array {
187 if ( ! is_array( $ads ) ) {
188 return [];
189 }
190
191 $weights = [];
192
193 foreach ( $ads as $ad_id => $weight ) {
194 $ad_id = absint( $ad_id );
195
196 if ( $ad_id > 0 ) {
197 $weights[ $ad_id ] = absint( $weight );
198 }
199 }
200
201 return $weights;
202 }
203
204 /**
205 * Get variable serialized with `jQuery.serialize()`
206 *
207 * @param \WP_REST_Request $request the request.
208 *
209 * @return array
210 */
211 private function get_payload( $request ): array {
212 $body = json_decode( $request->get_body(), JSON_UNESCAPED_UNICODE );
213 parse_str( $body['fields'], $payload );
214
215 return $payload;
216 }
217 }
218