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 +649 -56 1.02.0.1 View file →
@@ -1,28 +1,48 @@
1 1 <?php
2 2 /**
3 3 * Plugin Name: Taboola
4 - * Plugin URI: http://taboola.com
4 + * Plugin URI: https://developers.taboola.com/web-integrations/discuss
5 5 * Description: Taboola
6 - * Version: 1.0
6 + * Version: 2.0.1
7 7 * Author: Taboola
8 8 */
9 9
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","{");
19 +define ("TABOOLA_CONTENT_FORMAT_STRING",'string');
20 +define ("TABOOLA_CONTENT_FORMAT_SCRIPT",'script');
21 +define ("TABOOLA_CONTENT_FORMAT_HTML",'html');
22 +
23 +
10 24 include_once('widget.php');
25 +require_once('JavaScriptWrapper.php');
11 26
12 27 if (!class_exists('TaboolaWP')) {
13 28 class TaboolaWP
14 29 {
15 -
16 30 //save internal data
17 31 public $data = array();
32 + public $_is_widget_on_page;
33 + public $_is_head_script_loaded = false;
18 34
19 - function TaboolaWP()
35 + function __construct()
20 36 {
21 37 global $wpdb;
38 +
22 39 //initialize plugin constant
23 40 DEFINE('TaboolaWP', true);
24 41
42 + $this->_is_widget_on_page = false;
43 + $this->_is_head_script_loaded = false;
44 +
25 45 $this->plugin_name = plugin_basename(__FILE__);
26 46 $this->plugin_directory = plugin_dir_path(__FILE__);
27 47 $this->plugin_url = trailingslashit(WP_PLUGIN_URL . '/' . dirname(plugin_basename(__FILE__)));
28 48 $this->settings = $wpdb->get_row("select * from ".$wpdb->prefix."_taboola_settings limit 1");
@@ -29,31 +49,36 @@
29 49
30 50 $this->tbl_taboola_settings = $wpdb->prefix . '_taboola_settings';
31 51
32 52 //activation function
33 - 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'));
34 55
35 -
36 - // disable sidebar widget
37 - /*if($this->settings != NULL && !empty($this->settings->publisher_id)){
56 + // Enable sidebar widgets
57 + if ($this->settings != NULL && !empty($this->settings->publisher_id)){
38 58 //register Taboola widget
39 59 add_action('widgets_init',
40 - create_function('', 'return register_widget("WP_Widget_Taboola");')
60 + function(){
61 + return register_widget("WP_Widget_Taboola");
62 + }
41 63 );
42 - }*/
64 + }
43 65
66 + //$this->should_place_tag_outside_of_content = $this->settings->out_of_content_enabled;
67 +
44 68 if (is_admin()) {
45 69 //add menu for plugin
46 70 add_action( 'admin_menu', array(&$this, 'admin_generate_menu') );
47 71 add_filter('plugin_action_links', array(&$this, 'plugin_action_links'), 10, 2 );
48 - } else {
49 - if($this->settings != NULL){
50 - add_action('wp_head', array(&$this, 'taboola_header_loader_js'));
72 + }else if ($this->settings != NULL){
73 + add_action('wp_head', array(&$this, 'taboola_header_loader_inject'));
51 74 add_action('wp_footer', array(&$this, 'taboola_footer_loader_js'));
52 75 add_filter('the_content', array(&$this, 'load_taboola_content'));
53 - }
76 + add_filter('the_content', array(&$this, 'load_taboola_content_mid'));
77 + add_filter('the_content', array(&$this, 'load_taboola_content_home'));
54 78 }
55 - }
79 + }
80 +
56 81 function plugin_action_links($links, $file) {
57 82 static $this_plugin;
58 83
59 84 if (!$this_plugin) {
@@ -66,47 +91,350 @@
66 91 }
67 92
68 93 return $links;
69 94 }
95 +
96 + private function should_show_content_widget(){
97 + $retVal = ((trim($this->settings->publisher_id) != '') && is_single() && $this->settings->first_bc_enabled && trim($this->settings->first_bc_widget_id) != '');
98 + return $retVal;
99 + }
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 +
117 + private function should_show_sidebar_widget(){
118 + $retVal = ((trim($this->settings->publisher_id) != '') && is_active_widget( false, false, TABOOLA_WIDGET_BASE_ID, true ));
119 + return $retVal;
120 + }
121 +
122 + // Determine if a taboola widget should be added somewhere on the current page (content or sidebar)
123 + function is_widget_on_page(){
124 + return $this->should_show_content_widget() || $this->should_show_content_widget_mid() || $this->should_show_content_widget_home() || $this->should_show_sidebar_widget();
125 + }
126 +
127 + function get_page_type(){
128 + $page_type='article';
129 + if (is_front_page()){
130 + $page_type='home';
131 + }else if (is_category() || is_archive() || is_search()){
132 + $page_type='category';
133 + }
134 + return $page_type;
135 + }
136 +
137 + // return the head loader script
70 138 function taboola_header_loader_js() {
71 - $script1_content = str_replace('{{PUBLISHER_ID}}', $this->settings->publisher_id, file_get_contents($this->plugin_directory.'js/script1.js'));
72 - echo '<script type="text/javascript">'.$script1_content.'</script>';
139 + $head_string = "";
140 +
141 + // Only adding the loader if a widget is going to be placed on the page.
142 + if ($this->is_widget_on_page()){
143 +
144 + $stringParams = array(
145 + '{{PUBLISHER_ID}}' => $this->settings->publisher_id,
146 + '{{PAGE_TYPE}}' => $this->get_page_type(),
147 + '{{WORDPRESS_VERSION}}' => get_bloginfo('version'),
148 + '{{PHP_VERSION}}' => phpversion(),
149 + '{{PLUGIN_VERSION}}' => TABOOLA_PLUGIN_VERSION,
150 + '{{LOC_MID}}' => $this->settings->mid_location_string,
151 + '{{LOC_HOME}}' => $this->settings->home_location_string
152 + );
153 +
154 + $scriptWrapper = new JavaScriptWrapper("loaderInjectionScript.js",$stringParams);
155 + $head_string = $scriptWrapper->getScriptMarkupString();
156 + }
157 +
158 + return $head_string;
73 159 }
160 +
161 +
162 + // This function is used for the hook action, injects the header content to the <head> tag.
163 + function taboola_header_loader_inject(){
164 + echo $this->taboola_header_loader_js();
165 + }
166 +
167 +
74 168 function taboola_footer_loader_js() {
75 - $script3_content = file_get_contents($this->plugin_directory.'js/script3.js');
76 - echo '<script type="text/javascript">'.$script3_content.'</script>';
169 +
170 + // Only adding flush script if a widget is going to be placed on the page.
171 + if ( $this->is_widget_on_page() ){
172 + $flushInjectionScript = new JavaScriptWrapper('flushInjectionScript.js',array());
173 + echo $flushInjectionScript->getScriptMarkupString();
174 + }
77 175 }
78 176
177 + // Below-article widget
79 178 function load_taboola_content($content)
80 179 {
81 - if (trim($this->settings->publisher_id) == ''){
82 - return $content;
180 + $taboola_content = array();
181 + if ($this->should_show_content_widget()){
182 +
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 + );
189 +
190 + $firstWidgetScript = new JavaScriptWrapper("widgetInjectionScript.js",$firstWidgetParams);
191 + $taboola_content[TABOOLA_CONTENT_FORMAT_HTML][] = "<div id='taboola-below-article-thumbnails'></div>";
192 + $taboola_content[TABOOLA_CONTENT_FORMAT_SCRIPT][] = $firstWidgetScript;
193 +
194 + $content = $this->embed_taboola_content_location($content,$taboola_content);
83 195 }
84 - if (is_single()) {
85 196
86 - if($this->settings->first_bc_enabled && trim($this->settings->first_bc_widget_id) != ''){
87 - $script2_content = str_replace('{{WIDGET_ID}}', $this->settings->first_bc_widget_id, file_get_contents($this->plugin_directory.'js/script2.js'));
88 - $script2_content = str_replace('{{CONTAINER}}', 'taboola-below-article', $script2_content);
89 - $script2_content = str_replace('{{PLACEMENT}}', 'below-article', $script2_content);
197 + return $content;
198 + }
90 199
91 - $content = $content .
92 - '<div id="taboola-below-article" style="'.$this->settings->first_bc_custom_css.'"></div>' .
93 - '<script type="text/javascript">'.$script2_content.'</script>';
94 - if($this->settings->second_bc_enabled && trim($this->settings->second_bc_widget_id) != ''){
95 - $script2_content = str_replace('{{WIDGET_ID}}', $this->settings->second_bc_widget_id, file_get_contents($this->plugin_directory.'js/script2.js'));
96 - $script2_content = str_replace('{{CONTAINER}}', 'taboola-below-article-second', $script2_content);
97 - $script2_content = str_replace('{{PLACEMENT}}', 'below-article-2nd', $script2_content);
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()){
98 205
99 - $content = $content .
100 - '<div id="taboola-below-article-second" style="'.$this->settings->second_bc_custom_css.'"></div>' .
101 - '<script type="text/javascript">'.$script2_content.'</script>';
206 + $secondWidgetParams = array('{{WIDGET_ID}}' => $this->settings->mid_widget_id,
207 + '{{CONTAINER}}' => 'taboola-mid-article-thumbnails',
208 + '{{PLACEMENT}}' => $this->settings->mid_placement);
209 +
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;
213 +
214 + $content = $this->embed_taboola_content_location_mid($content,$taboola_content_mid,trim($this->settings->mid_location_string));
215 + }
216 +
217 + return $content;
218 + }
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 + }
237 + return $content;
238 +
239 + }
240 +
241 + // Below-article widget
242 +
243 + // Extract the taboola content in the required format:
244 + // String - for injecting on the servr side
245 + // Script or HTML - for injecting on the client side
246 + function format_taboola_content($taboola_content,$format){
247 + $ret_val = null;
248 +
249 + switch($format){
250 + case TABOOLA_CONTENT_FORMAT_STRING:
251 + $result_string = join("",$taboola_content[TABOOLA_CONTENT_FORMAT_HTML]).
252 + "<script type='text/javascript'>".join("\n",$taboola_content[TABOOLA_CONTENT_FORMAT_SCRIPT])."</script>";
253 + $ret_val = $result_string;
254 + break;
255 +
256 + // script or html
257 + default:
258 + $ret_val = str_replace("\n","",join("",$taboola_content[$format]));
259 + break;
260 + }
261 +
262 + return $ret_val;
263 + }
264 +
265 +
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){
312 + $do_default = true;
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 +
339 + if (isset($location) && $location != ''){
340 + $first_char = substr($location,0,1);
341 +
342 + // DIV/XPATH provided for JS handling
343 + if ($first_char == TABOOLA_JS_MARKER){
344 + $full_indicator = substr($location,0,strlen(TABOOLA_JS_INDICATOR));
345 +
346 + if ($full_indicator == TABOOLA_JS_INDICATOR){
347 +
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 + );
353 + $scriptWrapper->appendScript("injectWidgetByXpath('".$xpath."');");
354 + $content = $content."<span id='tbdefault'></span><script type='text/javascript'>".$scriptWrapper."</script>";
355 +
356 + $do_default = false;
102 357 }
358 +
359 + // server side selector provided (see simple_html_dom selectors http://simplehtmldom.sourceforge.net/manual.htm)
360 + // basically it's CSS selectors like in jQuery
361 + } else{
362 + require_once('simple_html_dom.php');
363 +
364 + $html_doc = str_get_html($content);
365 + $target_location = $html_doc->find($location,($this->settings->mid_location_string_occurrence)-1);
366 +
367 + // if the location was found within the html content
368 + if (isset($target_location) && is_object($target_location)){
369 +
370 + // adding taboola content AFTER the target location
371 + $target_location->outertext = $target_location->outertext.$this->format_taboola_content_mid($taboola_content_mid,TABOOLA_CONTENT_FORMAT_STRING);
372 + $content = $html_doc;
373 + $do_default = false;
374 + }
103 375 }
104 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 + // }
105 381
106 382 return $content;
107 383 }
108 384
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){
388 +
389 + $do_default = true;
390 +
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 +
435 + }
436 +
109 437 function admin_generate_menu(){
110 438 global $current_user;
111 439 add_menu_page('Taboola', 'Taboola', 'manage_options', 'taboola_widget', array(&$this, 'admin_taboola_settings'), $this->plugin_url.'img/taboola_icon.png', 110);
112 440 }
@@ -117,26 +445,103 @@
117 445 $taboola_errors = array();
118 446 if($_SERVER['REQUEST_METHOD'] == 'POST'){
119 447
120 448 if(trim($_POST['publisher_id']) == ''){
121 - $taboola_errors[] = "Please add a 'Publisher ID' in order to apply changes to your widgets";
449 + $taboola_errors[] = "Publisher ID";
122 450 }
123 - if(($_POST['first_bc_enabled'] == 'on' && trim($_POST['first_bc_widget_id']) == '') ||
124 - ($_POST['second_bc_enabled'] == 'on' && trim($_POST['second_bc_widget_id']) == '')
125 - ){
126 - $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 + }
127 459 }
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 +
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 +
128 517 if(count($taboola_errors) == 0){
129 518
130 519 $data = array(
131 520 "publisher_id" => trim($_POST['publisher_id']),
132 - "first_bc_enabled" => $_POST['first_bc_enabled'] == 'on' ? true : false,
133 - "first_bc_widget_id" => trim($_POST['first_bc_widget_id']),
134 - "first_bc_custom_css" => trim($_POST['first_bc_custom_css']),
135 - "second_bc_enabled" => $_POST['second_bc_enabled'] == 'on' ? true : false,
136 - "second_bc_widget_id" => trim($_POST['second_bc_widget_id']),
137 - "second_bc_custom_css" => trim($_POST['second_bc_custom_css'])
521 +
522 + "first_bc_enabled" => isset($_POST['first_bc_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']) : ''
138 542 );
543 +
139 544 //var_dump($settings);
140 545 if($settings == NULL){
141 546 $wpdb->insert($this->tbl_taboola_settings, $data, null, null);
142 547 } else {
@@ -145,20 +550,140 @@
145 550 }
146 551 $settings = $wpdb->get_row("select * from ".$wpdb->prefix."_taboola_settings limit 1");
147 552 }
148 553
554 + include_once('settings.php');
555 + }
149 556
150 - include_once('settings.php');
557 + function is_mid_location_string_valid($mid_location_string){
558 + // TODO:: validate the location string
559 + return true;
151 560 }
152 - function activate(){
561 +
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){
571 + // TODO:: validate the location string
572 + return true;
573 + }
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) {
153 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);
154 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;
155 681 require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
682 +
156 683
157 - $settings_table = $this->tbl_taboola_settings;
158 -
159 684 //check mysql version
160 - if (version_compare(mysql_get_server_info(), '4.1.0', '>=')) {
685 + if (function_exists('mysql_get_server_info') && version_compare(mysql_get_server_info(), '4.1.0', '>=')) {
161 686 if (!empty($wpdb->charset))
162 687 $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
163 688 if (!empty($wpdb->collate))
164 689 $charset_collate .= " COLLATE $wpdb->collate";
@@ -163,8 +688,14 @@
163 688 if (!empty($wpdb->collate))
164 689 $charset_collate .= " COLLATE $wpdb->collate";
165 690 }
166 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 +
167 698 //settings table structure
168 699 $sql_table_settings = "
169 700 CREATE TABLE `" . $wpdb->prefix . "_taboola_settings` (
170 701 `id` INT NOT NULL AUTO_INCREMENT ,
@@ -170,21 +701,83 @@
170 701 `id` INT NOT NULL AUTO_INCREMENT ,
171 702 `publisher_id` VARCHAR(255) DEFAULT NULL,
172 703 `first_bc_enabled` TINYINT(1) NOT NULL DEFAULT FALSE,
173 704 `first_bc_widget_id` VARCHAR(255) DEFAULT NULL,
705 + `first_bc_placement` VARCHAR(255) DEFAULT " . ($is_upgrade_from_v1 ? "'below-article'" : "NULL") .",
174 706 `first_bc_custom_css` TEXT DEFAULT NULL,
175 707 `second_bc_enabled` TINYINT(1) NOT NULL DEFAULT FALSE,
176 708 `second_bc_widget_id` VARCHAR(255) DEFAULT NULL,
177 709 `second_bc_custom_css` TEXT DEFAULT NULL,
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,
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,
178 723 PRIMARY KEY (`id`)
179 724 )" . $charset_collate . ";";
725 +
726 + // tb_write_log($sql_table_settings);
180 727
181 - //check if table exists
182 - if ($wpdb->get_var("show tables like '" . $settings_table . "'") != $settings_table) {
728 + // create/update the table
183 729 dbDelta($sql_table_settings);
184 - }
185 730 }
186 731 }
187 732 }
188 733
189 734 global $taboolaWP;
190 -$taboolaWP = new TaboolaWP();
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 +}
782 +
783 +//