PluginProbe ʕ •ᴥ•ʔ
Advanced Ads – Ad Manager & AdSense / 1.5.1
Advanced Ads – Ad Manager & AdSense v1.5.1
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 / ad_placements.php
advanced-ads / classes Last commit date
ad-ajax.php 11 years ago ad-model.php 11 years ago ad-select.php 11 years ago ad.php 11 years ago ad_ajax_callbacks.php 11 years ago ad_group.php 11 years ago ad_placements.php 11 years ago ad_type_abstract.php 11 years ago ad_type_content.php 11 years ago ad_type_plain.php 11 years ago plugin.php 11 years ago widget.php 11 years ago
ad_placements.php
289 lines
1 <?php
2
3 /**
4 * Advanced Ads
5 *
6 * @package Advanced_Ads_Placements
7 * @author Thomas Maier <thomas.maier@webgilde.com>
8 * @license GPL-2.0+
9 * @link http://webgilde.com
10 * @copyright 2014 Thomas Maier, webgilde GmbH
11 */
12
13 /**
14 * grouping placements functions
15 *
16 * @since 1.1.0
17 * @package Advads_Placements
18 * @author Thomas Maier <thomas.maier@webgilde.com>
19 */
20 class Advads_Ad_Placements {
21
22 /**
23 * get placement types
24 *
25 * @since 1.2.1
26 * @return arr $types array with placement types
27 */
28 public static function get_placement_types() {
29 $types = array(
30 'default' => array(
31 'title' => __( 'default', ADVADS_SLUG ),
32 'description' => __( 'Manual placement.', ADVADS_SLUG ),
33 ),
34 'header' => array(
35 'title' => __( 'header', ADVADS_SLUG ),
36 'description' => __( 'Injected in Header (before closing </head> Tag, often not visible).', ADVADS_SLUG ),
37 ),
38 'footer' => array(
39 'title' => __( 'footer', ADVADS_SLUG ),
40 'description' => __( 'Injected in Footer (before closing </body> Tag).', ADVADS_SLUG ),
41 ),
42 'post_top' => array(
43 'title' => __( 'before post', ADVADS_SLUG ),
44 'description' => __( 'Injected before the post content.', ADVADS_SLUG ),
45 ),
46 'post_bottom' => array(
47 'title' => __( 'after post', ADVADS_SLUG ),
48 'description' => __( 'Injected after the post content.', ADVADS_SLUG ),
49 ),
50 'post_content' => array(
51 'title' => __( 'post content', ADVADS_SLUG ),
52 'description' => __( 'Injected into the post content. You can choose the paragraph after which the ad content is displayed.', ADVADS_SLUG ),
53 ),
54 );
55 return apply_filters( 'advanced-ads-placement-types', $types );
56 }
57
58 /**
59 * save a new placement
60 *
61 * @since 1.1.0
62 * @param array $new_placement
63 * @return mixed true if saved; error message if not
64 */
65 public static function save_new_placement($new_placement) {
66 // load placements // -TODO use model
67 $placements = Advanced_Ads::get_ad_placements_array();
68
69 // escape slug as slug
70 $new_placement['slug'] = sanitize_title( $new_placement['slug'] );
71
72 // check if slug already exists
73 if ( $new_placement['slug'] == '' ) {
74 return __( 'Slug can\'t be empty.', ADVADS_SLUG ); }
75 if ( isset($placements[$new_placement['slug']]) ) {
76 return __( 'Slug already exists.', ADVADS_SLUG ); }
77
78 // make sure only allowed types are being saved
79 $placement_types = Advads_Ad_Placements::get_placement_types();
80 $new_placement['type'] = (isset($placement_types[$new_placement['type']])) ? $new_placement['type'] : 'default';
81 // escape name
82 $new_placement['name'] = esc_attr( $new_placement['name'] );
83
84 // add new place to all placements
85 $placements[$new_placement['slug']] = array(
86 'type' => $new_placement['type'],
87 'name' => $new_placement['name']
88 );
89
90 // save array
91 update_option( 'advads-ads-placements', $placements );
92
93 return true;
94 }
95
96 /**
97 * save placements
98 *
99 * @since 1.1.0
100 * @param array $placement_items
101 * @return mixed true if saved; error message if not
102 */
103 public static function save_placements($placement_items) {
104
105 // load placements // -TODO use model
106 $placements = Advanced_Ads::get_ad_placements_array();
107
108 foreach ( $placement_items as $_placement_slug => $_placement ) {
109 // remove the placement
110 if ( isset($_placement['delete']) ) {
111 unset($placements[$_placement_slug]);
112 continue;
113 }
114 // save item
115 if ( isset($_placement['item']) ) {
116 $placements[$_placement_slug]['item'] = $_placement['item']; }
117 // save item options
118 if ( isset($_placement['options']) ){
119 $placements[$_placement_slug]['options'] = $_placement['options'];
120 if ( isset($placements[$_placement_slug]['options']['index']) ) {
121 $placements[$_placement_slug]['options']['index'] = absint( $placements[$_placement_slug]['options']['index'] ); }
122 }
123 }
124
125 // save array
126 update_option( 'advads-ads-placements', $placements );
127
128 return true;
129 }
130
131 /**
132 * get items for item select field
133 *
134 * @since 1.1
135 * @return arr $select items for select field
136 */
137 public static function items_for_select() {
138 $select = array();
139 $model = Advanced_Ads::get_instance()->get_model();
140
141 // load all ad groups
142 $groups = $model->get_ad_groups();
143 foreach ( $groups as $_group ) {
144 $select['groups']['group_' . $_group->term_id] = $_group->name;
145 }
146
147 // load all ads
148 $ads = $model->get_ads( array('orderby' => 'name', 'order' => 'ASC') );
149 foreach ( $ads as $_ad ) {
150 $select['ads']['ad_' . $_ad->ID] = $_ad->post_title;
151 }
152
153 return $select;
154 }
155
156 /**
157 * get html tags for content injection
158 *
159 * @since 1.3.5
160 * @return arr $tags array with tags that can be used for content injection
161 */
162 public static function tags_for_content_injection(){
163 $tags = array(
164 'p' => sprintf( __( 'paragraph (%s)', ADVADS_SLUG ), '&lt;p&gt;' ),
165 'h2' => sprintf( __( 'headline 2 (%s)', ADVADS_SLUG ), '&lt;h2&gt;' ),
166 'h3' => sprintf( __( 'headline 3 (%s)', ADVADS_SLUG ), '&lt;h3&gt;' ),
167 'h4' => sprintf( __( 'headline 4 (%s)', ADVADS_SLUG ), '&lt;h4&gt;' ),
168 );
169
170 return $tags;
171 }
172
173 /**
174 * return content of a placement
175 *
176 * @since 1.1.0
177 * @param string $id slug of the display
178 */
179 public static function output($id = '') {
180 // get placement data for the slug
181 if ( $id == '' ) {
182 return; }
183
184 $placements = get_option( 'advads-ads-placements', array() );
185
186 if ( isset($placements[$id]['item']) ) {
187 $_item = explode( '_', $placements[$id]['item'] );
188
189 if ( isset($_item[1]) ) {
190 $_item_id = absint( $_item[1] ); }
191 elseif (empty($_item_id))
192 return;
193
194 // return either ad or group content
195 if ( $_item[0] == 'ad' ) {
196 // add the placement to the global output array
197 $advads = Advanced_Ads::get_instance();
198 $advads->current_ads[] = array('type' => 'placement', 'id' => $id, 'title' => $placements[$id]['name']);
199
200 // create class from placement id, but not, if header injection
201 if ( isset($placements[$id]['type']) && $placements[$id]['type'] == 'header' ){
202 $ad_args = array();
203 } else {
204 $class = 'advads-' . $id;
205 $ad_args = array('output' => array('class' => array($class)));
206 }
207
208 return Advanced_Ads_Select::get_instance()->get_ad_by_method( $_item_id, 'id', $ad_args );
209 } elseif ( $_item[0] == 'group' ) {
210 // add the placement to the global output array
211 $advads = Advanced_Ads::get_instance();
212 $advads->current_ads[] = array('type' => 'placement', 'id' => $id, 'title' => $placements[$id]['name']);
213
214 return Advanced_Ads_Select::get_instance()->get_ad_by_method( $_item_id, 'group' );
215 }
216 }
217
218 return;
219 }
220
221 /**
222 * inject ads directly into the content
223 *
224 * @since 1.2.1
225 * @param string $placement_id id of the placement
226 * @param arr $options placement options
227 * @param string $content
228 * @return type
229 * @link inspired by http://www.wpbeginner.com/wp-tutorials/how-to-insert-ads-within-your-post-content-in-wordpress/
230 */
231 public static function &inject_in_content($placement_id, $options, &$content) {
232
233 /*
234 * hot-fixed to support some tags under idealised conditions.
235 * this does ignore:
236 * - autop() messups
237 * - nesting of any kind
238 * - non-valid XHTML (i.e. wild HTML)
239 *
240 * 'after' is experimental as the concept requires DOM and is not fully deterministic across implementations.
241 * it falls back to 'before' n+1-th element or 'after' closing tag of the n-th.
242 */
243 $tag = isset($options['tag']) ? $options['tag'] : 'p';
244 $position = isset($options['position']) ? $options['position'] : 'after';
245 $paragraph_id = isset($options['index']) ? $options['index'] : 1;
246 $offset = 0;
247 $insertAt = null;
248
249 // sanitise
250 $tag = preg_quote( strtolower( $tag ), '`' );
251 $before = $position !== 'after';
252 $paragraph_id = max( 1, (int) $paragraph_id );
253
254 // detect n-th tag
255 $matches = array();
256 while ( 1 === preg_match( "`<$tag(?=[ >/])(?:[^>]+/>|.+?(?:</$tag\s*>|(?=<$tag(?=[ >/])|$)))`Ssi", $content, $matches, PREG_OFFSET_CAPTURE, $offset ) ) {
257 $offset = $matches[0][1];
258
259 // skip empty
260 // -TODO should only ignore whitespaces, not all special chars
261 if ( '' === preg_replace( '/&[a-z0-9#]+;|\s+/i', '', strip_tags( htmlspecialchars( $matches[0][0] ) ) ) ) {
262 continue;
263 }
264
265 $paragraph_id--;
266 if ( $paragraph_id <= 0 ) {
267 $insertAt = $before ? $offset : $offset + strlen( $matches[0][0] );
268 break;
269 }
270
271 // start at next offset
272 $offset += strlen( $matches[0][0] );
273 }
274
275 if ( isset($insertAt) ) {
276 $ad_content = Advads_Ad_Placements::output( $placement_id );
277 if ( $insertAt === false ) {
278 $content .= $ad_content; // fallback: end-of-content
279 } else {
280 $content = substr( $content, 0, $insertAt ) . $ad_content . substr( $content, $insertAt );
281 }
282
283 return $content;
284 }
285
286 return $content;
287 }
288 }
289