Changeset 1282202
- Timestamp:
- 11/09/2015 01:01:23 AM (10 years ago)
- Location:
- chronosly-events-calendar
- Files:
-
- 2 edited
-
tags/2.2.5/classes/chronosly_shortcode.php (modified) (2 diffs)
-
trunk/classes/chronosly_shortcode.php (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
chronosly-events-calendar/tags/2.2.5/classes/chronosly_shortcode.php
r1277154 r1282202 1 1 <?php 2 if(!class_exists('Chronosly_ Shortcode'))2 if(!class_exists('Chronosly_Extend')) 3 3 { 4 class Chronosly_Shortcode 5 { 6 7 8 public function __construct() 4 5 6 class Chronosly_Extend 7 { 8 /** 9 * Construct the plugin object 10 */ 11 12 13 public function __construct() 14 { 15 16 17 // register actions 18 19 add_action('init', array(&$this, 'admin_init'), 11); 20 21 add_action("chronosly_update_addons", array(&$this, 'update_addons'), 100, 1); 22 add_action("chronosly_update_templates",array(&$this, 'update_templates'), 100, 1); 23 24 25 add_action( 'widgets_init', array(&$this, 'register_widgets' )); 26 27 // add_action('admin_menu', array(&$this, 'extra_init')); 28 // add_action( 'admin_enqueue_scripts', array(&$this,'extra_init') ); 29 30 31 } // END public function __construct 32 33 34 public function get_addons_feed(){ 35 36 $addons = json_decode( 37 '{ 38 "import_and_export":{ 39 "id":"import_and_export", 40 "version":"2.0", 41 "name":"Import and Export", 42 "desc":"Import / Export your content (events, organizers, places and calendars) to iCal, .csv file (Excel or Numbers), Facebook or Google+" , 43 "img":"http://plugins.heimsveld.com/thumbnail-import-export-addon-230px.png", 44 "price":27, 45 "author":"Chronosly", 46 "author_url":"http://www.chronosly.com", 47 "view":"https://www.chronosly.com/faq/addons/import-export-events-organizers-places/?utm_source=clients&utm_medium=referral&utm_campaign=Addons2Import_ExportAddon_FAQ", 48 "url":"https://www.chronosly.com/product/import-export/?utm_source=clients&utm_medium=referral&utm_campaign=Addons2Import_Export", 49 "featured":0, 50 "updated":1414467200, 51 "dw":10, 52 "rate":10 53 }, 54 "filter_and_sort":{ 55 "id":"filter_and_sort", 56 "version":"2.0", 57 "name":"Filter and Sort", 58 "desc":"Allow you to show your content based on given set of criteria" , 59 "img":"http://plugins.heimsveld.com/thumbnail-filters-sorting-addon-230px.png", 60 "price":21,"author":"Chronosly", 61 "author_url":"http://www.chronosly.com", 62 "view":"https://www.chronosly.com/faq/addons/filter-sort-addon/?utm_source=clients&utm_medium=referral&utm_campaign=Addons2FilterSort_FAQ", 63 "url":"https://www.chronosly.com/product/filter-sort-addon/?utm_source=clients&utm_medium=referral&utm_campaign=Addons2FilterSort", 64 "featured":0, 65 "updated":1414467200, 66 "dw":10, 67 "rate":10 68 }, 69 "social_media_share":{ 70 "id":"social_media_share", 71 "version":"1.9", 72 "name":"Social Media Share", 73 "desc":"Add social media buttons to your events for sharing, going viral or bigger potential audience" , 74 "img":"http://plugins.heimsveld.com/thumbnail-social-media-230px.png", 75 "price":14, 76 "author":"Chronosly", 77 "author_url":"http://www.chronosly.com", 78 "view":"https://www.chronosly.com/faq/addons/social-media-share-addon/?utm_source=clients&utm_medium=referral&utm_campaign=Addons2SMMShare_FAQ", 79 "url":"https://www.chronosly.com/product/social-media-addon/?utm_source=clients&utm_medium=referral&utm_campaign=Addons2SMMShare", 80 "featured":0, 81 "updated":1412467200, 82 "dw":1, 83 "rate":8 84 }, 85 "frontend_event_submission":{ 86 "id":"frontend_event_submission", 87 "version":"1.8", 88 "name":"Frontend Event Submission", 89 "desc":"Frontend event submission addon allow users to send events for admin approval" , 90 "img":"http://plugins.heimsveld.com/thumbnail-frontend-event-submission-230px.png", 91 "price":29, 92 "author":"Chronosly", 93 "author_url":"http://www.chronosly.com", 94 "view":"https://www.chronosly.com/faq/addons/new-frontend-event-submission-addon/?utm_source=clients&utm_medium=referral&utm_campaign=Addons2EventSubmit_FAQ", 95 "url":"https://www.chronosly.com/product/frontend-event-submission-addon/?utm_source=clients&utm_medium=referral&utm_campaign=Addons2EventSubmit", 96 "featured":0, 97 "updated":1412467200, 98 "dw":1, 99 "rate":8 100 }, 101 "tickets_and_repeats_extended":{ 102 "id":"tickets_and_repeats_extended", 103 "version":"1.4", 104 "name":"Tickets and Repeat Enhancement ", 105 "desc":"Enhance ADVANCED recurring and ticketing event features" , 106 "img":"http://plugins.heimsveld.com/thumbnail-recurring-events-enahancement-230px.png", 107 "price":20, 108 "author":"Chronosly", 109 "author_url":"http://www.chronosly.com", 110 "view":"https://www.chronosly.com/faq/addons/upcoming-recurring-events-ticketing/?utm_source=clients&utm_medium=referral&utm_campaign=Addons2Recurring_FAQ", 111 "url":"https://www.chronosly.com/product/recurring-ticketing-enhancement-for-events-addon/?utm_source=clients&utm_medium=referral&utm_campaign=Addons2Recurring", 112 "featured":0, 113 "updated":1412467200, 114 "dw":1, 115 "rate":9 116 }, 117 "map_navigation":{ 118 "id":"map_navigation", 119 "version":"1.0", 120 "name":"Map my events", 121 "desc":"Display ALL your events (map pins) on a full-size Google map" , 122 "img":"https://www.chronosly.com/wp-content/uploads/2015/09/full-event-map-addon-DEF.png", 123 "price":19, 124 "author":"Chronosly", 125 "author_url":"http://www.chronosly.com", 126 "view":"https://www.chronosly.com/faq/addons/map-my-events/?utm_source=clients&utm_medium=referral&utm_campaign=Addons2Map_FAQ", 127 "url":"https://www.chronosly.com/product/map-my-events/?utm_source=clients&utm_medium=referral&utm_campaign=Addons2Map", 128 "featured":0, 129 "updated":1412467200, 130 "dw":1, 131 "rate":9 132 } 133 }'); 134 set_transient( "addons_marketplace", $addons, 60 * 60 * 24 ); 135 foreach($addons as $k=>$ad){ 136 if($settings = unserialize(get_option("chronosly_settings_{$k}"))) { 137 $settings["needed_version"] = $ad->version; 138 update_option("chronosly_settings_{$k}", serialize($settings)); 139 } 140 } 141 142 return $addons; 143 144 } 145 146 public function get_templates_feed(){ 147 148 $templates= json_decode( 149 '{ 150 "default":{"id":"default","version":"1.0","name":"Default","desc":"Default Template","img":"http://plugins.heimsveld.com/thumbnail-default-300px.jpg","price":0,"author":"Chronosly","author_url":"http://www.chronosly.com","view":"http://www.chronosly.com","url":"http://www.chronosly.com","featured":0,"updated":1412467200,"dw":1,"rate":8}, 151 "dark":{"id":"dark","version":"2.0","name":"Dark","desc":"This is the dark design version of Chronosly Default template, specially designed to match with darker theme sites.","img":"http://plugins.heimsveld.com/thumbnail-dark-300px.jpg","price":12,"author":"Chronosly","author_url":"http://www.chronosly.com", "view":"http://dark.chronosly.com/events/?utm_source=chronosly.com&utm_medium=referral&utm_campaign=Templates2DarkLiveDemo", "url":"https://www.chronosly.com/product/dark-template-addon/?utm_source=clients&utm_medium=referral&utm_campaign=Templates2Darkprofile","featured":0,"updated":1409356800,"dw":0,"rate":8}, 152 "grid":{"id":"grid","version":"2.0","name":"Grid","desc":"Responsive theme with 3 Column Grid based homepage layout.","img":"http://plugins.heimsveld.com/thumbnail-grid-300px.jpg","price":17,"author":"Chronosly","author_url":"http://www.chronosly.com", "view":"http://grid.chronosly.com/events/?utm_source=chronosly.com&utm_medium=referral&utm_campaign=Templates2GridLiveDemo", "url":"https://www.chronosly.com/product/grid-template/?utm_source=clients&utm_medium=referral&utm_campaign=Templates2Gridprofile","featured":0,"updated":1409356800,"dw":0,"rate":8}, 153 "tickets":{"id":"tickets","version":"1.4","name":"Ticketing","desc":"Modern and clean design, effective and convincing way to sell your tickets","img":"http://plugins.heimsveld.com/thumbnail-ticketing-300px.jpg","price":15,"author":"Chronosly","author_url":"http://www.chronosly.com", "view":"http://ticketing.chronosly.com/events/?utm_source=chronosly.com&utm_medium=referral&utm_campaign=Templates2TicketingLiveDemo", "url":"https://www.chronosly.com/product/ticketing-template/?utm_source=clients&utm_medium=referral&utm_campaign=Templates2Ticketingprofile","featured":0,"updated":1409356800,"dw":0,"rate":8} 154 155 }'); 156 set_transient( "templates_marketplace", $templates, 60 * 60 * 24 ); 157 return $templates; 158 159 } 160 161 public function register_widgets() { 162 register_widget( 'Chronosly_Widget' ); 163 } 164 165 166 public function update_addons($addon=""){ 167 168 //si se llama desde el admin ejecutar un reload par que lo cargue bien en la pantalla 169 // 170 171 } 172 173 public function update_templates($template=""){ 174 175 176 } 177 178 public function plugin_updated(){ 179 $file = CHRONOSLY_ADDONS_PATH.DIRECTORY_SEPARATOR."version.json"; 180 if ($f = @fopen($file, "r")) { 181 $version =@fread($f, filesize($file)); 182 if($version != CHRONOSLY_VERSION) { 183 if($f1 = @fopen($file, "w+")){ 184 fwrite($f1, CHRONOSLY_VERSION); 185 @fclose($f1); 186 return true; 187 } else return false; 188 } 189 @fclose($f); 190 return false; 191 192 193 } else { 194 if($f = @fopen($file, "w+")){ 195 fwrite($f, CHRONOSLY_VERSION); 196 @fclose($f); 197 return true; 198 } else return false; 199 } 200 } 201 202 public function copy_default_template(){ 203 $utils = new Chronosly_Utils(); 204 $files = scandir (CHRONOSLY_PATH.DIRECTORY_SEPARATOR."custom-templates"); 205 foreach ( $files as $file ) { 206 if ($file != "." && $file != ".."){ 207 $utils->rcopy( CHRONOSLY_PATH.DIRECTORY_SEPARATOR."custom-templates/$file", CHRONOSLY_TEMPLATES_PATH.DIRECTORY_SEPARATOR."$file" ); 208 } 209 } 210 211 } 212 213 public function rebuild_addons_files(){ 214 $utils = new Chronosly_Utils(); 215 if(is_dir(CHRONOSLY_ADDONS_PATH.DIRECTORY_SEPARATOR."organizers_and_places")){ 216 $files = scandir ( CHRONOSLY_ADDONS_PATH.DIRECTORY_SEPARATOR."organizers_and_places"); 217 foreach ( $files as $file ) { 218 if ($file != "." && $file != ".."){ 219 $utils->rcopy ( CHRONOSLY_ADDONS_PATH.DIRECTORY_SEPARATOR."organizers_and_places/$file", CHRONOSLY_PATH."/$file" ); 220 } 221 } 222 // $utils->rrmdir( $destination_path.DIRECTORY_SEPARATOR."organizers_and_places"); 223 $settings = unserialize(get_option("chronosly-settings")); 224 $settings["chronosly_organizers_addon"] = 1; 225 $settings["chronosly_places_addon"] = 1; 226 update_option('chronosly-settings', serialize($settings)); 227 } 228 if(is_dir(CHRONOSLY_ADDONS_PATH.DIRECTORY_SEPARATOR."extended_marketplace")) { 229 $files = scandir ( CHRONOSLY_ADDONS_PATH.DIRECTORY_SEPARATOR."extended_marketplace"); 230 foreach ( $files as $file ) { 231 if ($file != "." && $file != ".."){ 232 $utils->rcopy ( CHRONOSLY_ADDONS_PATH.DIRECTORY_SEPARATOR."extended_marketplace/$file", CHRONOSLY_PATH."/$file" ); 233 } 234 } 235 } 236 237 } 238 239 240 //Cuando un template se actualiza se pierden los añadidos de los addons 241 public function rebuild_template_addons($template){ 242 global $Post_Type_Chronosly; 243 $addons = array(); 244 $addons_list = apply_filters("chronosly_addons_settings_item", $addons); 245 if(!count($addons_list)) { 246 Chronosly_Extend::init_addons(); 247 $addons_list = apply_filters("chronosly_addons_settings_item", $addons); 248 } 249 250 if(count($addons_list)){ 251 foreach($addons_list as $k=>$v){ 252 if(has_filter("chronosly_update_template_{$k}")) $Post_Type_Chronosly->template->full_update_templates_by_addon($k,array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), array($template)); 253 254 } 255 } 256 } 257 258 259 public function get_external_content($url, $format=""){ 260 $response = wp_remote_post($url, array("timeout" => 60)); 261 $cont = array(); 262 if ( is_wp_error( $response ) ) { 263 $error_message = $response->get_error_message(); 264 $cont["error"] = 1 ; 265 $cont["message"] = "Something went wrong: $error_message"; 266 } else { 267 if($response["response"]["code"] != 200){ 268 $cont["error"] = 1 ; 269 $cont["message"] = $response["response"]["message"].": ".$response["body"]; 270 } 271 else { 272 $cont["error"] = 0 ; 273 switch($format){ 274 case "json": 275 $cont["content"] = json_decode($response["body"]); 276 break; 277 default: 278 $cont["content"] = $response["body"]; 279 break; 280 } 281 } 282 } 283 //print_r($response); 284 // print_r($cont); 285 return $cont; 286 } 287 288 //update code via donwloadding zip 289 public function update_code($type, $url, $addon=""){ 290 global $Chronosly_Settings; 291 switch($type){ 292 case "core": 293 $path = CHRONOSLY_PATH; 294 break; 295 case "addons": 296 $path = CHRONOSLY_ADDONS_PATH; 297 break; 298 case "templates": 299 $path = CHRONOSLY_TEMPLATES_PATH; 300 301 break; 302 } 303 304 $cont = $this->get_external_content($url); 305 // return; 306 //save the zip temporaly 307 if($cont["error"]) return 0; 308 $zip = $cont["content"]; 309 $fp = fopen(CHRONOSLY_PATH.DIRECTORY_SEPARATOR."temp.zip", "w"); 310 fwrite($fp, $zip); 311 fclose($fp); 312 require_once(ABSPATH .'/wp-admin/includes/file.php'); 313 WP_Filesystem(); 314 if(stripos($addon, "organizers_and_places") !== FALSE or stripos($addon, "extended_marketplace") !== FALSE) $path = CHRONOSLY_PATH; 315 $unzipfile = unzip_file(CHRONOSLY_PATH.DIRECTORY_SEPARATOR."temp.zip", $path); 316 @unlink( CHRONOSLY_PATH.DIRECTORY_SEPARATOR."temp.zip"); 317 $utils = new Chronosly_Utils(); 318 319 if(stripos($addon, "organizers_and_places") !== FALSE and $unzipfile === true) { 320 $files = scandir ( $path.DIRECTORY_SEPARATOR."organizers_and_places"); 321 foreach ( $files as $file ) { 322 if ($file != "." && $file != ".."){ 323 $utils->rcopy( $path.DIRECTORY_SEPARATOR."organizers_and_places/$file", $destination_path.DIRECTORY_SEPARATOR."$file" ); 324 } 325 } 326 } 327 else if(stripos($addon, "extended_marketplace") !== FALSE and $unzipfile === true) { 328 $files = scandir ( $path.DIRECTORY_SEPARATOR."extended_marketplace"); 329 foreach ( $files as $file ) { 330 if ($file != "." && $file != ".."){ 331 $utils->rcopy( $path.DIRECTORY_SEPARATOR."extended_marketplace/$file", $destination_path.DIRECTORY_SEPARATOR."$file" ); 332 } 333 } 334 } 335 336 if ( $unzipfile === true) return 1; 337 return 0; 338 } 339 340 public static function create_dad_field($data){ 341 global $ch_field_create_js_code, $ch_field_modify_js_code, $ch_js_style_fields, $ch_php_style_fields; 342 if(!count($data)) return; //el data tiene que ser un array valido 343 if(!$data["name"] or !$data["type"] or !$data["type"]) return; //aseguramos que tenemos los minimos 344 if($data["el_type"] == "var" and (!$data["php_function"] or !$data["js_function"])) return; 345 else if($data["el_type"] == "style" and (!$data["style_fields"] or !$data["js_style_values"] or !$data["php_style_values"])) return; 346 $return = ""; 347 $return .= Chronosly_Extend::create_field($data); 348 //llamamos a los fields associados a este value 349 350 if(isset($data['fields_associated'])){ 351 foreach($data['fields_associated'] as $field){ 352 if(has_filter("chronosly_field_".$field["name"])){ 353 $default = $field; 354 355 //if(count($fields_array) and isset($fields_array[$field["name"]])) $default = array_merge($default, $fields_array[$field["name"]]); //setting values to fields 356 $return .= apply_filters("chronosly_field_".$field["name"], $default); 357 } 358 } 359 } 360 361 if(isset($data['js_function'])){ 362 //si no la hemos añadido ya antes 363 364 if(stripos($ch_field_create_js_code, $data["name"]."chseparator1") === FALSE){ 365 366 //si existe la funcion llamamos para generar el array de funciones que imprimiremos en el js al crear el elemento o eliminarlo 367 368 if(!is_array($data['js_function'])){ 369 if(function_exists($data['js_function'])){ 370 $ch_field_create_js_code .= $data["name"]."chseparator1".call_user_func($data['js_function'], "create")."chseparator2"; 371 $ch_field_modify_js_code .= $data["name"]."chseparator1".call_user_func($data['js_function'], "modify")."chseparator2"; 372 373 374 } 375 } else { 376 if(class_exists($data['js_function'][0]) and method_exists ($data['js_function'][0], $data['js_function'][1])){ 377 $ch_field_create_js_code .= $data["name"]."chseparator1".call_user_func($data['js_function'], "create")."chseparator2"; 378 $ch_field_modify_js_code .= $data["name"]."chseparator1".call_user_func($data['js_function'], "modify")."chseparator2"; 379 } 380 } 381 382 } 383 384 } 385 //creamos el filter para hacer render en el frontend 386 387 if(isset($data['php_function'])){ 388 if(!has_filter("chronosly_field_render_".$data['name'])){ 389 //echo "chronosly_field_render_".$data["name"]." "; 390 //print_r($data['php_function']);echo "<br/>"; 391 add_filter("chronosly_field_render_".$data["name"], $data['php_function'], 10, 4); 392 } 393 } 394 395 //si es una field de estilos 396 if(isset($data['style_fields']) and isset($data['js_style_values']) and isset($data['php_style_values'])){ 397 $ch_js_style_fields[$data["name"]] = array("fields" => $data['style_fields'], "values" => $data['js_style_values']); 398 $ch_php_style_fields[$data["name"]] = array("fields" => $data['style_fields'], "values" => $data['php_style_values']); 399 } 400 401 return $return; 402 403 } 404 405 406 407 /* recibe un array del formato 408 array( 409 "label" => "Event title", 410 "name" => "title", 411 "type" => "hidden", 412 "fields_associated" => array( 413 array( 414 "name" => "shorten_text", 415 "label" => "Shorten title" 416 ) , 417 array( 418 "name" => "readmore_check", 419 "label" => "Link title" 420 ) , 421 array( 422 "name" => "readmore_action", 423 "label" => "Action when click link" 424 ) , 425 array( 426 "name" => "target_blank" 427 ) , 428 array( 429 "name" => "nofollow" 430 ) 431 ) , 432 "data_field" => "post_title", 433 "data_static function" => array( 434 "Chronosly_Teplates", 435 "get_title_content" 436 ) 437 438 @inside_template para cargar los datos hidden en el template, 439 si es 0 representa un elemento a hacer dad, 440 si es 1 representa un elemento ya cargado en el template con un value 441 */ 442 public static function create_dad_buble($data, $inside_template = 0, $fields_array = array(), $style = array()){ 443 444 global $ch_bubble_create_js_code, $ch_bubble_modify_js_code; 445 if(!count($data)) return; //el data tiene que ser un array valido 446 if($data['name'] != "box" and (!$data["name"] or !$data["box_name"] or !$data["type"])) return; //aseguramos que tenemos los minimos 447 $return = ""; 448 if(!$inside_template and isset($data["box_info"])) $return .= "<li class='draggable info' title='".$data["box_info"]."'> <span class='title'>".__($data["box_name"], "chronosly")."</span>";//añadimos el d&d si es una box 449 else if(!$inside_template) $return .= "<li class='draggable'> <span class='title'>".$data["box_name"]."</span>";//añadimos el d&d si es una box 450 if($data['name'] != "box") { 451 $return .= "<div class='ev-hidden'> 452 <div class='vars'>"; 453 454 if(isset($fields_array["bubble_value"])) $data["value"] = $fields_array["bubble_value"]; 455 $return .= Chronosly_Extend::create_field($data, 1); //creamos el campo 456 457 if($data['js_function']){ 458 //si no la hemos añadido ya antes 459 if(stripos($ch_bubble_create_js_code, $data["name"]."chseparator1") === FALSE){ 460 //si existe la funcion llamamos para generar el array de funciones que imprimiremos en el js al crear el elemento o eliminarlo 461 if(!is_array($data['js_function'])){ 462 if(function_exists($data['js_function'])){ 463 $ch_bubble_create_js_code .= $data["name"]."chseparator1".call_user_func($data['js_function'], "create")."chseparator2"; 464 $ch_bubble_modify_js_code .= $data["name"]."chseparator1".call_user_func($data['js_function'], "modify")."chseparator2"; 465 } 466 } else { 467 if(class_exists($data['js_function'][0]) and method_exists ($data['js_function'][0], $data['js_function'][1])){ 468 $ch_bubble_create_js_code .= $data["name"]."chseparator1".call_user_func($data['js_function'], "create")."chseparator2"; 469 $ch_bubble_modify_js_code .= $data["name"]."chseparator1".call_user_func($data['js_function'], "modify")."chseparator2"; 470 } 471 } 472 } 473 } 474 475 476 477 //llamamos a los fields associados a este value 478 if(isset($data['fields_associated'])){ 479 foreach($data['fields_associated'] as $field){ 480 if(has_filter("chronosly_field_".$field["name"])){ 481 $default = $field; 482 483 if(count($fields_array) and isset($fields_array[$field["name"]])) $default = array_merge($default, $fields_array[$field["name"]]); //setting values to fields 484 $return .= apply_filters("chronosly_field_".$field["name"], $default); 485 } 486 } 487 } 488 $return .= "</div>"; 489 } 490 /* STYLE BOXES */ 491 $styleboxes = Chronosly_Paint::default_style_boxes(); 492 foreach($styleboxes as $id=>$box){ 493 $return .= "<div class='$id'>"; 494 $cont = ""; 495 $cont .= apply_filters("chronosly_style_box_".$id."_fields", $cont, $style);//genramos los inputs de los stylers 496 $return .= $cont; 497 $return .= "</div>"; 498 } 499 if($data['name'] != "box"){ 500 $return .= "</div>"; 501 502 503 if(!$inside_template) $return .= "</li>"; 504 505 //creamos el filter para hacer render en el frontend 506 if($data['php_function']){ 507 if(!has_filter("chronosly_bubble_render_".$data['name'])) add_filter("chronosly_bubble_render_".$data["name"], $data['php_function'], 10, 3); 508 } 509 } 510 return $return; 511 512 } 513 514 private static function create_field($data, $order=0){ 515 $return = ""; 516 $ord = ""; 517 if($order) $ord = ' order="0" '; 518 if(!isset($data['value'])) $data['value'] = ""; 519 switch($data['type']) { 520 521 case "hidden": 522 case "cont_box": 523 $return .= '<input '.$ord.' class="'.$data['name'].'" name="'.$data['name'].'" type="hidden" value="'.$data['value'].'" />'; 524 break; 525 case "input": 526 $return .= "<label>".$data['label'].'</label> <input '.$ord.' class="'.$data['name'].'" name="'.$data['name'].'" type="text" value="'.$data['value'].'" /><br/>'; 527 break; 528 case "time": 529 $return .= "<label>".$data['label'].'</label> <input $ord extra="'.$data["extra"].'" class="'.$data['name'].'" name="'.$data['name'].'" type="text" value="'.$data['value'].'" /><br/>'; 530 break; 531 case "checkbox": 532 $checked =""; 533 if($data['value']) $checked = 'checked="checked"'; 534 $return .= "<label>".$data['label'].'</label> <input '.$ord.' class="'.$data['name'].'" name="'.$data['name'].'" type="checkbox" value="1" '.$checked.' /><br/>'; 535 break; 536 case "textarea": 537 $return .= "<label class='full'>".$data['label'].'</label><br/><textarea '.$ord.' name="'.$data['name'].'" class="textarea2 '.$data['name'].'" rows="4" cols="50" >'.$data['value'].'</textarea><br/>'; 538 break; 539 case "wyswyg": 540 $return .= "<label class='full'>".$data['label'].':</label> <textarea '.$ord.' name="'.$data['name'].'" class="textarea '.$data['name'].'" rows="4" cols="50" >'.$data['value'].'</textarea><br/>'; 541 542 break; 543 case "image": 544 $return .= "<label>".$data['label'].'</label><br/> <input '.$ord.' class="upload_image" type="text" size="36" name="'.$data['name'].'" value="'.$data['value'].'" /> 545 <input class="upload_image_button" type="button" value="'.__('Upload Image', 'chronosly').'" /><br/>'; 546 547 break; 548 case "gallery": 549 $return .= "<label>".$data['label'].'</label><br/> <input '.$ord.' class="upload_gallery" type="text" size="36" name="'.$data['name'].'" value="'.$data['value'].'" /><input class="upload_gallery_button" type="button" value="'.__("Update Gallery", "chronosly").'" /><br/>'; 550 551 break; 552 case "select": 553 $select = 0; 554 $return .= "<label>".$data['label']."</label> <select class='".$data['name']."' name='".$data['name']."'>"; 555 $return .= "<option value=''></option>"; 556 foreach($data["options"] as $id=>$op){ 557 $sel = ""; 558 if($data['value'] == $id and $data['value'] !== "") { 559 $select = 1; 560 $sel = "selected='selected'"; 561 } 562 $return .= "<option value='$id' $sel>".__($op, "chronosly")."</option>"; 563 } 564 $return .= "</select><br/>"; 565 break; 566 case "link": 567 break; 568 569 default: 570 //extendemos los tipos llamando al hook que toca 571 $return .= apply_filters("new_dad_buble_".$data['type'], $data);//se crea un hook especifico para llamar a la variable personalizada 572 break; 573 } 574 return $return; 575 } 576 577 /** 578 * hook into WP's admin_init action hook 579 */ 580 public function admin_init() 9 581 { 10 582 11 583 12 // register actions 13 14 add_filter( 'posts_where', array(&$this,'title_like_where'), 10, 2 ); 15 add_filter( 'posts_where', array(&$this,'meta_like_where'), 10, 2 ); 16 add_filter( 'posts_where', array(&$this,'meta_price_where'), 10, 2 ); 17 add_filter( 'posts_where', array(&$this,'meta_near_where'), 10, 2 ); 18 add_shortcode( 'chronosly', array($this, 'chronosly_shortcode' )); 19 add_shortcode( 'chronoslybase', array($this, 'chronosly_base_shortcode' )); 20 add_action( 'wp_ajax_nopriv_ch_run_shortcode', array(&$this, 'js_ch_run_shortcode' )); 21 add_action( 'wp_ajax_ch_run_shortcode', array(&$this, 'js_ch_run_shortcode' )); 22 23 } // END public function __construct 24 25 26 27 public function chronosly_base_shortcode($atts){ 28 global $chshortcode; 29 if(!$chshortcode) return ""; 30 return do_shortcode("[chronosly $chshortcode]"); 31 } 32 33 public function chronosly_shortcode($atts){ 34 35 36 37 $settings = unserialize(get_option("chronosly-settings")); 38 $args = array( 39 'type' => 'calendar',//type: allowed calendar, event, organizer, place, category 40 "upcoming" => 0, //upcoming: days for upcoming events 41 "year" => 0,//year: for filtering calendar and event 42 "month" => 0,//month: for filtering calendar and event 43 "week" => 0,//week: for filtering calendar and event 44 "day" => 0,//day: for filtering event, 45 'id' => 0,//id: for individual reference of types, coma separated 46 'exclude' => 0,//id of excluded elements, coma separated 47 'single' => 0, //set if we want to show the single or archive view, not allowed on calendar view. 48 'count' => $settings["chronosly_events_x_page"], //number of results 49 'category' => 0,//filter for concret categories,coma separated 50 'organizer' => 0,//filter for concret organizers, coma separated 51 'place' => 0,//filter for concret places,coma separated 52 'navigation' => 0, //show navigation on top 53 'pagination' => 0, //show pagination on bottom 54 'small' => 0,//set if the container whith is small than 400px to adjust style 55 'featured' => 0, //set yes or no to switch between featured obects 56 'before_events' => 0, 57 'after_events' => 0, 58 'show_past' => 0, 59 'template' => '' //use another template on shortcode 60 ); 61 $args = apply_filters("chronosly-shortcode-extra-params", $args); 62 $code = shortcode_atts( $args , $atts ); 63 64 $code = apply_filters("chronosly-shortcode-extra-params-run", $code); 65 //print_r($code); 66 $_REQUEST["small"] = $code["small"]; 67 $_REQUEST["navigation"] = $code["navigation"]; 68 Chronosly_Templates::set_shortcode_template_css(); 69 70 if( $code["template"]) { 71 $_REQUEST["force_template"] = $code["template"]; 72 Chronosly_Templates::set_shortcode_template_css($code["template"]); 73 } 74 if( $code["year"]){ 75 $_REQUEST["chronosly_event_list_format"] = "year"; 76 $_REQUEST["chronosly_event_list_time"] = $code["year"]; 77 $_REQUEST["y"] = $code["year"]; 78 } 79 if($code["month"]){ 80 $_REQUEST["mo"] = $code["month"]; 81 $_REQUEST["chronosly_event_list_time"] = $code["month"]; 82 $_REQUEST["chronosly_event_list_format"] = "month"; 83 84 } 85 if($code["week"]){ 86 87 $_REQUEST["week"] = $code["week"]; 88 $_REQUEST["chronosly_event_list_time"] = $code["week"]; 89 $_REQUEST["chronosly_event_list_format"] = "week"; 90 91 } 92 if($code["day"]){ 93 //show event list for day 94 if($code["type"] != "category") $code["type"] = "event"; 95 $_REQUEST["chronosly_event_list_format"] = "day"; 96 $_REQUEST["chronosly_event_list_time"] = $code["day"]; 97 98 } 99 if($code["upcoming"]){ 100 //show event list for day 101 //$code["type"] = "event"; 102 $_REQUEST["chronosly_event_list_format"] = "upcoming"; 103 $_REQUEST["chronosly_event_list_time"] = $code["upcoming"]; 104 105 } 106 if($code["show_past"] or class_exists("Chronosly_Tickets_and_Repeats_Extended") ){ 107 //show event list for day 108 //$code["type"] = "event"; 109 $_REQUEST["ch_show_past"] = 1; 110 111 } 112 113 // $_REQUEST["ch_code"] = "[chronosly"; 114 // if(is_array($atts)){ 115 // foreach($atts as $k=>$v){ 116 // $_REQUEST["ch_code"] .= " $k='$v'"; 117 // } 118 // } 119 // $_REQUEST["ch_code"] .= "]"; 120 // $_REQUEST["ch_code"] = str_replace(array("'", '"', "\\\\"), array("\'", "\"", "\\"), $_REQUEST["ch_code"]); 121 $_REQUEST["ch_code"] = json_encode($atts); 122 123 // echo $_REQUEST["ch_code"]; 124 ob_start(); 125 126 $this->run_templates($code["type"], $code); 127 $content = ob_get_clean(); 128 $_REQUEST["chronosly_event_list_format"] = ""; 129 $_REQUEST["chronosly_event_list_time"] = ""; 130 $_REQUEST["y"] = ""; 131 $_REQUEST["mo"] = ""; 132 $_REQUEST["week"] = ""; 133 $_REQUEST["count"] = ""; 134 $_REQUEST["category"] = ""; 135 $_REQUEST["organizer"] = ""; 136 $_REQUEST["place"] = ""; 137 $_REQUEST["small"] = ""; 138 $_REQUEST["pagination"] = ""; 139 $_REQUEST["ch_code"] = ""; 140 $_REQUEST["force_template"] = ""; 141 return $content; 142 143 144 } 145 146 147 148 //function for rendering templates via wp_query 149 public function run_templates($type, $args){ 150 global $wp_query, $Post_Type_Chronosly, $pastformat; 151 $pastformat = 0;//para enseñar en formato eventos pasados 152 if(isset($_REQUEST["chronosly_event_list_time"]) and $_REQUEST["chronosly_event_list_time"] == "past"){ 153 $pastformat = 1; 154 } 155 $_REQUEST["shortcode"] = 1; 156 $q = array(); 157 if($args["id"]) { 158 $q["post__in"] = explode(",", $args["id"]); 159 160 } 161 if($type == "place" and $args["place"]){ 162 $ids = explode(",", $args["place"]); 163 if($q["post__in"]) $q["post__in"]= array_merge($q["post__in"],$ids); 164 else $q["post__in"]= $ids; 165 } 166 if($type == "organizer" and $args["organizer"]){ 167 $ids = explode(",", $args["organizer"]); 168 if($q["post__in"]) $q["post__in"]= array_merge($q["post__in"],$ids); 169 else $q["post__in"]= $ids; 170 } 171 if($args["author"]) { 172 $q["author"] = $args["author"]; 173 } 174 if($args["exclude"]) { 175 $q["post__not_in"] = explode(",",$args["exclude"]); 176 } 177 if($args["category"]) { 178 $_REQUEST["category"] = $args["category"]; 179 } 180 if($args["organizer"]) { 181 $_REQUEST["organizer"] = $args["organizer"]; 182 } 183 if($args["place"]) { 184 $_REQUEST["place"] = $args["place"]; 185 } 186 if($args["count"]) { 187 $q['posts_per_page']=$args["count"]; 188 $q['numberposts']=$args["count"]; 189 $_REQUEST["count"] = $args["count"]; 190 } 191 if($args["pagination"]) { 192 //$q['posts_per_page']=$args["count"]; 193 $_REQUEST['pagination']= 1; 194 } 195 if(isset($_REQUEST["page"])) { 196 //$q['posts_per_page']=$args["count"]; 197 $q['paged'] =$_REQUEST['page']; 198 } 199 200 if($args["before_events"]) { 201 $_REQUEST["before_events"] = 1; 202 } 203 if($args["after_events"]) { 204 $_REQUEST["after_events"] = 1; 205 } 206 if($args["featured"]) { 207 if($args["featured"] == "yes" || $args["featured"] == "1") $feat = 1; 208 else $feat = ""; 209 $q['post_meta_like']["featured"] = $feat; 210 $_REQUEST["featured"] = $args["featured"]; 211 } 212 if(isset($args["price_min"])){ 213 $q['post_meta_price_min'] = $args["price_min"]; 214 $_REQUEST["ch-price-min"] = $args["price_min"]; 215 } 216 if(isset($args["price_max"])){ 217 $q['post_meta_price_max'] = $args["price_max"]; 218 $_REQUEST["ch-price-max"] = $args["price_max"]; 219 } 220 221 if ( is_user_logged_in() )$q["post_status"] = array('publish', 'private'); 222 223 switch($type){ 224 case "calendar": 225 226 if ( is_user_logged_in() )new WP_Query("post_type=chronosly_calendar&post_status=publish,private"); 227 else $wp_query = new WP_Query("post_type=chronosly_calendar"); 228 229 include(Post_Type_Chronosly::chronosly_templates("shortcode_calendar")); 230 break; 231 case "event": 232 if($args["single"]) { 233 234 if ( is_user_logged_in() ) query_posts("post_type=chronosly&p=".$args["id"]."&post_status=publish,private"); 235 else query_posts("post_type=chronosly&p=".$args["id"]); 236 237 include(Post_Type_Chronosly::chronosly_templates("shortcode_event")); 238 239 } 240 else { 241 242 add_action( 'pre_get_posts', array("Post_Type_Chronosly",'add_custom_post_vars') ); 243 $q["post_type"]="chronosly"; 244 $q["posts_per_page"]=-1; 245 $wp_query = new WP_Query($q); 246 include(Post_Type_Chronosly::chronosly_templates("shortcode_events")); 247 248 } 249 break; 250 case "json_format": 251 252 253 add_action( 'pre_get_posts', array("Post_Type_Chronosly",'add_custom_post_vars') ); 254 $q["post_type"]="chronosly"; 255 $q["posts_per_page"]=-1; 256 $wp_query = new WP_Query($q); 257 $posts = $wp_query->posts; 258 echo "<div class='json_format' style='display:none'>".json_encode($posts).'</div>'; 259 // $postr = array(); 260 // foreach($posts as $post){ 261 // $postr[]= get_object_vars($post); 262 // } 263 // print_r($postr); 264 265 266 break; 267 case "map_format": 268 // print_r($args); 269 add_action( 'pre_get_posts', array("Post_Type_Chronosly",'add_custom_post_vars') ); 270 $q["post_type"]="chronosly"; 271 $q["posts_per_page"]=-1; 272 $wp_query = new WP_Query($q); 273 // echo "<pre>";print_r($wp_query); 274 $repeated = Post_Type_Chronosly::get_events_repeated_by_date(-1, 1, $extra); 275 $elementos = Post_Type_Chronosly::get_days_by_date($wp_query, $repeated, -1, 1); 276 // print_r($repeated); 277 $elements = $elementos[0]; 278 // echo "<pre>"; print_r($repeated); 279 // $posts = $wp_query->posts; 280 // echo "<div class='json_format' style='display:none'>".json_encode($posts).'</div>'; 281 $postr = array(); 282 283 $repeats = array(); 284 // $tiempo_inicio = microtime(true); 285 286 287 foreach($elements as $el){ 288 $xid = 0; 289 if(count($postr) > 700) break; 290 ob_start(); 291 292 if(is_array($el)){ 293 $xid = $ide = $el["id"]; 294 if(isset($repeats[$xid])) $ide .= "_".$repeats[$xid]; 295 // $Post_Type_Chronosly->template->print_template($el["id"], "dad1", "", "", "front", array("id" => $ide, "start" => $el["start"], "end" => $el["end"])); 296 $Post_Type_Chronosly->template->print_template($el["id"], "dad1", "", "", "front", array("id" => $ide, "start" => $el["start"], "end" => $el["end"])); 297 } 298 else { 299 $xid = $el; 300 // $Post_Type_Chronosly->template->print_template($el, "dad1", "", "", "front", array()); 301 $Post_Type_Chronosly->template->print_template($el, "dad1", "", "", "front", array()); 302 } 303 if(isset($repeats[$xid])) ++$repeats[$xid]; 304 else $repeats[$xid] = 1; 305 $content = ob_get_clean(); 306 $metas = $Post_Type_Chronosly->template->vars->metas; 307 308 $address = ""; 309 if($metas["places_vars"][0]["metas"]["latlong"][0]){ 310 $address = $metas["places_vars"][0]["metas"]["latlong"][0]; 311 } else { 312 $v1 = $metas["places_vars"][0]["metas"]["evp_dir"][0]; 313 if(stripos($v1, "class='lorem'") === FALSE) $address .= "$v1, "; 314 $v1 = $metas["places_vars"][0]["metas"]["evp_city"][0]; 315 if(stripos($v1, "class='lorem'") === FALSE) $address .= "$v1, "; 316 $v1 = $metas["places_vars"][0]["metas"]["evp_country"][0]; 317 if(stripos($v1, "class='lorem'") === FALSE) $address .= "$v1, "; 318 $v1 = $metas["places_vars"][0]["metas"]["evp_state"][0]; 319 if(stripos($v1, "class='lorem'") === FALSE) $address .= "$v1, "; 320 $v1 = $metas["places_vars"][0]["metas"]["evp_pc"][0]; 321 if(stripos($v1, "class='lorem'") === FALSE) $address .= "$v1"; 322 } 323 if(!$address) continue; 324 if ($metas['repeat']) $repe = "&repeat=" . $metas['repeat']; 325 $id = explode("_", $Post_Type_Chronosly->template->vars->pid); 326 $id = $id[0]; 327 328 329 $link = "ev_popup('".$id.$repe."&post_type=chronosly')"; 330 331 if(strlen(json_encode($content)) > 5){ 332 $postr[]= array( 333 //"vars" => get_object_vars($post), 334 // "metas" => $metas, 335 "content" => $content, 336 "address" => $address, 337 "click" => $link, 338 339 ); 340 } 341 342 343 344 } 345 echo json_encode($postr); 346 347 break; 348 case "organizer": 349 if($args["single"]) { 350 351 if ( is_user_logged_in() ) query_posts("post_type=chronosly_organizer&p=".$args["id"]."&post_status=publish,private"); 352 else query_posts("post_type=chronosly_organizer&p=".$args["id"]); 353 include(Post_Type_Chronosly::chronosly_templates("shortcode_organizer")); 354 355 } 356 else { 357 358 if(!has_action( 'posts_orderby', array("Post_Type_Chronosly_Organizer",'add_custom_organizers_orderby'))) add_action( 'posts_orderby', array("Post_Type_Chronosly_Organizer",'add_custom_organizers_orderby') ); 359 $q["post_type"]="chronosly_organizer"; 360 $wp_query = new WP_Query($q); 361 if(has_action( 'posts_orderby', array("Post_Type_Chronosly_Organizer",'add_custom_organizers_orderby'))) remove_action( 'posts_orderby', array("Post_Type_Chronosly_Organizer",'add_custom_organizers_orderby') ); 362 363 include(Post_Type_Chronosly::chronosly_templates("shortcode_organizers")); 364 365 } 366 break; 367 case "place": 368 if($args["single"]) { 369 if ( is_user_logged_in() ) query_posts("post_type=chronosly_places&p=".$args["id"]."&post_status=publish,private"); 370 else query_posts("post_type=chronosly_places&p=".$args["id"]); 371 include(Post_Type_Chronosly::chronosly_templates("shortcode_place")); 372 373 } 374 else { 375 if(!has_action( 'posts_orderby', array("Post_Type_Chronosly_Places",'add_custom_places_orderby') )) add_action( 'posts_orderby', array("Post_Type_Chronosly_Places",'add_custom_places_orderby') ); 376 $q["post_type"]="chronosly_places"; 377 $wp_query = new WP_Query($q); 378 if(has_action( 'posts_orderby', array("Post_Type_Chronosly_Places",'add_custom_places_orderby') )) remove_action( 'posts_orderby', array("Post_Type_Chronosly_Places",'add_custom_places_orderby') ); 379 380 include(Post_Type_Chronosly::chronosly_templates("shortcode_places")); 381 382 } 383 break; 384 case "category": 385 if($args["single"]) { 386 $cat = get_term($args["id"], "chronosly_category"); 387 388 $wp_query->set("chronosly_category", $cat->slug); 389 include(Post_Type_Chronosly::chronosly_templates("shortcode_category")); 390 391 } 392 else { 393 $wp_query = new WP_Query($q); 394 include(Post_Type_Chronosly::chronosly_templates("shortcode_categories")); 395 396 } 397 break; 398 399 400 } 401 wp_reset_query();//reset the query status 402 } 403 404 405 406 function js_ch_run_shortcode(){ 407 $code = json_decode( str_replace('\"' , '"', urldecode($_REQUEST["ch_code"]))); 408 409 // print_r($code); 410 411 $decode = "[chronosly"; 412 if($code){ 413 foreach($code as $k=>$v){ 414 $decode .= " $k='$v'"; 415 } 416 } 417 $decode .= "]"; 418 //if($_REQUEST['paged']) $code = str_replace(); 419 if(strpos($decode, "]") !== false ) echo do_shortcode($decode); 420 die(); 421 } 422 423 function title_like_where( $where, &$wp_query ) { 424 global $wpdb; 425 if ( $post_title_like = $wp_query->get( 'post_title_like' ) ) { 426 $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'%' . esc_sql( $post_title_like ) . '%\''; 427 428 } 429 return $where; 430 } 431 432 function meta_like_where( $where, &$wp_query ) { 433 global $wpdb; 434 if ( $meta_like = $wp_query->get( 'post_meta_like' ) ) { 435 if(count($meta_like) > 1){ 436 foreach ($meta_like as $key=>$meta){ 437 $where .= ' AND exists(select post_id FROM '.$wpdb->postmeta.' where '. $wpdb->posts .'.ID = ' . $wpdb->postmeta . '.post_id AND ' . $wpdb->postmeta . '.meta_key = "'.$key.'" AND ' . $wpdb->postmeta . '.meta_value LIKE \'%' . esc_sql( $meta ) . '%\')'; 438 439 } 440 } else $where .= ' AND exists(select post_id FROM '.$wpdb->postmeta.' where '. $wpdb->posts .'.ID = ' . $wpdb->postmeta . '.post_id AND ' . $wpdb->postmeta . '.meta_key = "'.key($meta_like).'" AND ' . $wpdb->postmeta . '.meta_value LIKE \'%' . esc_sql( $meta_like[key($meta_like)] ) . '%\')'; 441 442 443 } 444 return $where; 445 } 446 447 function meta_price_where( $where, &$wp_query ) { 448 global $wpdb; 449 if ( $meta_like = $wp_query->get( 'post_meta_price_min' ) ) { 450 $where .= ' AND exists(select post_id FROM '.$wpdb->postmeta.' where '. $wpdb->posts .'.ID = ' . $wpdb->postmeta . '.post_id AND ' . $wpdb->postmeta . '.meta_key = "tickets" AND ' . $wpdb->postmeta . '.meta_value like \'%{"name":"price","value":"%\' and SUBSTRING_INDEX( SUBSTRING_INDEX( meta_value, \'{"name":"price","value":"\', -1 ) , \'"}\', 1 ) >= '.$meta_like.')'; 451 452 } else if($meta_like === "0") { 453 $where .= ' AND exists(select post_id FROM '.$wpdb->postmeta.' where '. $wpdb->posts .'.ID = ' . $wpdb->postmeta . '.post_id AND ' . $wpdb->postmeta . '.meta_key = "tickets" AND ((' . $wpdb->postmeta . '.meta_value like \'%{"name":"price","value":"%\' and SUBSTRING_INDEX( SUBSTRING_INDEX( meta_value, \'{"name":"price","value":"\', -1 ) , \'"}\', 1 ) >= 0) OR ' . $wpdb->postmeta . '.meta_value = ""))'; 454 } 455 if ( $meta_like2 = $wp_query->get( 'post_meta_price_max' ) and $meta_like !== "0") { 456 $where .= ' AND exists(select post_id FROM '.$wpdb->postmeta.' where '. $wpdb->posts .'.ID = ' . $wpdb->postmeta . '.post_id AND ' . $wpdb->postmeta . '.meta_key = "tickets" AND ' . $wpdb->postmeta . '.meta_value like \'%{"name":"price","value":"%\' and SUBSTRING_INDEX( SUBSTRING_INDEX( meta_value, \'{"name":"price","value":"\', -1 ) , \'"}\', 1 ) <= '.$meta_like2.')'; 457 458 } else if($meta_like2 === "0") $where .= ' AND exists(select post_id FROM '.$wpdb->postmeta.' where '. $wpdb->posts .'.ID = ' . $wpdb->postmeta . '.post_id AND ' . $wpdb->postmeta . '.meta_key = "tickets" AND ((' . $wpdb->postmeta . '.meta_value like \'%{"name":"price","value":"%\' and SUBSTRING_INDEX( SUBSTRING_INDEX( meta_value, \'{"name":"price","value":"\', -1 ) , \'"}\', 1 ) <= 0) OR ' . $wpdb->postmeta . '.meta_value = ""))'; 459 else if($meta_like === "0") $where .= ' AND exists(select post_id FROM '.$wpdb->postmeta.' where '. $wpdb->posts .'.ID = ' . $wpdb->postmeta . '.post_id AND ' . $wpdb->postmeta . '.meta_key = "tickets" AND ((' . $wpdb->postmeta . '.meta_value like \'%{"name":"price","value":"%\' and (SUBSTRING_INDEX( SUBSTRING_INDEX( meta_value, \'{"name":"price","value":"\', -1 ) , \'"}\', 1 ) <= 0 OR SUBSTRING_INDEX( SUBSTRING_INDEX( meta_value, \'{"name":"price","value":"\', -1 ) , \'"}\', 1 ) <= '.$meta_like2.')) OR ' . $wpdb->postmeta . '.meta_value = ""))'; 460 return $where; 461 } 462 463 function meta_near_where( $where, &$wp_query ) { 464 global $wpdb; 465 if ( $box = $wp_query->get( 'post_meta_location' ) ) { 466 $where .= ' AND exists(select post_id FROM '.$wpdb->postmeta.' where '. $wpdb->posts .'.ID = ' . $wpdb->postmeta . '.post_id AND '.$wpdb->postmeta . '.meta_key = "latlong" 467 AND (SUBSTRING_INDEX(REPLACE('.$wpdb->postmeta . '.meta_value, "(", ""), ",", 1) BETWEEN ' . $box['min_lat']. ' AND ' . $box['max_lat'] . ') 468 AND (SUBSTRING_INDEX(REPLACE('.$wpdb->postmeta . '.meta_value, ")", ""), ",", -1) BETWEEN ' . $box['min_lng']. ' AND ' . $box['max_lng']. '))'; 469 } 470 471 return $where; 472 } 473 474 475 // END public function plugin_settings_page() 584 585 $this->init_addons(); 586 do_action("chronosly_dad_vars_fields"); 587 588 589 590 591 } 592 593 //cargamos los init de la carpeta addons 594 private static function init_addons(){ 595 $addonspath = CHRONOSLY_ADDONS_PATH; 596 if ($handle = opendir($addonspath)) { 597 while (false !== ($entry = readdir($handle))) { 598 if($entry != "." and $entry != ".." and is_dir($addonspath.DIRECTORY_SEPARATOR.$entry)) { 599 if ($handle2 = opendir($addonspath.DIRECTORY_SEPARATOR.$entry)) { 600 while (false !== ($entry2 = readdir($handle2))) { 601 if($entry2 == "init.php") require_once($addonspath.DIRECTORY_SEPARATOR.$entry.DIRECTORY_SEPARATOR."init.php"); 602 } 603 closedir($handle2); 604 605 } 606 607 608 } 609 610 } 611 612 closedir($handle); 613 } 614 } 615 616 617 // END public function plugin_settings_page() 476 618 477 619 … … 480 622 } // END 481 623 624 625 -
chronosly-events-calendar/trunk/classes/chronosly_shortcode.php
r1277154 r1282202 1 1 <?php 2 if(!class_exists('Chronosly_ Shortcode'))2 if(!class_exists('Chronosly_Extend')) 3 3 { 4 class Chronosly_Shortcode 5 { 6 7 8 public function __construct() 4 5 6 class Chronosly_Extend 7 { 8 /** 9 * Construct the plugin object 10 */ 11 12 13 public function __construct() 14 { 15 16 17 // register actions 18 19 add_action('init', array(&$this, 'admin_init'), 11); 20 21 add_action("chronosly_update_addons", array(&$this, 'update_addons'), 100, 1); 22 add_action("chronosly_update_templates",array(&$this, 'update_templates'), 100, 1); 23 24 25 add_action( 'widgets_init', array(&$this, 'register_widgets' )); 26 27 // add_action('admin_menu', array(&$this, 'extra_init')); 28 // add_action( 'admin_enqueue_scripts', array(&$this,'extra_init') ); 29 30 31 } // END public function __construct 32 33 34 public function get_addons_feed(){ 35 36 $addons = json_decode( 37 '{ 38 "import_and_export":{ 39 "id":"import_and_export", 40 "version":"2.0", 41 "name":"Import and Export", 42 "desc":"Import / Export your content (events, organizers, places and calendars) to iCal, .csv file (Excel or Numbers), Facebook or Google+" , 43 "img":"http://plugins.heimsveld.com/thumbnail-import-export-addon-230px.png", 44 "price":27, 45 "author":"Chronosly", 46 "author_url":"http://www.chronosly.com", 47 "view":"https://www.chronosly.com/faq/addons/import-export-events-organizers-places/?utm_source=clients&utm_medium=referral&utm_campaign=Addons2Import_ExportAddon_FAQ", 48 "url":"https://www.chronosly.com/product/import-export/?utm_source=clients&utm_medium=referral&utm_campaign=Addons2Import_Export", 49 "featured":0, 50 "updated":1414467200, 51 "dw":10, 52 "rate":10 53 }, 54 "filter_and_sort":{ 55 "id":"filter_and_sort", 56 "version":"2.0", 57 "name":"Filter and Sort", 58 "desc":"Allow you to show your content based on given set of criteria" , 59 "img":"http://plugins.heimsveld.com/thumbnail-filters-sorting-addon-230px.png", 60 "price":21,"author":"Chronosly", 61 "author_url":"http://www.chronosly.com", 62 "view":"https://www.chronosly.com/faq/addons/filter-sort-addon/?utm_source=clients&utm_medium=referral&utm_campaign=Addons2FilterSort_FAQ", 63 "url":"https://www.chronosly.com/product/filter-sort-addon/?utm_source=clients&utm_medium=referral&utm_campaign=Addons2FilterSort", 64 "featured":0, 65 "updated":1414467200, 66 "dw":10, 67 "rate":10 68 }, 69 "social_media_share":{ 70 "id":"social_media_share", 71 "version":"1.9", 72 "name":"Social Media Share", 73 "desc":"Add social media buttons to your events for sharing, going viral or bigger potential audience" , 74 "img":"http://plugins.heimsveld.com/thumbnail-social-media-230px.png", 75 "price":14, 76 "author":"Chronosly", 77 "author_url":"http://www.chronosly.com", 78 "view":"https://www.chronosly.com/faq/addons/social-media-share-addon/?utm_source=clients&utm_medium=referral&utm_campaign=Addons2SMMShare_FAQ", 79 "url":"https://www.chronosly.com/product/social-media-addon/?utm_source=clients&utm_medium=referral&utm_campaign=Addons2SMMShare", 80 "featured":0, 81 "updated":1412467200, 82 "dw":1, 83 "rate":8 84 }, 85 "frontend_event_submission":{ 86 "id":"frontend_event_submission", 87 "version":"1.8", 88 "name":"Frontend Event Submission", 89 "desc":"Frontend event submission addon allow users to send events for admin approval" , 90 "img":"http://plugins.heimsveld.com/thumbnail-frontend-event-submission-230px.png", 91 "price":29, 92 "author":"Chronosly", 93 "author_url":"http://www.chronosly.com", 94 "view":"https://www.chronosly.com/faq/addons/new-frontend-event-submission-addon/?utm_source=clients&utm_medium=referral&utm_campaign=Addons2EventSubmit_FAQ", 95 "url":"https://www.chronosly.com/product/frontend-event-submission-addon/?utm_source=clients&utm_medium=referral&utm_campaign=Addons2EventSubmit", 96 "featured":0, 97 "updated":1412467200, 98 "dw":1, 99 "rate":8 100 }, 101 "tickets_and_repeats_extended":{ 102 "id":"tickets_and_repeats_extended", 103 "version":"1.4", 104 "name":"Tickets and Repeat Enhancement ", 105 "desc":"Enhance ADVANCED recurring and ticketing event features" , 106 "img":"http://plugins.heimsveld.com/thumbnail-recurring-events-enahancement-230px.png", 107 "price":20, 108 "author":"Chronosly", 109 "author_url":"http://www.chronosly.com", 110 "view":"https://www.chronosly.com/faq/addons/upcoming-recurring-events-ticketing/?utm_source=clients&utm_medium=referral&utm_campaign=Addons2Recurring_FAQ", 111 "url":"https://www.chronosly.com/product/recurring-ticketing-enhancement-for-events-addon/?utm_source=clients&utm_medium=referral&utm_campaign=Addons2Recurring", 112 "featured":0, 113 "updated":1412467200, 114 "dw":1, 115 "rate":9 116 }, 117 "map_navigation":{ 118 "id":"map_navigation", 119 "version":"1.0", 120 "name":"Map my events", 121 "desc":"Display ALL your events (map pins) on a full-size Google map" , 122 "img":"https://www.chronosly.com/wp-content/uploads/2015/09/full-event-map-addon-DEF.png", 123 "price":19, 124 "author":"Chronosly", 125 "author_url":"http://www.chronosly.com", 126 "view":"https://www.chronosly.com/faq/addons/map-my-events/?utm_source=clients&utm_medium=referral&utm_campaign=Addons2Map_FAQ", 127 "url":"https://www.chronosly.com/product/map-my-events/?utm_source=clients&utm_medium=referral&utm_campaign=Addons2Map", 128 "featured":0, 129 "updated":1412467200, 130 "dw":1, 131 "rate":9 132 } 133 }'); 134 set_transient( "addons_marketplace", $addons, 60 * 60 * 24 ); 135 foreach($addons as $k=>$ad){ 136 if($settings = unserialize(get_option("chronosly_settings_{$k}"))) { 137 $settings["needed_version"] = $ad->version; 138 update_option("chronosly_settings_{$k}", serialize($settings)); 139 } 140 } 141 142 return $addons; 143 144 } 145 146 public function get_templates_feed(){ 147 148 $templates= json_decode( 149 '{ 150 "default":{"id":"default","version":"1.0","name":"Default","desc":"Default Template","img":"http://plugins.heimsveld.com/thumbnail-default-300px.jpg","price":0,"author":"Chronosly","author_url":"http://www.chronosly.com","view":"http://www.chronosly.com","url":"http://www.chronosly.com","featured":0,"updated":1412467200,"dw":1,"rate":8}, 151 "dark":{"id":"dark","version":"2.0","name":"Dark","desc":"This is the dark design version of Chronosly Default template, specially designed to match with darker theme sites.","img":"http://plugins.heimsveld.com/thumbnail-dark-300px.jpg","price":12,"author":"Chronosly","author_url":"http://www.chronosly.com", "view":"http://dark.chronosly.com/events/?utm_source=chronosly.com&utm_medium=referral&utm_campaign=Templates2DarkLiveDemo", "url":"https://www.chronosly.com/product/dark-template-addon/?utm_source=clients&utm_medium=referral&utm_campaign=Templates2Darkprofile","featured":0,"updated":1409356800,"dw":0,"rate":8}, 152 "grid":{"id":"grid","version":"2.0","name":"Grid","desc":"Responsive theme with 3 Column Grid based homepage layout.","img":"http://plugins.heimsveld.com/thumbnail-grid-300px.jpg","price":17,"author":"Chronosly","author_url":"http://www.chronosly.com", "view":"http://grid.chronosly.com/events/?utm_source=chronosly.com&utm_medium=referral&utm_campaign=Templates2GridLiveDemo", "url":"https://www.chronosly.com/product/grid-template/?utm_source=clients&utm_medium=referral&utm_campaign=Templates2Gridprofile","featured":0,"updated":1409356800,"dw":0,"rate":8}, 153 "tickets":{"id":"tickets","version":"1.4","name":"Ticketing","desc":"Modern and clean design, effective and convincing way to sell your tickets","img":"http://plugins.heimsveld.com/thumbnail-ticketing-300px.jpg","price":15,"author":"Chronosly","author_url":"http://www.chronosly.com", "view":"http://ticketing.chronosly.com/events/?utm_source=chronosly.com&utm_medium=referral&utm_campaign=Templates2TicketingLiveDemo", "url":"https://www.chronosly.com/product/ticketing-template/?utm_source=clients&utm_medium=referral&utm_campaign=Templates2Ticketingprofile","featured":0,"updated":1409356800,"dw":0,"rate":8} 154 155 }'); 156 set_transient( "templates_marketplace", $templates, 60 * 60 * 24 ); 157 return $templates; 158 159 } 160 161 public function register_widgets() { 162 register_widget( 'Chronosly_Widget' ); 163 } 164 165 166 public function update_addons($addon=""){ 167 168 //si se llama desde el admin ejecutar un reload par que lo cargue bien en la pantalla 169 // 170 171 } 172 173 public function update_templates($template=""){ 174 175 176 } 177 178 public function plugin_updated(){ 179 $file = CHRONOSLY_ADDONS_PATH.DIRECTORY_SEPARATOR."version.json"; 180 if ($f = @fopen($file, "r")) { 181 $version =@fread($f, filesize($file)); 182 if($version != CHRONOSLY_VERSION) { 183 if($f1 = @fopen($file, "w+")){ 184 fwrite($f1, CHRONOSLY_VERSION); 185 @fclose($f1); 186 return true; 187 } else return false; 188 } 189 @fclose($f); 190 return false; 191 192 193 } else { 194 if($f = @fopen($file, "w+")){ 195 fwrite($f, CHRONOSLY_VERSION); 196 @fclose($f); 197 return true; 198 } else return false; 199 } 200 } 201 202 public function copy_default_template(){ 203 $utils = new Chronosly_Utils(); 204 $files = scandir (CHRONOSLY_PATH.DIRECTORY_SEPARATOR."custom-templates"); 205 foreach ( $files as $file ) { 206 if ($file != "." && $file != ".."){ 207 $utils->rcopy( CHRONOSLY_PATH.DIRECTORY_SEPARATOR."custom-templates/$file", CHRONOSLY_TEMPLATES_PATH.DIRECTORY_SEPARATOR."$file" ); 208 } 209 } 210 211 } 212 213 public function rebuild_addons_files(){ 214 $utils = new Chronosly_Utils(); 215 if(is_dir(CHRONOSLY_ADDONS_PATH.DIRECTORY_SEPARATOR."organizers_and_places")){ 216 $files = scandir ( CHRONOSLY_ADDONS_PATH.DIRECTORY_SEPARATOR."organizers_and_places"); 217 foreach ( $files as $file ) { 218 if ($file != "." && $file != ".."){ 219 $utils->rcopy ( CHRONOSLY_ADDONS_PATH.DIRECTORY_SEPARATOR."organizers_and_places/$file", CHRONOSLY_PATH."/$file" ); 220 } 221 } 222 // $utils->rrmdir( $destination_path.DIRECTORY_SEPARATOR."organizers_and_places"); 223 $settings = unserialize(get_option("chronosly-settings")); 224 $settings["chronosly_organizers_addon"] = 1; 225 $settings["chronosly_places_addon"] = 1; 226 update_option('chronosly-settings', serialize($settings)); 227 } 228 if(is_dir(CHRONOSLY_ADDONS_PATH.DIRECTORY_SEPARATOR."extended_marketplace")) { 229 $files = scandir ( CHRONOSLY_ADDONS_PATH.DIRECTORY_SEPARATOR."extended_marketplace"); 230 foreach ( $files as $file ) { 231 if ($file != "." && $file != ".."){ 232 $utils->rcopy ( CHRONOSLY_ADDONS_PATH.DIRECTORY_SEPARATOR."extended_marketplace/$file", CHRONOSLY_PATH."/$file" ); 233 } 234 } 235 } 236 237 } 238 239 240 //Cuando un template se actualiza se pierden los añadidos de los addons 241 public function rebuild_template_addons($template){ 242 global $Post_Type_Chronosly; 243 $addons = array(); 244 $addons_list = apply_filters("chronosly_addons_settings_item", $addons); 245 if(!count($addons_list)) { 246 Chronosly_Extend::init_addons(); 247 $addons_list = apply_filters("chronosly_addons_settings_item", $addons); 248 } 249 250 if(count($addons_list)){ 251 foreach($addons_list as $k=>$v){ 252 if(has_filter("chronosly_update_template_{$k}")) $Post_Type_Chronosly->template->full_update_templates_by_addon($k,array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), array($template)); 253 254 } 255 } 256 } 257 258 259 public function get_external_content($url, $format=""){ 260 $response = wp_remote_post($url, array("timeout" => 60)); 261 $cont = array(); 262 if ( is_wp_error( $response ) ) { 263 $error_message = $response->get_error_message(); 264 $cont["error"] = 1 ; 265 $cont["message"] = "Something went wrong: $error_message"; 266 } else { 267 if($response["response"]["code"] != 200){ 268 $cont["error"] = 1 ; 269 $cont["message"] = $response["response"]["message"].": ".$response["body"]; 270 } 271 else { 272 $cont["error"] = 0 ; 273 switch($format){ 274 case "json": 275 $cont["content"] = json_decode($response["body"]); 276 break; 277 default: 278 $cont["content"] = $response["body"]; 279 break; 280 } 281 } 282 } 283 //print_r($response); 284 // print_r($cont); 285 return $cont; 286 } 287 288 //update code via donwloadding zip 289 public function update_code($type, $url, $addon=""){ 290 global $Chronosly_Settings; 291 switch($type){ 292 case "core": 293 $path = CHRONOSLY_PATH; 294 break; 295 case "addons": 296 $path = CHRONOSLY_ADDONS_PATH; 297 break; 298 case "templates": 299 $path = CHRONOSLY_TEMPLATES_PATH; 300 301 break; 302 } 303 304 $cont = $this->get_external_content($url); 305 // return; 306 //save the zip temporaly 307 if($cont["error"]) return 0; 308 $zip = $cont["content"]; 309 $fp = fopen(CHRONOSLY_PATH.DIRECTORY_SEPARATOR."temp.zip", "w"); 310 fwrite($fp, $zip); 311 fclose($fp); 312 require_once(ABSPATH .'/wp-admin/includes/file.php'); 313 WP_Filesystem(); 314 if(stripos($addon, "organizers_and_places") !== FALSE or stripos($addon, "extended_marketplace") !== FALSE) $path = CHRONOSLY_PATH; 315 $unzipfile = unzip_file(CHRONOSLY_PATH.DIRECTORY_SEPARATOR."temp.zip", $path); 316 @unlink( CHRONOSLY_PATH.DIRECTORY_SEPARATOR."temp.zip"); 317 $utils = new Chronosly_Utils(); 318 319 if(stripos($addon, "organizers_and_places") !== FALSE and $unzipfile === true) { 320 $files = scandir ( $path.DIRECTORY_SEPARATOR."organizers_and_places"); 321 foreach ( $files as $file ) { 322 if ($file != "." && $file != ".."){ 323 $utils->rcopy( $path.DIRECTORY_SEPARATOR."organizers_and_places/$file", $destination_path.DIRECTORY_SEPARATOR."$file" ); 324 } 325 } 326 } 327 else if(stripos($addon, "extended_marketplace") !== FALSE and $unzipfile === true) { 328 $files = scandir ( $path.DIRECTORY_SEPARATOR."extended_marketplace"); 329 foreach ( $files as $file ) { 330 if ($file != "." && $file != ".."){ 331 $utils->rcopy( $path.DIRECTORY_SEPARATOR."extended_marketplace/$file", $destination_path.DIRECTORY_SEPARATOR."$file" ); 332 } 333 } 334 } 335 336 if ( $unzipfile === true) return 1; 337 return 0; 338 } 339 340 public static function create_dad_field($data){ 341 global $ch_field_create_js_code, $ch_field_modify_js_code, $ch_js_style_fields, $ch_php_style_fields; 342 if(!count($data)) return; //el data tiene que ser un array valido 343 if(!$data["name"] or !$data["type"] or !$data["type"]) return; //aseguramos que tenemos los minimos 344 if($data["el_type"] == "var" and (!$data["php_function"] or !$data["js_function"])) return; 345 else if($data["el_type"] == "style" and (!$data["style_fields"] or !$data["js_style_values"] or !$data["php_style_values"])) return; 346 $return = ""; 347 $return .= Chronosly_Extend::create_field($data); 348 //llamamos a los fields associados a este value 349 350 if(isset($data['fields_associated'])){ 351 foreach($data['fields_associated'] as $field){ 352 if(has_filter("chronosly_field_".$field["name"])){ 353 $default = $field; 354 355 //if(count($fields_array) and isset($fields_array[$field["name"]])) $default = array_merge($default, $fields_array[$field["name"]]); //setting values to fields 356 $return .= apply_filters("chronosly_field_".$field["name"], $default); 357 } 358 } 359 } 360 361 if(isset($data['js_function'])){ 362 //si no la hemos añadido ya antes 363 364 if(stripos($ch_field_create_js_code, $data["name"]."chseparator1") === FALSE){ 365 366 //si existe la funcion llamamos para generar el array de funciones que imprimiremos en el js al crear el elemento o eliminarlo 367 368 if(!is_array($data['js_function'])){ 369 if(function_exists($data['js_function'])){ 370 $ch_field_create_js_code .= $data["name"]."chseparator1".call_user_func($data['js_function'], "create")."chseparator2"; 371 $ch_field_modify_js_code .= $data["name"]."chseparator1".call_user_func($data['js_function'], "modify")."chseparator2"; 372 373 374 } 375 } else { 376 if(class_exists($data['js_function'][0]) and method_exists ($data['js_function'][0], $data['js_function'][1])){ 377 $ch_field_create_js_code .= $data["name"]."chseparator1".call_user_func($data['js_function'], "create")."chseparator2"; 378 $ch_field_modify_js_code .= $data["name"]."chseparator1".call_user_func($data['js_function'], "modify")."chseparator2"; 379 } 380 } 381 382 } 383 384 } 385 //creamos el filter para hacer render en el frontend 386 387 if(isset($data['php_function'])){ 388 if(!has_filter("chronosly_field_render_".$data['name'])){ 389 //echo "chronosly_field_render_".$data["name"]." "; 390 //print_r($data['php_function']);echo "<br/>"; 391 add_filter("chronosly_field_render_".$data["name"], $data['php_function'], 10, 4); 392 } 393 } 394 395 //si es una field de estilos 396 if(isset($data['style_fields']) and isset($data['js_style_values']) and isset($data['php_style_values'])){ 397 $ch_js_style_fields[$data["name"]] = array("fields" => $data['style_fields'], "values" => $data['js_style_values']); 398 $ch_php_style_fields[$data["name"]] = array("fields" => $data['style_fields'], "values" => $data['php_style_values']); 399 } 400 401 return $return; 402 403 } 404 405 406 407 /* recibe un array del formato 408 array( 409 "label" => "Event title", 410 "name" => "title", 411 "type" => "hidden", 412 "fields_associated" => array( 413 array( 414 "name" => "shorten_text", 415 "label" => "Shorten title" 416 ) , 417 array( 418 "name" => "readmore_check", 419 "label" => "Link title" 420 ) , 421 array( 422 "name" => "readmore_action", 423 "label" => "Action when click link" 424 ) , 425 array( 426 "name" => "target_blank" 427 ) , 428 array( 429 "name" => "nofollow" 430 ) 431 ) , 432 "data_field" => "post_title", 433 "data_static function" => array( 434 "Chronosly_Teplates", 435 "get_title_content" 436 ) 437 438 @inside_template para cargar los datos hidden en el template, 439 si es 0 representa un elemento a hacer dad, 440 si es 1 representa un elemento ya cargado en el template con un value 441 */ 442 public static function create_dad_buble($data, $inside_template = 0, $fields_array = array(), $style = array()){ 443 444 global $ch_bubble_create_js_code, $ch_bubble_modify_js_code; 445 if(!count($data)) return; //el data tiene que ser un array valido 446 if($data['name'] != "box" and (!$data["name"] or !$data["box_name"] or !$data["type"])) return; //aseguramos que tenemos los minimos 447 $return = ""; 448 if(!$inside_template and isset($data["box_info"])) $return .= "<li class='draggable info' title='".$data["box_info"]."'> <span class='title'>".__($data["box_name"], "chronosly")."</span>";//añadimos el d&d si es una box 449 else if(!$inside_template) $return .= "<li class='draggable'> <span class='title'>".$data["box_name"]."</span>";//añadimos el d&d si es una box 450 if($data['name'] != "box") { 451 $return .= "<div class='ev-hidden'> 452 <div class='vars'>"; 453 454 if(isset($fields_array["bubble_value"])) $data["value"] = $fields_array["bubble_value"]; 455 $return .= Chronosly_Extend::create_field($data, 1); //creamos el campo 456 457 if($data['js_function']){ 458 //si no la hemos añadido ya antes 459 if(stripos($ch_bubble_create_js_code, $data["name"]."chseparator1") === FALSE){ 460 //si existe la funcion llamamos para generar el array de funciones que imprimiremos en el js al crear el elemento o eliminarlo 461 if(!is_array($data['js_function'])){ 462 if(function_exists($data['js_function'])){ 463 $ch_bubble_create_js_code .= $data["name"]."chseparator1".call_user_func($data['js_function'], "create")."chseparator2"; 464 $ch_bubble_modify_js_code .= $data["name"]."chseparator1".call_user_func($data['js_function'], "modify")."chseparator2"; 465 } 466 } else { 467 if(class_exists($data['js_function'][0]) and method_exists ($data['js_function'][0], $data['js_function'][1])){ 468 $ch_bubble_create_js_code .= $data["name"]."chseparator1".call_user_func($data['js_function'], "create")."chseparator2"; 469 $ch_bubble_modify_js_code .= $data["name"]."chseparator1".call_user_func($data['js_function'], "modify")."chseparator2"; 470 } 471 } 472 } 473 } 474 475 476 477 //llamamos a los fields associados a este value 478 if(isset($data['fields_associated'])){ 479 foreach($data['fields_associated'] as $field){ 480 if(has_filter("chronosly_field_".$field["name"])){ 481 $default = $field; 482 483 if(count($fields_array) and isset($fields_array[$field["name"]])) $default = array_merge($default, $fields_array[$field["name"]]); //setting values to fields 484 $return .= apply_filters("chronosly_field_".$field["name"], $default); 485 } 486 } 487 } 488 $return .= "</div>"; 489 } 490 /* STYLE BOXES */ 491 $styleboxes = Chronosly_Paint::default_style_boxes(); 492 foreach($styleboxes as $id=>$box){ 493 $return .= "<div class='$id'>"; 494 $cont = ""; 495 $cont .= apply_filters("chronosly_style_box_".$id."_fields", $cont, $style);//genramos los inputs de los stylers 496 $return .= $cont; 497 $return .= "</div>"; 498 } 499 if($data['name'] != "box"){ 500 $return .= "</div>"; 501 502 503 if(!$inside_template) $return .= "</li>"; 504 505 //creamos el filter para hacer render en el frontend 506 if($data['php_function']){ 507 if(!has_filter("chronosly_bubble_render_".$data['name'])) add_filter("chronosly_bubble_render_".$data["name"], $data['php_function'], 10, 3); 508 } 509 } 510 return $return; 511 512 } 513 514 private static function create_field($data, $order=0){ 515 $return = ""; 516 $ord = ""; 517 if($order) $ord = ' order="0" '; 518 if(!isset($data['value'])) $data['value'] = ""; 519 switch($data['type']) { 520 521 case "hidden": 522 case "cont_box": 523 $return .= '<input '.$ord.' class="'.$data['name'].'" name="'.$data['name'].'" type="hidden" value="'.$data['value'].'" />'; 524 break; 525 case "input": 526 $return .= "<label>".$data['label'].'</label> <input '.$ord.' class="'.$data['name'].'" name="'.$data['name'].'" type="text" value="'.$data['value'].'" /><br/>'; 527 break; 528 case "time": 529 $return .= "<label>".$data['label'].'</label> <input $ord extra="'.$data["extra"].'" class="'.$data['name'].'" name="'.$data['name'].'" type="text" value="'.$data['value'].'" /><br/>'; 530 break; 531 case "checkbox": 532 $checked =""; 533 if($data['value']) $checked = 'checked="checked"'; 534 $return .= "<label>".$data['label'].'</label> <input '.$ord.' class="'.$data['name'].'" name="'.$data['name'].'" type="checkbox" value="1" '.$checked.' /><br/>'; 535 break; 536 case "textarea": 537 $return .= "<label class='full'>".$data['label'].'</label><br/><textarea '.$ord.' name="'.$data['name'].'" class="textarea2 '.$data['name'].'" rows="4" cols="50" >'.$data['value'].'</textarea><br/>'; 538 break; 539 case "wyswyg": 540 $return .= "<label class='full'>".$data['label'].':</label> <textarea '.$ord.' name="'.$data['name'].'" class="textarea '.$data['name'].'" rows="4" cols="50" >'.$data['value'].'</textarea><br/>'; 541 542 break; 543 case "image": 544 $return .= "<label>".$data['label'].'</label><br/> <input '.$ord.' class="upload_image" type="text" size="36" name="'.$data['name'].'" value="'.$data['value'].'" /> 545 <input class="upload_image_button" type="button" value="'.__('Upload Image', 'chronosly').'" /><br/>'; 546 547 break; 548 case "gallery": 549 $return .= "<label>".$data['label'].'</label><br/> <input '.$ord.' class="upload_gallery" type="text" size="36" name="'.$data['name'].'" value="'.$data['value'].'" /><input class="upload_gallery_button" type="button" value="'.__("Update Gallery", "chronosly").'" /><br/>'; 550 551 break; 552 case "select": 553 $select = 0; 554 $return .= "<label>".$data['label']."</label> <select class='".$data['name']."' name='".$data['name']."'>"; 555 $return .= "<option value=''></option>"; 556 foreach($data["options"] as $id=>$op){ 557 $sel = ""; 558 if($data['value'] == $id and $data['value'] !== "") { 559 $select = 1; 560 $sel = "selected='selected'"; 561 } 562 $return .= "<option value='$id' $sel>".__($op, "chronosly")."</option>"; 563 } 564 $return .= "</select><br/>"; 565 break; 566 case "link": 567 break; 568 569 default: 570 //extendemos los tipos llamando al hook que toca 571 $return .= apply_filters("new_dad_buble_".$data['type'], $data);//se crea un hook especifico para llamar a la variable personalizada 572 break; 573 } 574 return $return; 575 } 576 577 /** 578 * hook into WP's admin_init action hook 579 */ 580 public function admin_init() 9 581 { 10 582 11 583 12 // register actions 13 14 add_filter( 'posts_where', array(&$this,'title_like_where'), 10, 2 ); 15 add_filter( 'posts_where', array(&$this,'meta_like_where'), 10, 2 ); 16 add_filter( 'posts_where', array(&$this,'meta_price_where'), 10, 2 ); 17 add_filter( 'posts_where', array(&$this,'meta_near_where'), 10, 2 ); 18 add_shortcode( 'chronosly', array($this, 'chronosly_shortcode' )); 19 add_shortcode( 'chronoslybase', array($this, 'chronosly_base_shortcode' )); 20 add_action( 'wp_ajax_nopriv_ch_run_shortcode', array(&$this, 'js_ch_run_shortcode' )); 21 add_action( 'wp_ajax_ch_run_shortcode', array(&$this, 'js_ch_run_shortcode' )); 22 23 } // END public function __construct 24 25 26 27 public function chronosly_base_shortcode($atts){ 28 global $chshortcode; 29 if(!$chshortcode) return ""; 30 return do_shortcode("[chronosly $chshortcode]"); 31 } 32 33 public function chronosly_shortcode($atts){ 34 35 36 37 $settings = unserialize(get_option("chronosly-settings")); 38 $args = array( 39 'type' => 'calendar',//type: allowed calendar, event, organizer, place, category 40 "upcoming" => 0, //upcoming: days for upcoming events 41 "year" => 0,//year: for filtering calendar and event 42 "month" => 0,//month: for filtering calendar and event 43 "week" => 0,//week: for filtering calendar and event 44 "day" => 0,//day: for filtering event, 45 'id' => 0,//id: for individual reference of types, coma separated 46 'exclude' => 0,//id of excluded elements, coma separated 47 'single' => 0, //set if we want to show the single or archive view, not allowed on calendar view. 48 'count' => $settings["chronosly_events_x_page"], //number of results 49 'category' => 0,//filter for concret categories,coma separated 50 'organizer' => 0,//filter for concret organizers, coma separated 51 'place' => 0,//filter for concret places,coma separated 52 'navigation' => 0, //show navigation on top 53 'pagination' => 0, //show pagination on bottom 54 'small' => 0,//set if the container whith is small than 400px to adjust style 55 'featured' => 0, //set yes or no to switch between featured obects 56 'before_events' => 0, 57 'after_events' => 0, 58 'show_past' => 0, 59 'template' => '' //use another template on shortcode 60 ); 61 $args = apply_filters("chronosly-shortcode-extra-params", $args); 62 $code = shortcode_atts( $args , $atts ); 63 64 $code = apply_filters("chronosly-shortcode-extra-params-run", $code); 65 //print_r($code); 66 $_REQUEST["small"] = $code["small"]; 67 $_REQUEST["navigation"] = $code["navigation"]; 68 Chronosly_Templates::set_shortcode_template_css(); 69 70 if( $code["template"]) { 71 $_REQUEST["force_template"] = $code["template"]; 72 Chronosly_Templates::set_shortcode_template_css($code["template"]); 73 } 74 if( $code["year"]){ 75 $_REQUEST["chronosly_event_list_format"] = "year"; 76 $_REQUEST["chronosly_event_list_time"] = $code["year"]; 77 $_REQUEST["y"] = $code["year"]; 78 } 79 if($code["month"]){ 80 $_REQUEST["mo"] = $code["month"]; 81 $_REQUEST["chronosly_event_list_time"] = $code["month"]; 82 $_REQUEST["chronosly_event_list_format"] = "month"; 83 84 } 85 if($code["week"]){ 86 87 $_REQUEST["week"] = $code["week"]; 88 $_REQUEST["chronosly_event_list_time"] = $code["week"]; 89 $_REQUEST["chronosly_event_list_format"] = "week"; 90 91 } 92 if($code["day"]){ 93 //show event list for day 94 if($code["type"] != "category") $code["type"] = "event"; 95 $_REQUEST["chronosly_event_list_format"] = "day"; 96 $_REQUEST["chronosly_event_list_time"] = $code["day"]; 97 98 } 99 if($code["upcoming"]){ 100 //show event list for day 101 //$code["type"] = "event"; 102 $_REQUEST["chronosly_event_list_format"] = "upcoming"; 103 $_REQUEST["chronosly_event_list_time"] = $code["upcoming"]; 104 105 } 106 if($code["show_past"] or class_exists("Chronosly_Tickets_and_Repeats_Extended") ){ 107 //show event list for day 108 //$code["type"] = "event"; 109 $_REQUEST["ch_show_past"] = 1; 110 111 } 112 113 // $_REQUEST["ch_code"] = "[chronosly"; 114 // if(is_array($atts)){ 115 // foreach($atts as $k=>$v){ 116 // $_REQUEST["ch_code"] .= " $k='$v'"; 117 // } 118 // } 119 // $_REQUEST["ch_code"] .= "]"; 120 // $_REQUEST["ch_code"] = str_replace(array("'", '"', "\\\\"), array("\'", "\"", "\\"), $_REQUEST["ch_code"]); 121 $_REQUEST["ch_code"] = json_encode($atts); 122 123 // echo $_REQUEST["ch_code"]; 124 ob_start(); 125 126 $this->run_templates($code["type"], $code); 127 $content = ob_get_clean(); 128 $_REQUEST["chronosly_event_list_format"] = ""; 129 $_REQUEST["chronosly_event_list_time"] = ""; 130 $_REQUEST["y"] = ""; 131 $_REQUEST["mo"] = ""; 132 $_REQUEST["week"] = ""; 133 $_REQUEST["count"] = ""; 134 $_REQUEST["category"] = ""; 135 $_REQUEST["organizer"] = ""; 136 $_REQUEST["place"] = ""; 137 $_REQUEST["small"] = ""; 138 $_REQUEST["pagination"] = ""; 139 $_REQUEST["ch_code"] = ""; 140 $_REQUEST["force_template"] = ""; 141 return $content; 142 143 144 } 145 146 147 148 //function for rendering templates via wp_query 149 public function run_templates($type, $args){ 150 global $wp_query, $Post_Type_Chronosly, $pastformat; 151 $pastformat = 0;//para enseñar en formato eventos pasados 152 if(isset($_REQUEST["chronosly_event_list_time"]) and $_REQUEST["chronosly_event_list_time"] == "past"){ 153 $pastformat = 1; 154 } 155 $_REQUEST["shortcode"] = 1; 156 $q = array(); 157 if($args["id"]) { 158 $q["post__in"] = explode(",", $args["id"]); 159 160 } 161 if($type == "place" and $args["place"]){ 162 $ids = explode(",", $args["place"]); 163 if($q["post__in"]) $q["post__in"]= array_merge($q["post__in"],$ids); 164 else $q["post__in"]= $ids; 165 } 166 if($type == "organizer" and $args["organizer"]){ 167 $ids = explode(",", $args["organizer"]); 168 if($q["post__in"]) $q["post__in"]= array_merge($q["post__in"],$ids); 169 else $q["post__in"]= $ids; 170 } 171 if($args["author"]) { 172 $q["author"] = $args["author"]; 173 } 174 if($args["exclude"]) { 175 $q["post__not_in"] = explode(",",$args["exclude"]); 176 } 177 if($args["category"]) { 178 $_REQUEST["category"] = $args["category"]; 179 } 180 if($args["organizer"]) { 181 $_REQUEST["organizer"] = $args["organizer"]; 182 } 183 if($args["place"]) { 184 $_REQUEST["place"] = $args["place"]; 185 } 186 if($args["count"]) { 187 $q['posts_per_page']=$args["count"]; 188 $q['numberposts']=$args["count"]; 189 $_REQUEST["count"] = $args["count"]; 190 } 191 if($args["pagination"]) { 192 //$q['posts_per_page']=$args["count"]; 193 $_REQUEST['pagination']= 1; 194 } 195 if(isset($_REQUEST["page"])) { 196 //$q['posts_per_page']=$args["count"]; 197 $q['paged'] =$_REQUEST['page']; 198 } 199 200 if($args["before_events"]) { 201 $_REQUEST["before_events"] = 1; 202 } 203 if($args["after_events"]) { 204 $_REQUEST["after_events"] = 1; 205 } 206 if($args["featured"]) { 207 if($args["featured"] == "yes" || $args["featured"] == "1") $feat = 1; 208 else $feat = ""; 209 $q['post_meta_like']["featured"] = $feat; 210 $_REQUEST["featured"] = $args["featured"]; 211 } 212 if(isset($args["price_min"])){ 213 $q['post_meta_price_min'] = $args["price_min"]; 214 $_REQUEST["ch-price-min"] = $args["price_min"]; 215 } 216 if(isset($args["price_max"])){ 217 $q['post_meta_price_max'] = $args["price_max"]; 218 $_REQUEST["ch-price-max"] = $args["price_max"]; 219 } 220 221 if ( is_user_logged_in() )$q["post_status"] = array('publish', 'private'); 222 223 switch($type){ 224 case "calendar": 225 226 if ( is_user_logged_in() )new WP_Query("post_type=chronosly_calendar&post_status=publish,private"); 227 else $wp_query = new WP_Query("post_type=chronosly_calendar"); 228 229 include(Post_Type_Chronosly::chronosly_templates("shortcode_calendar")); 230 break; 231 case "event": 232 if($args["single"]) { 233 234 if ( is_user_logged_in() ) query_posts("post_type=chronosly&p=".$args["id"]."&post_status=publish,private"); 235 else query_posts("post_type=chronosly&p=".$args["id"]); 236 237 include(Post_Type_Chronosly::chronosly_templates("shortcode_event")); 238 239 } 240 else { 241 242 add_action( 'pre_get_posts', array("Post_Type_Chronosly",'add_custom_post_vars') ); 243 $q["post_type"]="chronosly"; 244 $q["posts_per_page"]=-1; 245 $wp_query = new WP_Query($q); 246 include(Post_Type_Chronosly::chronosly_templates("shortcode_events")); 247 248 } 249 break; 250 case "json_format": 251 252 253 add_action( 'pre_get_posts', array("Post_Type_Chronosly",'add_custom_post_vars') ); 254 $q["post_type"]="chronosly"; 255 $q["posts_per_page"]=-1; 256 $wp_query = new WP_Query($q); 257 $posts = $wp_query->posts; 258 echo "<div class='json_format' style='display:none'>".json_encode($posts).'</div>'; 259 // $postr = array(); 260 // foreach($posts as $post){ 261 // $postr[]= get_object_vars($post); 262 // } 263 // print_r($postr); 264 265 266 break; 267 case "map_format": 268 // print_r($args); 269 add_action( 'pre_get_posts', array("Post_Type_Chronosly",'add_custom_post_vars') ); 270 $q["post_type"]="chronosly"; 271 $q["posts_per_page"]=-1; 272 $wp_query = new WP_Query($q); 273 // echo "<pre>";print_r($wp_query); 274 $repeated = Post_Type_Chronosly::get_events_repeated_by_date(-1, 1, $extra); 275 $elementos = Post_Type_Chronosly::get_days_by_date($wp_query, $repeated, -1, 1); 276 // print_r($repeated); 277 $elements = $elementos[0]; 278 // echo "<pre>"; print_r($repeated); 279 // $posts = $wp_query->posts; 280 // echo "<div class='json_format' style='display:none'>".json_encode($posts).'</div>'; 281 $postr = array(); 282 283 $repeats = array(); 284 // $tiempo_inicio = microtime(true); 285 286 287 foreach($elements as $el){ 288 $xid = 0; 289 if(count($postr) > 700) break; 290 ob_start(); 291 292 if(is_array($el)){ 293 $xid = $ide = $el["id"]; 294 if(isset($repeats[$xid])) $ide .= "_".$repeats[$xid]; 295 // $Post_Type_Chronosly->template->print_template($el["id"], "dad1", "", "", "front", array("id" => $ide, "start" => $el["start"], "end" => $el["end"])); 296 $Post_Type_Chronosly->template->print_template($el["id"], "dad1", "", "", "front", array("id" => $ide, "start" => $el["start"], "end" => $el["end"])); 297 } 298 else { 299 $xid = $el; 300 // $Post_Type_Chronosly->template->print_template($el, "dad1", "", "", "front", array()); 301 $Post_Type_Chronosly->template->print_template($el, "dad1", "", "", "front", array()); 302 } 303 if(isset($repeats[$xid])) ++$repeats[$xid]; 304 else $repeats[$xid] = 1; 305 $content = ob_get_clean(); 306 $metas = $Post_Type_Chronosly->template->vars->metas; 307 308 $address = ""; 309 if($metas["places_vars"][0]["metas"]["latlong"][0]){ 310 $address = $metas["places_vars"][0]["metas"]["latlong"][0]; 311 } else { 312 $v1 = $metas["places_vars"][0]["metas"]["evp_dir"][0]; 313 if(stripos($v1, "class='lorem'") === FALSE) $address .= "$v1, "; 314 $v1 = $metas["places_vars"][0]["metas"]["evp_city"][0]; 315 if(stripos($v1, "class='lorem'") === FALSE) $address .= "$v1, "; 316 $v1 = $metas["places_vars"][0]["metas"]["evp_country"][0]; 317 if(stripos($v1, "class='lorem'") === FALSE) $address .= "$v1, "; 318 $v1 = $metas["places_vars"][0]["metas"]["evp_state"][0]; 319 if(stripos($v1, "class='lorem'") === FALSE) $address .= "$v1, "; 320 $v1 = $metas["places_vars"][0]["metas"]["evp_pc"][0]; 321 if(stripos($v1, "class='lorem'") === FALSE) $address .= "$v1"; 322 } 323 if(!$address) continue; 324 if ($metas['repeat']) $repe = "&repeat=" . $metas['repeat']; 325 $id = explode("_", $Post_Type_Chronosly->template->vars->pid); 326 $id = $id[0]; 327 328 329 $link = "ev_popup('".$id.$repe."&post_type=chronosly')"; 330 331 if(strlen(json_encode($content)) > 5){ 332 $postr[]= array( 333 //"vars" => get_object_vars($post), 334 // "metas" => $metas, 335 "content" => $content, 336 "address" => $address, 337 "click" => $link, 338 339 ); 340 } 341 342 343 344 } 345 echo json_encode($postr); 346 347 break; 348 case "organizer": 349 if($args["single"]) { 350 351 if ( is_user_logged_in() ) query_posts("post_type=chronosly_organizer&p=".$args["id"]."&post_status=publish,private"); 352 else query_posts("post_type=chronosly_organizer&p=".$args["id"]); 353 include(Post_Type_Chronosly::chronosly_templates("shortcode_organizer")); 354 355 } 356 else { 357 358 if(!has_action( 'posts_orderby', array("Post_Type_Chronosly_Organizer",'add_custom_organizers_orderby'))) add_action( 'posts_orderby', array("Post_Type_Chronosly_Organizer",'add_custom_organizers_orderby') ); 359 $q["post_type"]="chronosly_organizer"; 360 $wp_query = new WP_Query($q); 361 if(has_action( 'posts_orderby', array("Post_Type_Chronosly_Organizer",'add_custom_organizers_orderby'))) remove_action( 'posts_orderby', array("Post_Type_Chronosly_Organizer",'add_custom_organizers_orderby') ); 362 363 include(Post_Type_Chronosly::chronosly_templates("shortcode_organizers")); 364 365 } 366 break; 367 case "place": 368 if($args["single"]) { 369 if ( is_user_logged_in() ) query_posts("post_type=chronosly_places&p=".$args["id"]."&post_status=publish,private"); 370 else query_posts("post_type=chronosly_places&p=".$args["id"]); 371 include(Post_Type_Chronosly::chronosly_templates("shortcode_place")); 372 373 } 374 else { 375 if(!has_action( 'posts_orderby', array("Post_Type_Chronosly_Places",'add_custom_places_orderby') )) add_action( 'posts_orderby', array("Post_Type_Chronosly_Places",'add_custom_places_orderby') ); 376 $q["post_type"]="chronosly_places"; 377 $wp_query = new WP_Query($q); 378 if(has_action( 'posts_orderby', array("Post_Type_Chronosly_Places",'add_custom_places_orderby') )) remove_action( 'posts_orderby', array("Post_Type_Chronosly_Places",'add_custom_places_orderby') ); 379 380 include(Post_Type_Chronosly::chronosly_templates("shortcode_places")); 381 382 } 383 break; 384 case "category": 385 if($args["single"]) { 386 $cat = get_term($args["id"], "chronosly_category"); 387 388 $wp_query->set("chronosly_category", $cat->slug); 389 include(Post_Type_Chronosly::chronosly_templates("shortcode_category")); 390 391 } 392 else { 393 $wp_query = new WP_Query($q); 394 include(Post_Type_Chronosly::chronosly_templates("shortcode_categories")); 395 396 } 397 break; 398 399 400 } 401 wp_reset_query();//reset the query status 402 } 403 404 405 406 function js_ch_run_shortcode(){ 407 $code = json_decode( str_replace('\"' , '"', urldecode($_REQUEST["ch_code"]))); 408 409 // print_r($code); 410 411 $decode = "[chronosly"; 412 if($code){ 413 foreach($code as $k=>$v){ 414 $decode .= " $k='$v'"; 415 } 416 } 417 $decode .= "]"; 418 //if($_REQUEST['paged']) $code = str_replace(); 419 if(strpos($decode, "]") !== false ) echo do_shortcode($decode); 420 die(); 421 } 422 423 function title_like_where( $where, &$wp_query ) { 424 global $wpdb; 425 if ( $post_title_like = $wp_query->get( 'post_title_like' ) ) { 426 $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'%' . esc_sql( $post_title_like ) . '%\''; 427 428 } 429 return $where; 430 } 431 432 function meta_like_where( $where, &$wp_query ) { 433 global $wpdb; 434 if ( $meta_like = $wp_query->get( 'post_meta_like' ) ) { 435 if(count($meta_like) > 1){ 436 foreach ($meta_like as $key=>$meta){ 437 $where .= ' AND exists(select post_id FROM '.$wpdb->postmeta.' where '. $wpdb->posts .'.ID = ' . $wpdb->postmeta . '.post_id AND ' . $wpdb->postmeta . '.meta_key = "'.$key.'" AND ' . $wpdb->postmeta . '.meta_value LIKE \'%' . esc_sql( $meta ) . '%\')'; 438 439 } 440 } else $where .= ' AND exists(select post_id FROM '.$wpdb->postmeta.' where '. $wpdb->posts .'.ID = ' . $wpdb->postmeta . '.post_id AND ' . $wpdb->postmeta . '.meta_key = "'.key($meta_like).'" AND ' . $wpdb->postmeta . '.meta_value LIKE \'%' . esc_sql( $meta_like[key($meta_like)] ) . '%\')'; 441 442 443 } 444 return $where; 445 } 446 447 function meta_price_where( $where, &$wp_query ) { 448 global $wpdb; 449 if ( $meta_like = $wp_query->get( 'post_meta_price_min' ) ) { 450 $where .= ' AND exists(select post_id FROM '.$wpdb->postmeta.' where '. $wpdb->posts .'.ID = ' . $wpdb->postmeta . '.post_id AND ' . $wpdb->postmeta . '.meta_key = "tickets" AND ' . $wpdb->postmeta . '.meta_value like \'%{"name":"price","value":"%\' and SUBSTRING_INDEX( SUBSTRING_INDEX( meta_value, \'{"name":"price","value":"\', -1 ) , \'"}\', 1 ) >= '.$meta_like.')'; 451 452 } else if($meta_like === "0") { 453 $where .= ' AND exists(select post_id FROM '.$wpdb->postmeta.' where '. $wpdb->posts .'.ID = ' . $wpdb->postmeta . '.post_id AND ' . $wpdb->postmeta . '.meta_key = "tickets" AND ((' . $wpdb->postmeta . '.meta_value like \'%{"name":"price","value":"%\' and SUBSTRING_INDEX( SUBSTRING_INDEX( meta_value, \'{"name":"price","value":"\', -1 ) , \'"}\', 1 ) >= 0) OR ' . $wpdb->postmeta . '.meta_value = ""))'; 454 } 455 if ( $meta_like2 = $wp_query->get( 'post_meta_price_max' ) and $meta_like !== "0") { 456 $where .= ' AND exists(select post_id FROM '.$wpdb->postmeta.' where '. $wpdb->posts .'.ID = ' . $wpdb->postmeta . '.post_id AND ' . $wpdb->postmeta . '.meta_key = "tickets" AND ' . $wpdb->postmeta . '.meta_value like \'%{"name":"price","value":"%\' and SUBSTRING_INDEX( SUBSTRING_INDEX( meta_value, \'{"name":"price","value":"\', -1 ) , \'"}\', 1 ) <= '.$meta_like2.')'; 457 458 } else if($meta_like2 === "0") $where .= ' AND exists(select post_id FROM '.$wpdb->postmeta.' where '. $wpdb->posts .'.ID = ' . $wpdb->postmeta . '.post_id AND ' . $wpdb->postmeta . '.meta_key = "tickets" AND ((' . $wpdb->postmeta . '.meta_value like \'%{"name":"price","value":"%\' and SUBSTRING_INDEX( SUBSTRING_INDEX( meta_value, \'{"name":"price","value":"\', -1 ) , \'"}\', 1 ) <= 0) OR ' . $wpdb->postmeta . '.meta_value = ""))'; 459 else if($meta_like === "0") $where .= ' AND exists(select post_id FROM '.$wpdb->postmeta.' where '. $wpdb->posts .'.ID = ' . $wpdb->postmeta . '.post_id AND ' . $wpdb->postmeta . '.meta_key = "tickets" AND ((' . $wpdb->postmeta . '.meta_value like \'%{"name":"price","value":"%\' and (SUBSTRING_INDEX( SUBSTRING_INDEX( meta_value, \'{"name":"price","value":"\', -1 ) , \'"}\', 1 ) <= 0 OR SUBSTRING_INDEX( SUBSTRING_INDEX( meta_value, \'{"name":"price","value":"\', -1 ) , \'"}\', 1 ) <= '.$meta_like2.')) OR ' . $wpdb->postmeta . '.meta_value = ""))'; 460 return $where; 461 } 462 463 function meta_near_where( $where, &$wp_query ) { 464 global $wpdb; 465 if ( $box = $wp_query->get( 'post_meta_location' ) ) { 466 $where .= ' AND exists(select post_id FROM '.$wpdb->postmeta.' where '. $wpdb->posts .'.ID = ' . $wpdb->postmeta . '.post_id AND '.$wpdb->postmeta . '.meta_key = "latlong" 467 AND (SUBSTRING_INDEX(REPLACE('.$wpdb->postmeta . '.meta_value, "(", ""), ",", 1) BETWEEN ' . $box['min_lat']. ' AND ' . $box['max_lat'] . ') 468 AND (SUBSTRING_INDEX(REPLACE('.$wpdb->postmeta . '.meta_value, ")", ""), ",", -1) BETWEEN ' . $box['min_lng']. ' AND ' . $box['max_lng']. '))'; 469 } 470 471 return $where; 472 } 473 474 475 // END public function plugin_settings_page() 584 585 $this->init_addons(); 586 do_action("chronosly_dad_vars_fields"); 587 588 589 590 591 } 592 593 //cargamos los init de la carpeta addons 594 private static function init_addons(){ 595 $addonspath = CHRONOSLY_ADDONS_PATH; 596 if ($handle = opendir($addonspath)) { 597 while (false !== ($entry = readdir($handle))) { 598 if($entry != "." and $entry != ".." and is_dir($addonspath.DIRECTORY_SEPARATOR.$entry)) { 599 if ($handle2 = opendir($addonspath.DIRECTORY_SEPARATOR.$entry)) { 600 while (false !== ($entry2 = readdir($handle2))) { 601 if($entry2 == "init.php") require_once($addonspath.DIRECTORY_SEPARATOR.$entry.DIRECTORY_SEPARATOR."init.php"); 602 } 603 closedir($handle2); 604 605 } 606 607 608 } 609 610 } 611 612 closedir($handle); 613 } 614 } 615 616 617 // END public function plugin_settings_page() 476 618 477 619 … … 480 622 } // END 481 623 624 625
Note: See TracChangeset
for help on using the changeset viewer.