hide_div_container(); // setto il div if (isset($_REQUEST['dbp_div_id'])) { $divid = sanitize_text_field($_REQUEST['dbp_div_id']); $list->set_uniqid($divid); } } if (!$show_trappings) { // Faccio finta che la form è stata già create $list->block_opened = true; $list->frontend_view_setting['table_sort'] = false; } if ( $list->get_frontend_view('type', 'TABLE_BASE') == "TABLE_BASE") { ADFO_fn::remove_hide_columns($list->table_model); ob_start(); $show_table = true; if (isset($list->frontend_view_setting['checkif']) && $list->frontend_view_setting['checkif'] == 1 && isset($list->frontend_view_setting['if_textarea']) && $list->frontend_view_setting['if_textarea'] != '') { $show_table = (boolean)trim(PinaCode::math_and_logic($list->frontend_view_setting['if_textarea'])); } if ($show_table) { //draw_export_btn if ($list->get_frontend_view('table_export') != '' && $show_trappings) { $list->export_btn(); } if ($list->get_frontend_view('table_search') == 'simple' && $show_trappings) { $list->search(); } if (in_array($list->get_frontend_view('table_pagination_position'), ["up",'both']) && $show_trappings) { $list->pagination(); } if (($list->no_result == '' || empty($list->no_result)) || count($list->table_model->items) > 1) { $list->table(); } else { echo wp_kses_post($list->no_result); } if (in_array($list->get_frontend_view('table_pagination_position'), ["down",'both']) && $show_trappings) { $list->pagination(); } if ($show_trappings) { $list->end(); } } else { if ($list->get_frontend_view('table_update') != "none") { ob_start() ; $list->open_block(false); $result[] = ob_get_clean(); ob_start(); $list->search(); $search = ob_get_clean(); PinaCode::set_var('html.search', $search); ob_start(); $list->pagination(); $pagination = ob_get_clean(); PinaCode::set_var('html.pagination', $pagination); } else { PinaCode::set_var('html.pagination', ''); PinaCode::set_var('html.search', ''); } ob_start(); $list->table(); $table = ob_get_clean(); PinaCode::set_var('html.table', $table); PinaCode::set_var('html.no_result', $list->no_result); PinaCode::set_var('data', $list->table_model->items); echo wp_kses_post(PinaCode::execute_shortcode($list->frontend_view_setting['content_else'])); } PinaCode::set_var('global', $ori_globals); PinaCode::set_var('params', $ori_params); if ($show_trappings) { ADFO_fn::set_close_form(); } return ob_get_clean(); } else { // EDITOR $result = []; $items = $list->table_model->items; $text = $list->get_frontend_view('content'); if ($list->get_frontend_view('table_update') != "none") { ob_start() ; $list->open_block(false); $result[] = ob_get_clean(); ob_start(); $list->search(); $search = ob_get_clean(); PinaCode::set_var('html.search', $search); } else { PinaCode::set_var('html.search', ''); } if (is_array($items)) { $table_header = reset($list->table_model->items); $first_row = array_shift($items); $first_row = array_map(function($el) {return $el->name;}, $first_row); PinaCode::set_var('total_row', absint($list->table_model->get_count())); PinaCode::set_var('key',0); $first_row = ADFO_fn::remove_hide_columns_in_row($table_header, $first_row); PinaCode::set_var('data', $first_row); if ($list->get_frontend_view('table_update') != "none") { ob_start(); $list->pagination(); $pagination = ob_get_clean(); PinaCode::set_var('html.pagination', $pagination); } else { PinaCode::set_var('html.pagination', ''); } } if (!is_array($items) || !$show_trappings) { PinaCode::set_var('total_row', 0); PinaCode::set_var('key',0); PinaCode::set_var('data', []); PinaCode::set_var('html.pagination', ''); PinaCode::set_var('html.search', ''); } $result[] = PinaCode::execute_shortcode($list->get_frontend_view('content_header')); if (is_array($items) && $text != "") { foreach ($items as $key=> $item) { //PinaCode::set_var('primaries', ADFO_fn::data_primaries_values( $primaries, $table_header, $item)); PinaCode::set_var('key', ($key+1)); //$item = ADFO_fn::remove_hide_columns_in_row($table_header, $item); PinaCode::set_var('data', $item); // aggiungo i value e converto i dati foreach ($item as $k=>$i) { } $temp = PinaCode::execute_shortcode($text); if (is_array($temp)) { $result[] = json_encode($temp); } else { $result[] = $temp; } } } PinaCode::set_var('data', []); $result[] = PinaCode::execute_shortcode($list->get_frontend_view('content_footer')); if ($list->get_frontend_view('table_update') != "none") { ob_start() ; $list->end(); $result[] = ob_get_clean(); } if (isset($list->frontend_view_setting['popup_type']) && isset($list->frontend_view_setting['popup_type']) != '') { foreach ($result as &$res) { $res = str_replace("js-dbp-popup", "js-dbp-popup js-dbp-popup-mode-".$list->frontend_view_setting['popup_type'], $res); } } PinaCode::set_var('global', $ori_globals); PinaCode::set_var('params', $ori_params); if ($show_trappings) { ADFO_fn::set_close_form(); } return implode("",$result); } if ($show_trappings) { ADFO_fn::set_close_form(); } PinaCode::set_var('global', $ori_globals); PinaCode::set_var('params', $ori_params); } /** * Ritorna la pagina per un singolo articolo * @param int $dbp_id * @param int|array $ids */ static function get_single($dbp_id, $ids) { ob_start(); $dbp_post = ADFO_functions_list::get_post_dbp($dbp_id); if ($dbp_post == false) { return ob_get_clean(); } $result = self::get_detail($dbp_id, $ids, false); if ($result === false) { return ob_get_clean(); } if (isset($dbp_post->post_content['frontend_view']['detail_type']) && $dbp_post->post_content['frontend_view']['detail_type'] == "PHP") { do_action('dbp_detail_'.$dbp_id, $result); } else if (isset($dbp_post->post_content['frontend_view']['detail_type']) && $dbp_post->post_content['frontend_view']['detail_type'] == "CUSTOM") { $detail_template = $dbp_post->post_content['frontend_view']['detail_template']; PinaCode::set_var('data', $result) ; $ris = PinaCode::execute_shortcode($detail_template); if (is_array($ris) || is_object($ris)) { echo wp_unslash(json_encode($ris)); } else { echo $ris; } } else { // rimuovo eventuali chiavi primarie originali ?! $name_requests2 = self::get_primaries_id($dbp_id, false); foreach ($result as $k => $r) { if (in_array($k, $name_requests2)) { unset($result->$k); } } // stampo un detail di default ?>$r) { $set = null; if (isset($dbp_post->post_content["list_setting"][$k])) { $set = $dbp_post->post_content["list_setting"][$k]; $label = $set->title; } else { $label = $k; } ?>
post_content); } else { $table_model = new ADFO_model(); if (isset($post->post_content['sql'])) { $table_model->prepare($post->post_content['sql']); } else { $table_model = false; } } ADFO_functions_list::add_post_type_settings($table_model, $post); if ($table_model != false && $table_model->sql_type() == "select") { return $table_model->get_count(); } return -1; } /** * Carica tutte le liste dbp * @return array * ```json * {'id':'title','id':'...'} * ``` */ static function get_lists_names() { global $wpdb; $query_lists = $wpdb->get_results('SELECT ID, post_title FROM '.$wpdb->posts.' WHERE post_type ="dbp_list" AND `post_status` = "publish" ORDER BY post_title'); $lists = []; if (is_countable($query_lists)) { foreach ($query_lists as $ql) { $lists[$ql->ID] = $ql->post_title; } } return $lists; } /** * Ritorna l'elenco delle colonne di una lista * @param int $dbp_id * @param bool searchable * @param bool extend * @return ADFO_list_setting[]|array * SE extend è false * ```json * {'field_name':'field_title','field_name':'...'} * ``` * Se extend è true ADFO_list_setting[] */ static function get_list_columns($dbp_id, $searchable = true, $extend = false) { $post = ADFO_functions_list::get_post_dbp($dbp_id); if ($post == false) { return []; } /** * @var ADFO_list_setting[] $lists */ $lists = []; /** * @var ADFO_list_setting[] $list_setting */ $list_setting = []; if (!isset($post->post_content) ) { return []; } $sql = @$post->post_content['sql']; if ($sql != "") { $table_model = new ADFO_model(); $table_model->prepare($sql); $table_model->list_add_limit(0, 1); $model_items = $table_model->get_list(); if ($table_model->sql_type() == "select") { $list_setting = ADFO_functions_list::get_list_structure_config($model_items, $post->post_content['list_setting']); } else { return []; } } else { return []; } if ($extend) { if (!$searchable) { $lists = $list_setting; } else { foreach ($list_setting as $key=>$pcls) { if (!$searchable || ($searchable && $pcls->searchable != "no" && $pcls->mysql_table != '')) { $lists[$pcls->name] = $pcls; } } } } else { foreach ($list_setting as $key=>$pcls) { if (!$searchable || ($searchable && $pcls->searchable != "no" && $pcls->mysql_table != '')) { $lists[$pcls->name] = ($pcls->isset('title')) ? $pcls->title : $key; } } } return $lists; } /** * Ritorna l'elenco delle colonne di una lista con l'url request da un lato, il nome dell'altro * @param int $dbp_id * @param bool searchable * @param bool extend * @return ADFO_list_setting[]|array * SE extend è false * ```json * {'field_name':'field_title','field_name':'...'} * ``` * Se extend è true ADFO_list_setting[] */ static function get_ur_list_columns($dbp_id) { $list_settings = self::get_list_columns($dbp_id, true, true); $lists = []; foreach ($list_settings as $list_setting) { $lists[$list_setting->name_request] = $list_setting->name; } return $lists; } /** * Ritorna l'elenco delle chiavi primarie di una lista. I campi estratti sono gli alias! * @todo verificare questa nota: TODO NON funziona, vorrei che fosse salvato nella lista comunque sto lavorando su model->add_primary_ids * @param int $dbp_id * @todo Ora i parametri sono salvati in post_content['primaries']; * @return array [table=>primary_name, ] */ static function get_primaries_id($dbp_id, $name_request = true) { $post = ADFO_functions_list::get_post_dbp($dbp_id); if ($post == false) { return []; } $sql = @$post->post_content['sql']; $primaries = []; if ( $sql != "") { $table_model = new ADFO_model(); $table_model->prepare($sql); $primaries = $table_model->get_pirmaries(true); if ($name_request) { $list_settings = $post->post_content["list_setting"]; foreach ($primaries as &$n) { if (isset($list_settings[$n])) { $n = $list_settings[$n]->name_request; } } } } return $primaries; } /** * Ritorna i valori delle primary id da una riga di una lista estratta con get_data * gli id di ritorno devono essere [table_alias.orgname => value, ...] * @param int $dbp_id * @param obj $row una singola riga di un get_data * @param string $return array|string|object * @return mixed */ static function get_ids_value_from_list($dbp_id, $row, $return = 'string') { $dbp_post = ADFO_functions_list::get_post_dbp($dbp_id); if ($dbp_post == false) { return false; } //$dbp_post->post_content->schema; $id_values = (object)[]; foreach ($row as $key => $value) { foreach ($dbp_post->post_content['schema'] as $field => $field_data) { if ($field == $key && (isset( $field_data['pri']) && $field_data['pri'] == '1')) { $key_id = $field_data['table'].".". $field_data['original_name']; $id_values->$key_id = $value ; } } } if ($return == 'string') { return rtrim(strtr(base64_encode(json_encode($id_values)), '+/', '-_'), '='); } else if ($return == 'array') { return (array) $id_values; } else { return $id_values; } } /** * Ritornano i dati o il model di una lista * @todo ADD WHERE deve caricare gli alias dei campi che però dovrei trasformare in table_alias.field da schema! Questo per semplificare la lettura agli utenti! * @param [type] $dbp_id * @param string $return items|schema|model|schema+items|raw * se diverso da null e diverso da '' * ritorna direttamente il campo singolo senza array * @param array $add_where [[op:'', column:'',value:'' ], ... ] * @param string $limit * @param string $order_field * @param string $order ASC|DESC * @param bool $raw_data Se false elabora i dati estratti con list_setting, altrimenti restuisce i dati così come sono stati estratti dalla query * @return mixed * @todo aggiungere i risultati lavorati dalle impostazioni oppure no. */ static function get_data($dbp_id, $return = "items", $add_where = null, $limit = null, $order_field = null, $order="ASC", $raw_data = false) { if (!class_exists('ADFO_functions_list')) { ADFO_fn::require_init(); } $post = false; $return = strtolower($return); if ($return == 'raw') { $form = new ADFO_class_form($dbp_id); $table_model = $form->table_model; } else { $post = ADFO_functions_list::get_post_dbp($dbp_id); if ($post == false) { return false; } $sql = $post->post_content['sql']; if ( $sql == "") return false; $table_model = new ADFO_model(); $table_model->prepare($sql); ADFO_functions_list::add_post_type_settings($table_model, $post); if (isset($post->post_content['sql_order']) && $order_field == null) { if (isset($post->post_content['sql_order']['field']) && isset($post->post_content['sql_order']['sort'])) { $table_model->list_add_order($post->post_content['sql_order']['field'], $post->post_content['sql_order']['sort']); } } if (isset($post->post_content['sql_limit']) && $limit == null) { $table_model->list_add_limit(0, $post->post_content['sql_limit']); } } if ($add_where != null) { $table_model->list_add_where($add_where); } if ($limit != null) { $table_model->list_add_limit(0, $limit); } if ($order_field != null) { $table_model->list_add_order($order_field, $order); } $table_model->add_primary_ids(); $table_model->get_list(); // prevengo l'htmlentities e il substr del testo. if (!$raw_data && $return != 'raw') { $table_model->update_items_with_setting($post, false, -1); } $items = $table_model->items; foreach ($items as $iskey => $item) { foreach ($item as $ikey => $_) { if (substr($ikey,0,8) == '____af__') { unset($items[$iskey]->$ikey); } } } if (is_countable($items) && $table_model->last_error == "") { //items|schema|model|schema+items if ($return == 'items' || $return == 'raw') { array_shift($items); return $items; } else if ($return == 'schema') { $schema = array_shift($items); return $schema; } else if ($return == 'model') { return $table_model; } else { return $items; } } else{ return false; } } /** * Data la lista estrae uno o più record a partire dagli ID e ritorna i dati grezzi! * Questi dati possono essere usati come base di partenza per salvare poi i dati. * * @param int $dbp_id * @param array|int $dbp_ids [alias_table.pri_key=>val, ...] per un singolo ID perché una query può avere più primary Id a causa di left join per cui li accetto tutti. Se è un integer invece lo associo al primo pri_id che mi ritorna. pri_key accetta sia il nome della colonna che il name_request * @param boolean $raw_data * @return \stdClass|false se torna false non bisogna esegure il template engine */ static function get_detail($dbp_id, $dbp_ids, $raw_data = true) { if (!class_exists('ADFO_functions_list')) { ADFO_fn::require_init(); } $dbp_post = ADFO_functions_list::get_post_dbp($dbp_id); if ($dbp_post == false) { return false; } // qui ci devono essere tutte le chiavi primarie! $name_requests = self::get_primaries_id($dbp_id); $where = []; $columns = ADFO::get_ur_list_columns($dbp_id); if (is_object($dbp_ids)) { $dbp_ids = (array)$dbp_ids; } if (is_string($dbp_ids)) { //provo a vedere se è una stringa $temp = ADFO_fn::ids_url_decode($dbp_ids); if (is_array($temp)) { $dbp_ids = $temp; } //var_dump($dbp_post->post_content["list_setting"]); } if (is_array($dbp_ids)) { foreach ($name_requests as $name_request) { $field_setting = $dbp_post->post_content["list_setting"][$columns[$name_request]]; $query_var = ""; if (array_key_exists($name_request, $dbp_ids)) { // name_request $query_var = $dbp_ids[$name_request]; } else if (array_key_exists($columns[$name_request], $dbp_ids)) { // nome della colonna $query_var = $dbp_ids[$columns[$name_request]]; } else if (array_key_exists($field_setting->table.".".$field_setting->name, $dbp_ids)) { // nome della colonna $query_var = $dbp_ids[$field_setting->table.".".$field_setting->name]; } if (absint($query_var) > 0) { $where[] = ['op' => '=', 'column' => $field_setting->mysql_name, 'value' => esc_sql(absint($query_var)) ]; } } } else { $name_request = reset($name_requests); if (isset($columns[$name_request]) && isset($dbp_post->post_content["list_setting"][$columns[$name_request]])) { $field_setting = $dbp_post->post_content["list_setting"][$columns[$name_request]]; if (absint($dbp_ids) > 0) { $where[] = ['op' => '=', 'column' => $field_setting->mysql_name, 'value' => esc_sql(absint($dbp_ids)) ]; } } } if (count($where) == 0) { return false; } $results = ADFO::get_data($dbp_id, (($raw_data) ? 'raw' : 'items') , $where, 1, null, 'ASC', $raw_data); self::$frontend_template_engine_data[$dbp_id] = $results; if (is_array($results) && count($results) == 1) { return reset($results); } else { return false; } return false; } /** * Estrae i dati di un record come get_detail e rimuove chiavi primarie e campi calcolati * Questi dati possono essere usati come base di partenza per salvare poi i dati. * Se i dati vengono inviati poi a save data viene fatta una copia del record. * @param int $dbp_id * @param array|int $dbp_ids [pri_key=>val, ...] per un singolo ID perché una query può avere più primary Id a causa di left join per cui li accetto tutti. Se è un integer invece lo associo al primo pri_id che mi ritorna. pri_key accetta sia il nome della colonna che il name_request * @example clona un campo: * ```php * $item = ADFO::get_clone_detail(1, 3); * $ris = ADFO::save_data(1, $item); * ``` * * @return \stdClass|false se torna false non bisogna esegure il template engine */ static function get_clone_detail($dbp_id, $dbp_ids) { if (!class_exists('ADFO_functions_list')) { ADFO_fn::require_init(); } $dbp_post = ADFO_functions_list::get_post_dbp($dbp_id); if ($dbp_post == false) { return false; } // qui ci devono essere tutte le chiavi primarie! $name_requests = self::get_primaries_id($dbp_id); $where = []; $columns = ADFO::get_ur_list_columns($dbp_id); if (is_string($dbp_ids)) { //provo a vedere se è una stringa $temp = ADFO_fn::ids_url_decode($dbp_ids); if (is_array($temp)) { $dbp_ids = $temp; } } if (is_array($dbp_ids)) { foreach ($name_requests as $name_request) { $field_setting = $dbp_post->post_content["list_setting"][$columns[$name_request]]; $query_var = ""; if (array_key_exists($name_request, $dbp_ids)) { // name_request $query_var = $dbp_ids[$name_request]; } else if (array_key_exists($columns[$name_request], $dbp_ids)) { // nome della colonna $query_var = $dbp_ids[$columns[$name_request]]; } if (absint($query_var) > 0) { $where[] = ['op' => '=', 'column' => $field_setting->mysql_name, 'value' => esc_sql(absint($query_var)) ]; } } } else { $name_request = reset($name_requests); $field_setting = $dbp_post->post_content["list_setting"][$columns[$name_request]]; if (absint($dbp_ids) > 0) { $where[] = ['op' => '=', 'column' => $field_setting->mysql_name, 'value' => esc_sql(absint($dbp_ids)) ]; } } if (count($where) == 0) { return false; } $results = ADFO::get_data($dbp_id, 'raw' , $where, 1, null, 'ASC', true); self::$frontend_template_engine_data[$dbp_id] = $results; if (is_array($results) && count($results) == 1) { $detail_data = reset($results); $return = new stdClass; // rimuovo eventuali chiavi primarie. foreach ($detail_data as $k => $r) { if (!in_array($k, $name_requests)) { $return->$k = $r; } } // rimuovo eventuali chiavi primarie originali ?! $name_requests2 = self::get_primaries_id($dbp_id, false); foreach ($detail_data as $k => $r) { if (in_array($k, $name_requests2)) { unset($return->$k); } } // rimuovo i campi calcolati // se non è mai stato salvato il form lo ricalcolo al volo. if (!is_array($dbp_post->post_content["form"]) || count($dbp_post->post_content["form"]) == 0 ) { $dbp_post->post_content["form"] = self::get_save_data_structure($dbp_id, true); } foreach ($dbp_post->post_content["form"] as $field) { $field_name = $field["name"]; if (property_exists($return, $field_name) && $field["form_type"] == "CALCULATED_FIELD") { unset($return->$field_name); } } return $return; } else { return false; } return false; } /** * Ritorna la struttura della classe get_form per il salvataggio dei dati * @param int $dbp_id The id of the list * @param boolean $default_post_content_form Se true ritorna la struttura di post_content['form'] * Se non è stato ancora mai salvato il tab form post_content['form'] ritorna un array vuoto! * @return array */ static function get_save_data_structure($dbp_id, $default_post_content_form = false) { if (!class_exists('ADFO_class_form')) { ADFO_fn::require_init(); } $form = new ADFO_class_form($dbp_id); if (!$default_post_content_form) { list($settings, $_) = $form->get_form(); return $settings; } else { list($settings, $_) = $form->get_form(false); $form_new = []; foreach ($settings as $setting_block) { foreach ($setting_block as $key => $setting) { $temp = [ "note"=> "","options"=> "","required"=> "","custom_css_class"=> "","default_value"=> "","js_script"=> "", "custom_value"=> "" ]; $sett = $setting->get_array(); if ($key != '_dbp_alias_table_') { foreach ($sett as $sk => $st) { $temp[$sk] = $st; } $temp['name'] = $temp['label']; $form_new[] = $temp; } } } return $form_new; } } /** * Salva i dati a partire da un ID o una query. * Per fare l'update devono essere inserite le chiavi primarie * @param String $dbp_id è l'id della lista, ma accetta anche una stringa con una query di select * @param Array $data i Dati da aggiornare hanno la stessa struttura della query del select! * @param Boolean $use_wp_fn Se usare le funzioni di wordpress per gli articoli e gli utenti * wp_update_post & wp_update_user quando si aggiornano/creano utenti e post * @example * ```php * $item = ADFO::get_detail(1, 3); * $item->my_field = "modified"; * $ris = ADFO::save_data(1, $item); * ``` * @return array */ static function save_data($dbp_id, $data, $use_wp_fn = true) { if (!class_exists('ADFO_class_form')) { ADFO_fn::require_init(); } if (is_array($data)) { foreach ($data as $d) { if (!is_object($d)) { return false; } } } $form = new ADFO_class_form($dbp_id); if (is_a($data, 'stdClass')) { $data = [$data]; } $result = $form->save_data($data, $use_wp_fn); return $result; } /** * Ritorna la stringa per l'id della stringa. * will be removed in 1.9.0 * @param number $post_id * @param object $item * return string|false * @DEPRECATED since 1.8.0 * @see ADFO::get_ids_value_from_list */ static function get_id_string($post_id, $item) { if (!is_object($item)) return false; if (!class_exists('ADFO_class_form')) { ADFO_fn::require_init(); } $post = ADFO_functions_list::get_post_dbp($post_id); return self::get_ids_value_from_list($post_id, $item); } /** * Dati gli id di un record di una lista e dei dati da aggiornare nel formato di una lista, torna l'array per salvare i dati con save_data * @since 1.8.0 * @param int $dbp_id The id of the list * @param array $ids gli id della lista * @param object $item i dati della lista da aggiornare * @return array elenco di dati per il form o il salvataggio */ static public function update_list_to_form($dbp_id, $ids, $item) { if (!class_exists('ADFO_class_form')) { ADFO_fn::require_init(); } $new_item = ADFO::get_detail($dbp_id, $ids); $post = ADFO_functions_list::get_post_dbp($dbp_id); if ($post == false) { return false; } $post_content = $post->post_content; $list_setting = $post_content["list_setting"]; //var_dump ($list_setting); //$new_item = ADFO_functions_list::convert_id_table( $dbp_id, $item); $form = new ADFO_class_form($dbp_id); list($settings, $_) = $form->get_form(); //var_dump ($settings); foreach ($settings as $key=>$setting) { foreach ($setting as $field => $setting_field) { $add = false; foreach ($list_setting as $list_field => $list_s) { $add = true; if (isset($item->$list_field) && $list_s->table == $setting_field->table && $list_s->orgname == $setting_field->name ) { $new_item->$field = $item->$field; } } if (!$add) { if (isset($setting_field->default_value ) && $setting_field->default_value != "" ) { $new_item->$field = $setting_field->default_value; // se è un form_type calcuated field metto custom value } else if (isset($setting_field->form_type ) && $setting_field->form_type == "calculated_field" && (!isset($new_item->$field) || $new_item->$field == "") ) { $new_item->$field = $setting_field->custom_value; } } } } return $new_item; } /** * Disegna i bottoni per l'esportazione dei record * l'esportazione dei record in sql vengono interpretati come se ogni lista fosse una sola tabella. Questo per nascondere nel frontend la vera struttura del db. * @since 1.8.0 * @param int post_id * @param string $format csv|sql */ static function draw_export_btn($post_id, $title ="download", $format="csv", $btn_class="") { $nonce = wp_create_nonce( 'adfo_frontend_export_data' ); ?>