PluginProbe ʕ •ᴥ•ʔ
Advanced Ads – Ad Manager & AdSense / 1.40.0
Advanced Ads – Ad Manager & AdSense v1.40.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 / src / Placement_Type.php
advanced-ads / src Last commit date
Placement_Type.php 3 years ago Placement_Type_Options.php 3 years ago
Placement_Type.php
239 lines
1 <?php
2
3 namespace Advanced_Ads;
4
5 /**
6 * Class wrapper for placement types array.
7 *
8 * @property-read string $title
9 * @property-read string $description
10 * @property-read string $image
11 * @property-read float $order
12 * @property-read Placement_Type_Options $options
13 */
14 class Placement_Type extends \ArrayObject {
15
16 /**
17 * Placement type title.
18 *
19 * @var string
20 */
21 private $title;
22
23 /**
24 * Placement type description.
25 *
26 * @var string
27 */
28 private $description = '';
29
30 /**
31 * Admin UI image src.
32 *
33 * @var string
34 */
35 private $image = '';
36
37 /**
38 * Admin UI order for new placements.
39 *
40 * @var float
41 */
42 private $order;
43
44 /**
45 * A class to resolve the placement type options.
46 *
47 * @var Placement_Type_Options
48 */
49 private $options;
50
51 /**
52 * Compute all allowed ads once and assign them to this variable.
53 *
54 * @var array
55 */
56 private $allowed_ads;
57
58 /**
59 * Compute all allowed groups once and assign them to this variable.
60 *
61 * @var array
62 */
63 private $allowed_groups;
64
65 /**
66 * The placement type.
67 *
68 * @var string
69 */
70 private $type;
71
72 /**
73 * Assign simple placement definitions to properties.
74 * Instantiate Placement_Type_Options class.
75 *
76 * @param string $type The type of placement.
77 * @param array $placement_definition The definition options for the placement.
78 */
79 public function __construct( $type, array $placement_definition ) {
80 $this->type = $type;
81
82 if ( array_key_exists( 'title', $placement_definition ) ) {
83 $this->title = $placement_definition['title'];
84 }
85
86 if ( array_key_exists( 'description', $placement_definition ) ) {
87 $this->description = $placement_definition['description'];
88 }
89
90 if ( array_key_exists( 'image', $placement_definition ) ) {
91 $this->image = $placement_definition['image'];
92 }
93
94 if ( array_key_exists( 'order', $placement_definition ) ) {
95 $this->order = (float) $placement_definition['order'];
96 }
97
98 if ( ! array_key_exists( 'options', $placement_definition ) || ! is_array( $placement_definition['options'] ) ) {
99 $placement_definition['options'] = [];
100 }
101
102 $this->options = new Placement_Type_Options( $placement_definition['options'] );
103
104 parent::__construct( $placement_definition );
105 }
106
107 /**
108 * Magic catch to have readonly properties.
109 *
110 * @param string $name The name of the requested property.
111 *
112 * @return mixed
113 * @noinspection MagicMethodsValidityInspection -- no setter as we only want readonly properties
114 */
115 public function __get( $name ) {
116 if ( property_exists( $this, $name ) ) {
117 return $this->{$name};
118 }
119
120 return null;
121 }
122
123 /**
124 * Check if the provided ad type is allowed (or at least not excluded).
125 * If an ad type is both allowed and forbidden, the allow-list takes precedence.
126 *
127 * @param string $type Ad type.
128 *
129 * @return bool
130 */
131 public function is_ad_type_allowed( $type ) {
132 return $this->is_abstract_allowed( $type, 'ad' );
133 }
134
135 /**
136 * Check if the provided ad group type is allowed.
137 *
138 * @param string $type Ad group type.
139 *
140 * @return bool
141 */
142 public function is_group_type_allowed( $type ) {
143 return $this->is_abstract_allowed( $type, 'group' );
144 }
145
146 /**
147 * Abstraction of comparing whether type is allowed or excluded.
148 *
149 * @param string $type Specific Advanced_Ads_Ad::$type or Advanced_Ads_Ad_Group::$type.
150 * @param string $class Overall classification, one of `ad` or `group`.
151 *
152 * @return bool
153 */
154 private function is_abstract_allowed( $type, $class ) {
155 $allowed = $this->options->offsetGet( 'allowed_' . $class . '_types' );
156
157 if ( $allowed === null ) {
158 return ! in_array( $type, $this->options->offsetGet( 'excluded_' . $class . '_types' ), true );
159 }
160
161 return in_array( $type, $allowed, true );
162 }
163
164 /**
165 * Get all allowed groups for this placement type.
166 * Save them in instance, so they only have to be calculated once per type.
167 *
168 * @return array
169 */
170 public function get_allowed_groups() {
171 if ( isset( $this->allowed_groups ) ) {
172 return $this->allowed_groups;
173 }
174
175 $this->allowed_groups = [];
176
177 foreach ( \Advanced_Ads::get_instance()->get_model()->get_ad_groups() as $group ) {
178 if ( ! $this->is_group_type_allowed( $group->type ) ) {
179 continue;
180 }
181
182 // check if the group has allowed ads.
183 $group_ads = array_filter( $group->get_all_ads(), function( \WP_Post $ad_post ) {
184 return $this->is_ad_type_allowed( ( new \Advanced_Ads_Ad( $ad_post->ID ) )->type );
185 } );
186 if ( empty( $group_ads ) ) {
187 continue;
188 }
189
190 $this->allowed_groups[ 'group_' . $group->id ] = $group->name;
191 }
192
193 return $this->allowed_groups;
194 }
195
196 /**
197 * Get all allowed ads for this placement type.
198 * Save them in instance, so they only have to be calculated once per type.
199 *
200 * @return array
201 */
202 public function get_allowed_ads() {
203 if ( isset( $this->allowed_ads ) ) {
204 return $this->allowed_ads;
205 }
206
207 $this->allowed_ads = [];
208
209 foreach ( $this->get_all_ads() as $ad ) {
210 if ( ! $this->is_ad_type_allowed( $ad->type ) ) {
211 continue;
212 }
213 $this->allowed_ads[ 'ad_' . apply_filters( 'wpml_object_id', $ad->id, 'advanced_ads', true ) ] = $ad->title;
214 }
215
216 return $this->allowed_ads;
217 }
218
219 /**
220 * Get all available ads once.
221 *
222 * @return \Advanced_Ads_Ad[]
223 */
224 private function get_all_ads() {
225 static $all_ads;
226 if ( $all_ads === null ) {
227 $all_ads = array_map( function( $ad_id ) {
228 return new \Advanced_Ads_Ad( $ad_id );
229 }, \Advanced_Ads::get_instance()->get_model()->get_ads( [
230 'orderby' => 'title',
231 'order' => 'ASC',
232 'fields' => 'ids',
233 ] ) );
234 }
235
236 return $all_ads;
237 }
238 }
239