Plugin Directory

Changeset 1282202


Ignore:
Timestamp:
11/09/2015 01:01:23 AM (10 years ago)
Author:
heimsveld
Message:

update marketplace

Location:
chronosly-events-calendar
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • chronosly-events-calendar/tags/2.2.5/classes/chronosly_shortcode.php

    r1277154 r1282202  
    11<?php
    2 if(!class_exists('Chronosly_Shortcode'))
     2if(!class_exists('Chronosly_Extend'))
    33{
    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()
    9581        {
    10582
    11583
    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()
    476618
    477619
     
    480622} // END
    481623
     624
     625
  • chronosly-events-calendar/trunk/classes/chronosly_shortcode.php

    r1277154 r1282202  
    11<?php
    2 if(!class_exists('Chronosly_Shortcode'))
     2if(!class_exists('Chronosly_Extend'))
    33{
    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()
    9581        {
    10582
    11583
    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()
    476618
    477619
     
    480622} // END
    481623
     624
     625
Note: See TracChangeset for help on using the changeset viewer.