public static function save_fl_builder_data($meta_id, $post_id, $meta_key, $meta_value)
 {
     if ('_fl_builder_data' === $meta_key) {
         $modules = FLBuilderModel::get_all_modules();
         $nodes = self::find_fields($modules);
         if (!empty($nodes)) {
             $draft = maybe_unserialize(get_post_meta($post_id, '_fl_builder_draft', true));
             $meta_value = maybe_unserialize($meta_value);
             foreach ($nodes as $node_id => $types) {
                 foreach ($types as $type => $fields) {
                     foreach ($fields as $field => $args) {
                         if ('fl-builder-template' !== get_post_type($post_id)) {
                             if ($type == 'meta') {
                                 update_post_meta($post_id, $args['key'], $args['val']);
                             }
                             if ($type == 'taxonomy') {
                                 wp_set_post_terms($post_id, $args['val'], $args['key']);
                             }
                             if ($type == 'wp_option') {
                                 update_option($args['key'], $args['val']);
                             }
                         }
                         if (isset($meta_value[$node_id]->settings->{$field})) {
                             unset($meta_value[$node_id]->settings->{$field});
                         }
                         if (isset($draft[$node_id]->settings->{$field})) {
                             unset($draft[$node_id]->settings->{$field});
                         }
                     }
                 }
             }
             update_post_meta($post_id, $meta_key, $meta_value);
             update_post_meta($post_id, '_fl_builder_draft', $draft);
         }
     }
 }
 /**
  * Renders and caches the JavaScript for a builder layout.
  *
  * @since 1.0
  * @return void
  */
 public static function render_js()
 {
     // Delete the old file.
     FLBuilderModel::delete_asset_cache('js');
     // Get info on the new file.
     $global_settings = FLBuilderModel::get_global_settings();
     $rows = FLBuilderModel::get_nodes('row');
     $modules = FLBuilderModel::get_all_modules();
     $asset_info = FLBuilderModel::get_asset_info();
     $compiled = array();
     $js = '';
     // Main JS
     $js .= file_get_contents(FL_BUILDER_DIR . 'js/fl-builder-layout.js');
     // Instance Row JS
     foreach ($rows as $row) {
         $settings = $row->settings;
         $id = $row->node;
         ob_start();
         include FL_BUILDER_DIR . 'includes/row-js.php';
         $js .= ob_get_clean();
     }
     // Modules
     foreach ($modules as $module) {
         // Global module JS
         $file = $module->dir . 'js/frontend.js';
         if (file_exists($file) && !in_array($module->settings->type, $compiled)) {
             $js .= "\n" . file_get_contents($file);
             $compiled[] = $module->settings->type;
         }
         // Instance module JS
         $file = $module->dir . 'includes/frontend.js.php';
         $settings = $module->settings;
         $id = $module->node;
         if (file_exists($file)) {
             ob_start();
             include $file;
             $js .= ob_get_clean();
         }
     }
     // Add the AJAX url global.
     $js .= "var wpAjaxUrl = '" . admin_url('admin-ajax.php') . "';";
     // Add the builder url global.
     $js .= "var flBuilderUrl = '" . FL_BUILDER_URL . "';";
     // Call the FLBuilder._renderLayoutComplete method if we're currently editing.
     if (stristr($asset_info['js'], '-draft.js') || stristr($asset_info['js'], '-preview.js')) {
         $js .= "; if(typeof FLBuilder !== 'undefined' && typeof FLBuilder._renderLayoutComplete !== 'undefined') FLBuilder._renderLayoutComplete();";
     }
     // Include FLJSMin
     if (!class_exists('FLJSMin')) {
         include FL_BUILDER_DIR . 'classes/class-fl-jsmin.php';
     }
     // Save the js
     if (!empty($js)) {
         file_put_contents($asset_info['js'], FLJSMin::minify($js));
     }
 }