PluginProbe
Taboola / 2.0.1
Taboola v2.0.1
1.0.4 1.0.5 1.0.6 1.0.8 2.0.1 2.0.2 2.1.0 2.1.1 2.2.2 2.2.3 3.0.0 3.0.1 3.0.2 3.1.0 trunk 1.0 1.0.1 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.2 1.0.3
← All changes | taboola_widget.php +497 -85 1.0.152.0.1 View file →
@@ -2,19 +2,24 @@
2 2 /**
3 3 * Plugin Name: Taboola
4 4 * Plugin URI: https://developers.taboola.com/web-integrations/discuss
5 5 * Description: Taboola
6 - * Version: 1.0.15
6 + * Version: 2.0.1
7 7 * Author: Taboola
8 8 */
9 9
10 -define ("XPATH_MARKER","/");
11 -define ("JS_INDICATOR","{JS}");
12 -define ("JS_MARKER","{");
10 +define ("TABOOLA_PLUGIN_VERSION","2.0.1"); // => UPDATE FOR *EVERY* RELEASE (USED FOR TRACKING)
11 +define ("TABOOLA_MIN_VER","2.0.1"); // => UPDATE *ONLY* IF THIS RELEASE HAS *DB CHANGES*
12 +define ("TABOOLA_DEBUG_MODE", false); // => SET TO 'FALSE' FOR *EVERY* RELEASE (USED TO SUPRESS DEBUGGING LOGS)
13 +
14 +define ("TABOOLA_OPTION_NAME","taboola_plugin_version"); // *If* this release has DB changes, then the min version will be saved under 'taboola_plugin_version' in 'wp_options'.
15 +
16 +define ("TABOOLA_XPATH_MARKER","/");
17 +define ("TABOOLA_JS_INDICATOR","{JS}");
18 +define ("TABOOLA_JS_MARKER","{");
13 19 define ("TABOOLA_CONTENT_FORMAT_STRING",'string');
14 20 define ("TABOOLA_CONTENT_FORMAT_SCRIPT",'script');
15 21 define ("TABOOLA_CONTENT_FORMAT_HTML",'html');
16 -define ("TABOOLA_PLUGIN_VERSION","1.0.15");
17 22
18 23
19 24 include_once('widget.php');
20 25 require_once('JavaScriptWrapper.php');
@@ -26,9 +31,8 @@
26 31 public $data = array();
27 32 public $_is_widget_on_page;
28 33 public $_is_head_script_loaded = false;
29 34
30 -
31 35 function __construct()
32 36 {
33 37 global $wpdb;
34 38
@@ -45,16 +49,17 @@
45 49
46 50 $this->tbl_taboola_settings = $wpdb->prefix . '_taboola_settings';
47 51
48 52 //activation function
49 - register_activation_hook($this->plugin_name, array(&$this, 'activate'));
53 + register_activation_hook($this->plugin_name, array(&$this, 'update_db'));
54 + add_action('admin_init', array(&$this, 'update_db'));
50 55
51 56 // Enable sidebar widgets
52 - if($this->settings != NULL && !empty($this->settings->publisher_id)){
57 + if ($this->settings != NULL && !empty($this->settings->publisher_id)){
53 58 //register Taboola widget
54 59 add_action('widgets_init',
55 - function(){
56 - return register_widget("WP_Widget_Taboola");
60 + function(){
61 + return register_widget("WP_Widget_Taboola");
57 62 }
58 63 );
59 64 }
60 65
@@ -63,20 +68,17 @@
63 68 if (is_admin()) {
64 69 //add menu for plugin
65 70 add_action( 'admin_menu', array(&$this, 'admin_generate_menu') );
66 71 add_filter('plugin_action_links', array(&$this, 'plugin_action_links'), 10, 2 );
67 - } else {
68 - if($this->settings != NULL){
72 + }else if ($this->settings != NULL){
69 73 add_action('wp_head', array(&$this, 'taboola_header_loader_inject'));
70 74 add_action('wp_footer', array(&$this, 'taboola_footer_loader_js'));
71 75 add_filter('the_content', array(&$this, 'load_taboola_content'));
72 - }
76 + add_filter('the_content', array(&$this, 'load_taboola_content_mid'));
77 + add_filter('the_content', array(&$this, 'load_taboola_content_home'));
73 78 }
74 - }
79 + }
75 80
76 -
77 -
78 -
79 81 function plugin_action_links($links, $file) {
80 82 static $this_plugin;
81 83
82 84 if (!$this_plugin) {
@@ -95,8 +97,24 @@
95 97 $retVal = ((trim($this->settings->publisher_id) != '') && is_single() && $this->settings->first_bc_enabled && trim($this->settings->first_bc_widget_id) != '');
96 98 return $retVal;
97 99 }
98 100
101 + private function should_show_content_widget_mid(){
102 + // PC - only if v2 was installed:
103 + if (!$this->is_db_updated_for_min_ver("2.0.0"))
104 + return false;
105 + $retVal1 = ((trim($this->settings->publisher_id) != '') && is_single() && $this->settings->mid_enabled && trim($this->settings->mid_widget_id) != '');
106 + return $retVal1;
107 + }
108 +
109 + private function should_show_content_widget_home(){
110 + // PC - only if v2 was installed:
111 + if (!$this->is_db_updated_for_min_ver("2.0.0"))
112 + return false;
113 + $retVal2 = ((trim($this->settings->publisher_id) != '') && is_front_page() && $this->settings->home_enabled && trim($this->settings->home_widget_id) != '');
114 + return $retVal2;
115 + }
116 +
99 117 private function should_show_sidebar_widget(){
100 118 $retVal = ((trim($this->settings->publisher_id) != '') && is_active_widget( false, false, TABOOLA_WIDGET_BASE_ID, true ));
101 119 return $retVal;
102 120 }
@@ -102,16 +120,15 @@
102 120 }
103 121
104 122 // Determine if a taboola widget should be added somewhere on the current page (content or sidebar)
105 123 function is_widget_on_page(){
106 - return $this->should_show_content_widget() || $this->should_show_sidebar_widget();
124 + return $this->should_show_content_widget() || $this->should_show_content_widget_mid() || $this->should_show_content_widget_home() || $this->should_show_sidebar_widget();
107 125 }
108 126
109 127 function get_page_type(){
110 -
111 128 $page_type='article';
112 129 if (is_front_page()){
113 - $page_type='home';
130 + $page_type='home';
114 131 }else if (is_category() || is_archive() || is_search()){
115 132 $page_type='category';
116 133 }
117 134 return $page_type;
@@ -129,13 +146,14 @@
129 146 '{{PAGE_TYPE}}' => $this->get_page_type(),
130 147 '{{WORDPRESS_VERSION}}' => get_bloginfo('version'),
131 148 '{{PHP_VERSION}}' => phpversion(),
132 149 '{{PLUGIN_VERSION}}' => TABOOLA_PLUGIN_VERSION,
133 - '{{LOCATION}}' => $this->settings->location_string
150 + '{{LOC_MID}}' => $this->settings->mid_location_string,
151 + '{{LOC_HOME}}' => $this->settings->home_location_string
134 152 );
135 153
136 154 $scriptWrapper = new JavaScriptWrapper("loaderInjectionScript.js",$stringParams);
137 - $head_string = $scriptWrapper->getScripMarkupString();
155 + $head_string = $scriptWrapper->getScriptMarkupString();
138 156 }
139 157
140 158 return $head_string;
141 159 }
@@ -142,9 +160,8 @@
142 160
143 161
144 162 // This function is used for the hook action, injects the header content to the <head> tag.
145 163 function taboola_header_loader_inject(){
146 -
147 164 echo $this->taboola_header_loader_js();
148 165 }
149 166
150 167
@@ -152,43 +169,77 @@
152 169
153 170 // Only adding flush script if a widget is going to be placed on the page.
154 171 if ( $this->is_widget_on_page() ){
155 172 $flushInjectionScript = new JavaScriptWrapper('flushInjectionScript.js',array());
156 - echo $flushInjectionScript->getScripMarkupString();
173 + echo $flushInjectionScript->getScriptMarkupString();
157 174 }
158 175 }
159 176
177 + // Below-article widget
160 178 function load_taboola_content($content)
161 179 {
162 180 $taboola_content = array();
163 181 if ($this->should_show_content_widget()){
164 182
165 - $firstWidgetParams = array('{{WIDGET_ID}}' => $this->settings->first_bc_widget_id,
166 - '{{CONTAINER}}' => 'taboola-below-article',
167 - '{{PLACEMENT}}' => 'below-article');
183 + $firstWidgetParams = array(
184 + '{{WIDGET_ID}}' => $this->settings->first_bc_widget_id,
185 + '{{CONTAINER}}' => 'taboola-below-article-thumbnails',
186 + // PC - If v2 was not installed, then use v1 logic
187 + '{{PLACEMENT}}' => (!empty($this->settings->first_bc_placement)) ? $this->settings->first_bc_placement : 'below-article' // In case v1 upgrade has not run yet
188 + );
168 189
169 190 $firstWidgetScript = new JavaScriptWrapper("widgetInjectionScript.js",$firstWidgetParams);
170 - $taboola_content[TABOOLA_CONTENT_FORMAT_HTML][] = "<div id='taboola-below-article'></div>";
191 + $taboola_content[TABOOLA_CONTENT_FORMAT_HTML][] = "<div id='taboola-below-article-thumbnails'></div>";
171 192 $taboola_content[TABOOLA_CONTENT_FORMAT_SCRIPT][] = $firstWidgetScript;
172 193
173 - // Adding the 2nd widget if needed
174 - if($this->settings->second_bc_enabled && trim($this->settings->second_bc_widget_id) != ''){
194 + $content = $this->embed_taboola_content_location($content,$taboola_content);
195 + }
175 196
176 - $secondWidgetParams = array('{{WIDGET_ID}}' => $this->settings->second_bc_widget_id,
177 - '{{CONTAINER}}' => 'taboola-below-article-second',
178 - '{{PLACEMENT}}' => 'below-article-2nd');
197 + return $content;
198 + }
199 +
200 + // Mid-article-widget
201 + function load_taboola_content_mid($content)
202 + {
203 + $taboola_content_mid = array();
204 + if ($this->should_show_content_widget_mid()){
205 +
206 + $secondWidgetParams = array('{{WIDGET_ID}}' => $this->settings->mid_widget_id,
207 + '{{CONTAINER}}' => 'taboola-mid-article-thumbnails',
208 + '{{PLACEMENT}}' => $this->settings->mid_placement);
209 +
179 210 $secondWidgetScript = new JavaScriptWrapper("widgetInjectionScript.js",$secondWidgetParams);
211 + $taboola_content_mid[TABOOLA_CONTENT_FORMAT_HTML][] = "<div id='taboola-mid-article-thumbnails'></div>";
212 + $taboola_content_mid[TABOOLA_CONTENT_FORMAT_SCRIPT][] = $secondWidgetScript;
180 213
181 - $taboola_content[TABOOLA_CONTENT_FORMAT_HTML][] = "<div id='taboola-below-article-second'></div>";
182 - $taboola_content[TABOOLA_CONTENT_FORMAT_SCRIPT][] = $secondWidgetScript;
183 - }
214 + $content = $this->embed_taboola_content_location_mid($content,$taboola_content_mid,trim($this->settings->mid_location_string));
215 + }
184 216
185 - $content = $this->embed_taboola_content_location($content,$taboola_content,trim($this->settings->location_string));
186 - }
217 + return $content;
218 + }
187 219
220 + // Homepage widget
221 + function load_taboola_content_home($content)
222 + {
223 +
224 + $taboola_content_home = array();
225 + if ($this->should_show_content_widget_home()){
226 +
227 + $homeWidgetParams = array('{{WIDGET_ID}}' => $this->settings->home_widget_id,
228 + '{{CONTAINER}}' => 'taboola-homepage-thumbnails',
229 + '{{PLACEMENT}}' => $this->settings->home_placement);
230 +
231 + $homeWidgetScript = new JavaScriptWrapper("widgetInjectionScript.js",$homeWidgetParams);
232 + $taboola_content_home[TABOOLA_CONTENT_FORMAT_HTML][] = "<div id='taboola-homepage-thumbnails'></div>";
233 + $taboola_content_home[TABOOLA_CONTENT_FORMAT_SCRIPT][] = $homeWidgetScript;
234 +
235 + $content = $this->embed_taboola_content_location_home($content,$taboola_content_home,trim($this->settings->home_location_string));
236 + }
188 237 return $content;
238 +
189 239 }
190 240
241 + // Below-article widget
191 242
192 243 // Extract the taboola content in the required format:
193 244 // String - for injecting on the servr side
194 245 // Script or HTML - for injecting on the client side
@@ -211,26 +262,95 @@
211 262 return $ret_val;
212 263 }
213 264
214 265
215 - // Do the actual logic of choosing where to place the taboola content based on the "location" attribute
216 - function embed_taboola_content_location($content, $taboola_content, $location){
266 + // Mid-article widget
267 + function format_taboola_content_mid($taboola_content_mid,$format){
268 + $ret_val = null;
269 +
270 + switch($format){
271 + case TABOOLA_CONTENT_FORMAT_STRING:
272 + $result_string = join("",$taboola_content_mid[TABOOLA_CONTENT_FORMAT_HTML]).
273 + "<script type='text/javascript'>".join("\n",$taboola_content_mid[TABOOLA_CONTENT_FORMAT_SCRIPT])."</script>";
274 + $ret_val = $result_string;
275 + break;
276 +
277 + // script or html
278 + default:
279 + $ret_val = str_replace("\n","",join("",$taboola_content_mid[$format]));
280 + break;
281 + }
282 +
283 + return $ret_val;
284 + }
285 +
286 +
287 + // Homepage widget
288 + function format_taboola_content_home($taboola_content_home,$format){
289 +
290 + $ret_val = null;
291 +
292 + switch($format){
293 + case TABOOLA_CONTENT_FORMAT_STRING:
294 + $result_string = join("",$taboola_content_home[TABOOLA_CONTENT_FORMAT_HTML]).
295 + "<script type='text/javascript'>".join("\n",$taboola_content_home[TABOOLA_CONTENT_FORMAT_SCRIPT])."</script>";
296 + $ret_val = $result_string;
297 + break;
298 +
299 + // script or html
300 + default:
301 + $ret_val = str_replace("\n","",join("",$taboola_content_home[$format]));
302 + break;
303 + }
304 +
305 + return $ret_val;
306 +
307 + }
308 +
309 + // Below-article widget
310 + // Do the actual logic of choosing where to place the taboola content.
311 + function embed_taboola_content_location($content, $taboola_content){
217 312 $do_default = true;
218 313
314 + // tag is placed outside of content in order to allow "read more" functionality.
315 + if ($this->settings->out_of_content_enabled){
316 +
317 + $scriptWrapper = new JavaScriptWrapper("js_inject.min.js",array(
318 + "{{HTML}}" => $this->format_taboola_content($taboola_content,TABOOLA_CONTENT_FORMAT_HTML),
319 + "{{SCRIPT}}" => $this->format_taboola_content($taboola_content,TABOOLA_CONTENT_FORMAT_SCRIPT))
320 + );
321 + $scriptWrapper->appendScript("injectWidgetByMarker('tbmarker');");
322 + $content = $content."<span id='tbmarker'></span><script type='text/javascript'>".$scriptWrapper."</script>";
323 + $do_default = false;
324 + }
325 +
326 + // Default for below-article widget - add to the end of the content
327 + if ($do_default){
328 + $content = $content.$this->format_taboola_content($taboola_content,TABOOLA_CONTENT_FORMAT_STRING);
329 + }
330 +
331 + return $content;
332 + }
333 +
334 + // Mid-article widget
335 + // Do the actual logic of choosing where to place the taboola content based on the "location" attribute
336 + function embed_taboola_content_location_mid($content, $taboola_content_mid, $location){
337 + $do_default = true;
338 +
219 339 if (isset($location) && $location != ''){
220 340 $first_char = substr($location,0,1);
221 341
222 342 // DIV/XPATH provided for JS handling
223 - if ($first_char == JS_MARKER){
224 - $full_indicator = substr($location,0,strlen(JS_INDICATOR));
343 + if ($first_char == TABOOLA_JS_MARKER){
344 + $full_indicator = substr($location,0,strlen(TABOOLA_JS_INDICATOR));
225 345
226 - if ($full_indicator == JS_INDICATOR){
346 + if ($full_indicator == TABOOLA_JS_INDICATOR){
227 347
228 - $xpath = substr($location,strlen(JS_INDICATOR));
229 - $scriptWrapper = new JavaScriptWrapper("js_inject.min.js",array(
230 - "{{HTML}}" => $this->format_taboola_content($taboola_content,TABOOLA_CONTENT_FORMAT_HTML),
231 - "{{SCRIPT}}" => $this->format_taboola_content($taboola_content,TABOOLA_CONTENT_FORMAT_SCRIPT))
232 - );
348 + $xpath = substr($location,strlen(TABOOLA_JS_INDICATOR));
349 + $scriptWrapper = new JavaScriptWrapper("js_inject.min.js",array(
350 + "{{HTML}}" => $this->format_taboola_content_mid($taboola_content_mid,TABOOLA_CONTENT_FORMAT_HTML),
351 + "{{SCRIPT}}" => $this->format_taboola_content_mid($taboola_content_mid,TABOOLA_CONTENT_FORMAT_SCRIPT))
352 + );
233 353 $scriptWrapper->appendScript("injectWidgetByXpath('".$xpath."');");
234 354 $content = $content."<span id='tbdefault'></span><script type='text/javascript'>".$scriptWrapper."</script>";
235 355
236 356 $do_default = false;
@@ -235,48 +355,86 @@
235 355
236 356 $do_default = false;
237 357 }
238 358
239 - // server side selector provided (see simple_html_dom selectors https://simplehtmldom.sourceforge.net/manual.htm)
359 + // server side selector provided (see simple_html_dom selectors http://simplehtmldom.sourceforge.net/manual.htm)
240 360 // basically it's CSS selectors like in jQuery
241 361 } else{
242 -
243 362 require_once('simple_html_dom.php');
244 363
245 364 $html_doc = str_get_html($content);
246 - $target_location = $html_doc->find($location,0);
365 + $target_location = $html_doc->find($location,($this->settings->mid_location_string_occurrence)-1);
247 366
248 367 // if the location was found within the html content
249 368 if (isset($target_location) && is_object($target_location)){
250 369
251 370 // adding taboola content AFTER the target location
252 - $target_location->outertext = $target_location->outertext.$this->format_taboola_content($taboola_content,TABOOLA_CONTENT_FORMAT_STRING);
371 + $target_location->outertext = $target_location->outertext.$this->format_taboola_content_mid($taboola_content_mid,TABOOLA_CONTENT_FORMAT_STRING);
253 372 $content = $html_doc;
254 373 $do_default = false;
255 374 }
256 375 }
376 + }
377 + // Default for below-article widget - add to the end of the content
378 + // if ($do_default){
379 + // $content = $content.$this->format_taboola_content_mid($taboola_content_mid,TABOOLA_CONTENT_FORMAT_STRING);
380 + // }
257 381
258 - // tag is placed outside of content in order to allow "read more" functionality.
259 - }elseif ($this->settings->out_of_content_enabled){
382 + return $content;
383 + }
260 384
261 - $scriptWrapper = new JavaScriptWrapper("js_inject.min.js",array(
262 - "{{HTML}}" => $this->format_taboola_content($taboola_content,TABOOLA_CONTENT_FORMAT_HTML),
263 - "{{SCRIPT}}" => $this->format_taboola_content($taboola_content,TABOOLA_CONTENT_FORMAT_SCRIPT))
264 - );
265 - $scriptWrapper->appendScript("injectWidgetByMarker('tbmarker');");
266 - $content = $content."<span id='tbmarker'></span><script type='text/javascript'>".$scriptWrapper."</script>";
267 - $do_default = false;
268 - }
385 + // Homepage widget
386 + // Do the actual logic of choosing where to place the taboola content based on the "location" attribute
387 + function embed_taboola_content_location_home($content, $taboola_content_home, $location){
269 388
270 - // Default - add to the end of the content
271 - if ($do_default){
272 - $content = $content.$this->format_taboola_content($taboola_content,TABOOLA_CONTENT_FORMAT_STRING);
273 - }
389 + $do_default = true;
274 390
275 - return $content;
391 + if (isset($location) && $location != ''){
392 + $first_char = substr($location,0,1);
393 +
394 + // DIV/XPATH provided for JS handling
395 + if ($first_char == TABOOLA_JS_MARKER){
396 + $full_indicator = substr($location,0,strlen(TABOOLA_JS_INDICATOR));
397 +
398 + if ($full_indicator == TABOOLA_JS_INDICATOR){
399 +
400 + $xpath = substr($location,strlen(TABOOLA_JS_INDICATOR));
401 + $scriptWrapper = new JavaScriptWrapper("js_inject.min.js",array(
402 + "{{HTML}}" => $this->format_taboola_content_home($taboola_content_home,TABOOLA_CONTENT_FORMAT_HTML),
403 + "{{SCRIPT}}" => $this->format_taboola_content_home($taboola_content_home,TABOOLA_CONTENT_FORMAT_SCRIPT))
404 + );
405 + $scriptWrapper->appendScript("injectWidgetByXpath('".$xpath."');");
406 + $content = $content."<span id='tbdefault'></span><script type='text/javascript'>".$scriptWrapper."</script>";
407 +
408 + $do_default = false;
409 + }
410 +
411 + // server side selector provided (see simple_html_dom selectors http://simplehtmldom.sourceforge.net/manual.htm)
412 + // basically it's CSS selectors like in jQuery
413 + } else{
414 + require_once('simple_html_dom.php');
415 +
416 + $html_doc = str_get_html($content);
417 + $target_location = $html_doc->find($location,($this->settings->home_location_string_occurrence)-1);
418 +
419 + // if the location was found within the html content
420 + if (isset($target_location) && is_object($target_location)){
421 +
422 + // adding taboola content AFTER the target location
423 + $target_location->outertext = $target_location->outertext.$this->format_taboola_content_home($taboola_content_home,TABOOLA_CONTENT_FORMAT_STRING);
424 + $content = $html_doc;
425 + $do_default = false;
426 + }
427 + }
428 + }
429 + // Default for below-article widget - add to the end of the content
430 + // if ($do_default){
431 + // $content = $content.$this->format_taboola_content_home($taboola_content_home,TABOOLA_CONTENT_FORMAT_STRING);
432 + // }
433 + return $content;
434 +
276 435 }
277 436
278 -
279 437 function admin_generate_menu(){
280 438 global $current_user;
281 439 add_menu_page('Taboola', 'Taboola', 'manage_options', 'taboola_widget', array(&$this, 'admin_taboola_settings'), $this->plugin_url.'img/taboola_icon.png', 110);
282 440 }
@@ -287,28 +445,101 @@
287 445 $taboola_errors = array();
288 446 if($_SERVER['REQUEST_METHOD'] == 'POST'){
289 447
290 448 if(trim($_POST['publisher_id']) == ''){
291 - $taboola_errors[] = "Please add a 'Publisher ID' in order to apply changes to your widgets";
449 + $taboola_errors[] = "Publisher ID";
292 450 }
293 - if((isset($_POST['first_bc_enabled']) && trim($_POST['first_bc_widget_id']) == '') ||
294 - (isset($_POST['second_bc_enabled']) && trim($_POST['second_bc_widget_id']) == '')
295 - ){
296 - $taboola_errors[] = "Please add a 'Widget ID' in order to apply changes to your widgets";
451 +
452 + if(isset($_POST['first_bc_enabled'])) {
453 + if (trim($_POST['first_bc_widget_id']) == '') {
454 + $taboola_errors[] = "Below-article > Widget ID";
455 + }
456 + if (trim($_POST['first_bc_placement']) == '') {
457 + $taboola_errors[] = "Below-article > Placement Name";
458 + }
297 459 }
298 - if (trim($_POST['location_string']) != '' && !$this->is_location_string_valid($_POST['location_string'])){
299 - $taboola_errors[] = "Location string not valid, please contact your Taboola account manager to get a valid location string";
460 +
461 + if(isset($_POST['mid_enabled'])) {
462 + if (trim($_POST['mid_widget_id']) == '') {
463 + $taboola_errors[] = "Mid-article > Widget ID";
464 + }
465 + if (trim($_POST['mid_placement']) == '') {
466 + $taboola_errors[] = "Mid-article > Placement Name";
467 + }
468 + if (trim($_POST['mid_location_string']) == '') {
469 + $taboola_errors[] = "Mid-article > CSS selector";
470 + }
471 + else {
472 + // If the 'location' WAS filled in, then...
473 +
474 + // 1) Check for a valid 'location':
475 +
476 + // Validation method has not been implemented
477 + // mid_if (!$this->is_locaton_string_valid1($_POST['mid_location_string'])) {
478 + // $taboola_errors[] = "Mid-article > CSS Selector (invalid value)";
479 + // }
480 +
481 + // 2) Validate the 'occurrence':
482 + if (!$this->is_mid_location_string_occurrence_valid($_POST['mid_location_string_occurrence'])) {
483 + $taboola_errors[] = "Mid-article > Occurance (must be >= 1)";
484 + }
485 + }
486 +
300 487 }
488 +
489 + if(isset($_POST['home_enabled'])) {
490 + if (trim($_POST['home_widget_id']) == '') {
491 + $taboola_errors[] = "Homepage > Widget ID";
492 + }
493 + if (trim($_POST['home_placement']) == '') {
494 + $taboola_errors[] = "Homepage > Placement Name";
495 + }
496 +
497 + if (trim($_POST['home_location_string']) == '') {
498 + $taboola_errors[] = "Homepage > CSS selector";
499 + }
500 + else {
501 + // If the 'location' WAS filled in, then...
502 +
503 + // 1) Check for a valid 'location':
504 +
505 + // Validation method has not been implemented
506 + // if (!$this->is_home_location_string_valid($_POST['home_location_string'])) {
507 + // $taboola_errors[] = "Homepage > CSS Selector (invalid value)";
508 + // }
509 +
510 + // 2) Validate the 'occurrence':
511 + if (!empty($_POST['home_location_string']) && !$this->is_home_location_string_occurrence_valid($_POST['home_location_string_occurrence'])) {
512 + $taboola_errors[] = "Homepage > Occurance (must be >= 1)";
513 + }
514 + }
515 + }
516 +
301 517 if(count($taboola_errors) == 0){
302 518
303 519 $data = array(
304 520 "publisher_id" => trim($_POST['publisher_id']),
521 +
305 522 "first_bc_enabled" => isset($_POST['first_bc_enabled']) ? true : false,
306 - "first_bc_widget_id" => trim($_POST['first_bc_widget_id']),
307 - "second_bc_enabled" => isset($_POST['second_bc_enabled']) ? true : false,
308 - "second_bc_widget_id" => trim($_POST['second_bc_widget_id']),
309 - "location_string" => trim($_POST['location_string']),
310 - "out_of_content_enabled" => isset($_POST['out_of_content_enabled']) ? true : false
523 + "first_bc_widget_id" => !empty($_POST['first_bc_widget_id']) ? trim($_POST['first_bc_widget_id']) : '',
524 + "first_bc_placement" => !empty($_POST['first_bc_placement']) ? trim($_POST['first_bc_placement']) : '',
525 +
526 + "out_of_content_enabled" => isset($_POST['out_of_content_enabled']) ? true : false,
527 +
528 + "mid_enabled" => isset($_POST['mid_enabled']) ? true : false,
529 + "mid_widget_id" => !empty($_POST['mid_widget_id']) ? trim($_POST['mid_widget_id']) : '',
530 + "mid_placement" => !empty($_POST['mid_placement']) ? trim($_POST['mid_placement']) : '',
531 + "mid_paragraph_ui_mode" => !empty($_POST['mid_paragraph_ui_mode']) ? trim($_POST['mid_paragraph_ui_mode']) : '',
532 +
533 + "mid_location_string_occurrence" => !empty($_POST['mid_location_string_occurrence']) ? $_POST['mid_location_string_occurrence'] : '',
534 + "mid_location_string" => !empty($_POST['mid_location_string']) ? trim($_POST['mid_location_string']) : '',
535 +
536 + "home_enabled" => isset($_POST['home_enabled']) ? true : false,
537 + "home_widget_id" => !empty($_POST['home_widget_id']) ? trim($_POST['home_widget_id']) : '',
538 + "home_placement" => !empty($_POST['home_placement']) ? trim($_POST['home_placement']) : '',
539 +
540 + "home_location_string_occurrence" => !empty($_POST['home_location_string_occurrence']) ? $_POST['home_location_string_occurrence'] : '',
541 + "home_location_string" => !empty($_POST['home_location_string']) ? trim($_POST['home_location_string']) : ''
311 542 );
312 543
313 544 //var_dump($settings);
314 545 if($settings == NULL){
@@ -319,23 +550,138 @@
319 550 }
320 551 $settings = $wpdb->get_row("select * from ".$wpdb->prefix."_taboola_settings limit 1");
321 552 }
322 553
554 + include_once('settings.php');
555 + }
323 556
324 - include_once('settings.php');
557 + function is_mid_location_string_valid($mid_location_string){
558 + // TODO:: validate the location string
559 + return true;
325 560 }
326 561
327 - function is_location_string_valid($location_string){
562 + function is_mid_location_string_occurrence_valid($mid_location_string_occurrence){
563 +
564 + if ((int)$mid_location_string_occurrence >= 1) {
565 + return true;
566 + }
567 + return false;
568 + }
569 +
570 + function is_home_location_string_valid($home_location_string){
328 571 // TODO:: validate the location string
329 572 return true;
330 573 }
331 - function activate(){
574 +
575 + function is_home_location_string_occurrence_valid($home_location_string_occurrence){
576 +
577 + if ((int)$home_location_string_occurrence >= 1) {
578 + return true;
579 + }
580 + return false;
581 + }
582 + function columnExists($column_name) {
332 583 global $wpdb;
584 + $table_name = $wpdb->prefix . "_taboola_settings";
585 + tb_write_log("table name : " . $table_name);
586 + tb_write_log("column name : " . $column_name);
333 587
588 + $column_exists = $wpdb->get_var("SHOW COLUMNS FROM $table_name LIKE '$column_name'") !== null;
589 +
590 + if ($column_exists) {
591 + tb_write_log("Yes - column " . $column_name . " DOES exist!"); //PC
592 + return true;
593 + } else {
594 + tb_write_log("No - column " . $column_name . " does NOT exist!"); //PC
595 + return false;
596 + }
597 + }
598 +
599 + function is_upgrade_from_v1() {
600 +
601 + if($this->columnExists("first_bc_widget_id") && !$this->columnExists("first_bc_placement")){
602 + tb_write_log("This IS a v1 upgrade!"); //PC
603 + return true;
604 + }
605 + else {
606 + tb_write_log("This is NOT a v1 upgrade!"); //PC
607 + return false;
608 + }
609 +
610 + }
611 +
612 + function is_db_updated_for_min_ver($min_ver) {
613 + /**
614 + * Checks if the DB was *previously* updated for the minimum version specified.
615 + * $min_ver should be passed in a format like this: "2.1.0"
616 + */
617 + global $wpdb;
618 +
619 + // Check the saved version in wp_options. Default to '1.0.0' if the option is not found.
620 + $saved_version = get_option(TABOOLA_OPTION_NAME, '1.0.0');
621 +
622 + $db_is_up_to_date = version_compare($saved_version, $min_ver, '>=');
623 + //tb_write_log($db_is_up_to_date);
624 + return $db_is_up_to_date;
625 +
626 + }
627 +
628 + function is_db_updated_for_current_ver() {
629 + /**
630 + * Checks if the DB was *previously* updated for the version currently loaded.
631 + */
632 + global $wpdb;
633 +
634 + // Check the saved version in wp_options. Default to '1.0.0' if the option is not found.
635 + $saved_version = get_option(TABOOLA_OPTION_NAME, '1.0.0');
636 +
637 + // Get the currently loaded plugin version from wp_options.
638 + $plugin_version = $this->get_loaded_plugin_version();
639 +
640 + $db_is_up_to_date = version_compare($saved_version, $plugin_version, '>=');
641 + //tb_write_log($db_is_up_to_date);
642 + return $db_is_up_to_date;
643 +
644 + }
645 +
646 + function get_loaded_plugin_version() {
647 +
648 + $plugin_data = get_plugin_data( __FILE__ ); // Can be invoked from Admin page only
649 + $loaded_plugin_version = $plugin_data['Version'];
650 + return $loaded_plugin_version;
651 +
652 + }
653 +
654 + function save_taboola_version($min_ver) {
655 + // Get the currently loaded plugin version
656 + // $plugin_version = $this->get_loaded_plugin_version();
657 +
658 + tb_write_log("SAVING NEW MIN VERSION: " . $min_ver); // PC
659 +
660 + // Check the saved version in wp_options. Default to '' if the option is not found.
661 + $saved_version = get_option(TABOOLA_OPTION_NAME, '');
662 + if ($saved_version == '') {
663 + add_option(TABOOLA_OPTION_NAME, $min_ver);
664 + }
665 + else {
666 + update_option(TABOOLA_OPTION_NAME, $min_ver);
667 + }
668 + }
669 +
670 + function update_db(){
671 +
672 + // If we are up to date, then skip this method...
673 + if ($this->is_db_updated_for_min_ver(TABOOLA_MIN_VER)) {
674 + //tb_write_log("All up to date!");
675 + return;
676 + }
677 +
678 + $this->save_taboola_version(TABOOLA_MIN_VER);
679 +
680 + global $wpdb;
334 681 require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
682 +
335 683
336 - $settings_table = $this->tbl_taboola_settings;
337 -
338 684 //check mysql version
339 685 if (function_exists('mysql_get_server_info') && version_compare(mysql_get_server_info(), '4.1.0', '>=')) {
340 686 if (!empty($wpdb->charset))
341 687 $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
@@ -342,8 +688,14 @@
342 688 if (!empty($wpdb->collate))
343 689 $charset_collate .= " COLLATE $wpdb->collate";
344 690 }
345 691
692 + // Check if this is an upgrade from v1
693 + $is_upgrade_from_v1 = $this->is_upgrade_from_v1();
694 +
695 + // tb_write_log("Is upgrade from v1: " . ($is_upgrade_from_v1 ? 'true' : 'false'));
696 +
697 +
346 698 //settings table structure
347 699 $sql_table_settings = "
348 700 CREATE TABLE `" . $wpdb->prefix . "_taboola_settings` (
349 701 `id` INT NOT NULL AUTO_INCREMENT ,
@@ -349,16 +701,30 @@
349 701 `id` INT NOT NULL AUTO_INCREMENT ,
350 702 `publisher_id` VARCHAR(255) DEFAULT NULL,
351 703 `first_bc_enabled` TINYINT(1) NOT NULL DEFAULT FALSE,
352 704 `first_bc_widget_id` VARCHAR(255) DEFAULT NULL,
705 + `first_bc_placement` VARCHAR(255) DEFAULT " . ($is_upgrade_from_v1 ? "'below-article'" : "NULL") .",
353 706 `first_bc_custom_css` TEXT DEFAULT NULL,
354 707 `second_bc_enabled` TINYINT(1) NOT NULL DEFAULT FALSE,
355 708 `second_bc_widget_id` VARCHAR(255) DEFAULT NULL,
356 709 `second_bc_custom_css` TEXT DEFAULT NULL,
357 710 `location_string` TEXT DEFAULT NULL,
711 + `mid_enabled` TINYINT(1) NOT NULL DEFAULT FALSE,
712 + `mid_widget_id` VARCHAR(255) DEFAULT NULL,
713 + `mid_placement` VARCHAR(255) DEFAULT NULL,
358 714 `out_of_content_enabled` TINYINT(1) NOT NULL DEFAULT TRUE,
715 + `mid_location_string` TEXT DEFAULT NULL,
716 + `mid_location_string_occurrence` SMALLINT DEFAULT NULL,
717 + `mid_paragraph_ui_mode` VARCHAR(255) DEFAULT NULL,
718 + `home_enabled` TINYINT(1) NOT NULL DEFAULT FALSE,
719 + `home_widget_id` VARCHAR(255) DEFAULT NULL,
720 + `home_placement` VARCHAR(255) DEFAULT NULL,
721 + `home_location_string` TEXT DEFAULT NULL,
722 + `home_location_string_occurrence` SMALLINT DEFAULT NULL,
359 723 PRIMARY KEY (`id`)
360 724 )" . $charset_collate . ";";
725 +
726 + // tb_write_log($sql_table_settings);
361 727
362 728 // create/update the table
363 729 dbDelta($sql_table_settings);
364 730 }
@@ -366,6 +732,52 @@
366 732 }
367 733
368 734 global $taboolaWP;
369 735 $taboolaWP = new TaboolaWP();
736 +
737 +/*
738 +A few utility methods for logging
739 +*/
740 +
741 +// Writes debugging messages to 'logs/debug.log'.
742 +// The exact file location depends on *where* you trigger the function.
743 +// In this script, we trigger the function from the admin dashboard.
744 +// So the log file is located under 'wp-admin/logs'.
745 +function tb_write_log($log_msg)
746 +{
747 + $log_filename = "logs";
748 + if (!file_exists($log_filename))
749 + {
750 + mkdir($log_filename, 0777, true);
751 + }
752 + $log_file_data = $log_filename.'/debug.log';
753 +
754 + // Add date/time
755 + $date = date('Y-m-d H:i:s');
756 + $log_msg_with_date = $date." : ".$log_msg;
757 +
758 + if (TABOOLA_DEBUG_MODE)
759 + file_put_contents($log_file_data, $log_msg_with_date . "\n", FILE_APPEND);
760 +
761 +}
762 +
763 +// Write to console
764 +function tb_console_log( $data ){
765 +
766 + If(wp_get_environment_type() === 'development') {
767 +
768 + echo '<script>';
769 + echo 'console.log('. json_encode( $data ) .')';
770 + echo '</script>';
771 +
772 + }
773 +}
774 +
775 +// Write to webpage and stop
776 +function tb_print_to_page($data) {
777 + If(wp_get_environment_type() === 'development') {
778 + print_r($data);
779 + die;
780 + }
781 +}
370 782
371 783 //