Call table with special filter
-
Hi, again me ??
Is it possible to do that :
I have a table id 1 with A,C,D,E column
I would like call ( with sortcode [table ….] ) this table BUT filter on C=”azerty”.Is it possible actually or i have to dev something, if i have to dev, what’s the best solution ?
Thanks
Radyium
-
i coded something in case we don’t have more simple way.
the code below will output a table filter on special field, this is not just a forced search filter in js.
If we filter in js, all data are still present and could be display on search or other filter of visitor, that i don’t want.For example : [table id=1 c_filter=”hello” c_filter_id=”1″]
Will output the table id=1 with only column id = “1”, and the filter “hello”
Of course the code below will have to adapt with your table.
This code could be heavy of you have a hight number of entries in your table!!
I also past part of code plug-in to not skip every others filter could be presentadd_filter( 'wp_table_reloaded_shortcode_table_overwrite', 'wp_table_reloaded_overwrite_atts',10,2 ); add_filter( 'wp_table_reloaded_load_table_overwrite', 'wp_table_custom_load',10,2 ); function wp_table_custom_load($table_id,$atts) { global $WP_Table_Reloaded_Frontend; $table_loaded = apply_filters( 'wp_table_reloaded_load_table', false, $table_id ); if ( $table_loaded ) return $table_loaded; $table_option = ( $WP_Table_Reloaded_Frontend->table_exists( $table_id ) ) ? $WP_Table_Reloaded_Frontend->tables[ $table_id ] : $WP_Table_Reloaded_Frontend->optionname['table'] . '_' . $table_id; $table = get_option( $table_option, $WP_Table_Reloaded_Frontend->default_table); //Custom filter $filter_id = $atts['c_filter_id']; $filter = trim($atts['c_filter']); $new_table = array(); $new_table_v = array(); foreach($table['data'] as $k => $v) { if(trim($v[$filter_id]) == $filter || $k == 0) { $new_table[] = $v; $new_table_v[] = $table['visibility']['row'][$k]; } } $table['data'] = $new_table; $table['visibility']['rows'] = $new_table_v; $table = apply_filters( 'wp_table_reloaded_post_load_table', $table, $table_id ); $table = apply_filters( 'wp_table_reloaded_post_load_table_id-' . $table_id, $table ); return $table; } function wp_table_reloaded_overwrite_atts( $ret = false, $atts ) { global $WP_Table_Reloaded_Frontend; if(isset($atts['c_filter_id']) && $atts['c_filter_id'] != '') { // check, if a table with the given ID exists $table_id = $atts['id']; if ( !is_numeric( $table_id ) || 1 > $table_id || !$WP_Table_Reloaded_Frontend->table_exists( $table_id ) ) { $message = "[table \"{$table_id}\" not found /]<br />\n"; $message = apply_filters( 'wp_table_reloaded_table_not_found_message', $message, $table_id ); return $message; } // $table = $WP_Table_Reloaded_Frontend->load_table( $table_id ); $table = apply_filters( 'wp_table_reloaded_load_table_overwrite', $table_id, $atts ); // check for table data if ( empty( $table['data'] ) ) { $message = "[table "{$table_id}" seems to be empty /]<br />\n"; $message = apply_filters( 'wp_table_reloaded_table_empty_message', $message, $table_id ); return $message; } $rows = count( $table['data'] ); $columns = count( $table['data'][0] ); // explode from string to array $atts['column_widths'] = ( !empty( $atts['column_widths'] ) ) ? explode( '|', $atts['column_widths'] ) : array(); // add all rows/columns to array if "all" value set for one of the four parameters // rows/columns are indexed from 0 internally, but from 1 externally, thus substract 1 from each value $actions = array( 'show', 'hide' ); $elements = array( 'rows', 'columns' ); foreach ( $actions as $action ) { foreach ( $elements as $element ) { if ( !empty( $atts["{$action}_{$element}"] ) ) { if ( 'all' == $atts["{$action}_{$element}"] ) $atts["{$action}_{$element}"] = range( 1, ${$element} + 1 ); // because second comment above else $atts["{$action}_{$element}"] = explode( ',', $atts["{$action}_{$element}"] ); foreach ( $atts["{$action}_{$element}"] as $key => $value ) $atts["{$action}_{$element}"][ $key ] = (string) ( $value - 1 ); } else { $atts["{$action}_{$element}"] = array(); } } } // determine options to use (if set in Shortcode, use those, otherwise use options from DB, i.e. "Edit Table" screen) $output_options = array(); foreach ( $atts as $key => $value ) { // have to check this, because strings 'true' or 'false' are not recognized as boolean! if ( is_array( $value ) ) $output_options[ $key ] = $value; elseif ( 'true' == strtolower( $value ) ) $output_options[ $key ] = true; elseif ( 'false' == strtolower( $value ) ) $output_options[ $key ] = false; else $output_options[ $key ] = ( -1 !== $value ) ? $value : $table['options'][ $key ] ; } // generate unique HTML ID, depending on how often this table has already been shown on this page $count = ( isset( $WP_Table_Reloaded_Frontend->shown_tables[ $table_id ] ) ) ? $WP_Table_Reloaded_Frontend->shown_tables[ $table_id ] : 0; $count = $count + 1; $WP_Table_Reloaded_Frontend->shown_tables[ $table_id ] = $count; $output_options['html_id'] = "wp-table-reloaded-id-{$table_id}-no-{$count}"; $output_options['html_id'] = apply_filters( 'wp_table_reloaded_html_id', $output_options['html_id'], $table_id ); // get options for the JavaScript library from the table's options $js_options = array ( 'alternating_row_colors' => $output_options['alternating_row_colors'], 'datatables_sort' => $output_options['datatables_sort'], 'datatables_paginate' => $output_options['datatables_paginate'], 'datatables_paginate_entries' => $output_options['datatables_paginate_entries'], 'datatables_lengthchange' => $output_options['datatables_lengthchange'], 'datatables_filter' => $output_options['datatables_filter'], 'datatables_info' => $output_options['datatables_info'], 'datatables_tabletools' => $output_options['datatables_tabletools'], 'datatables_customcommands' => $output_options['datatables_customcommands'] ); $js_options = apply_filters( 'wp_table_reloaded_table_js_options', $js_options, $table_id, $output_options ); // eventually add this table to list of tables which have a JS library enabled and thus are to be included in the script's call in the footer if ( $output_options['use_tablesorter'] && $output_options['first_row_th'] && 1 < $rows ) $WP_Table_Reloaded_Frontend->tablesorter_tables[] = array ( 'table_id' => $table_id, 'html_id' => $output_options['html_id'], 'js_options' => $js_options ); // generate "Edit Table" link $edit_url = ''; if ( is_user_logged_in() && $WP_Table_Reloaded_Frontend->options['frontend_edit_table_link'] ) { $user_group = $WP_Table_Reloaded_Frontend->options['user_access_plugin']; $capabilities = array( 'admin' => 'manage_options', 'editor' => 'publish_pages', 'author' => 'publish_posts', 'contributor' => 'edit_posts' ); $min_capability = isset( $capabilities[ $user_group ] ) ? $capabilities[ $user_group ] : 'manage_options'; $min_capability = apply_filters( 'wp_table_reloaded_min_needed_capability', $min_capability ); if ( current_user_can( $min_capability ) ) { $admin_menu_page = $WP_Table_Reloaded_Frontend->options['admin_menu_parent_page']; $admin_menu_page = apply_filters( 'wp_table_reloaded_admin_menu_parent_page', $admin_menu_page ); // backward-compatibility for the filter if ( 'top-level' == $admin_menu_page ) $admin_menu_page = 'admin.php'; // 'edit-pages.php' was renamed to 'edit.php?post_type=page' in WP 3.0 if ( 'edit-pages.php' == $admin_menu_page ) $admin_menu_page = 'edit.php?post_type=page'; if ( !in_array( $admin_menu_page, $WP_Table_Reloaded_Frontend->possible_admin_menu_parent_pages ) ) $admin_menu_page = 'tools.php'; $url_params = array( 'page' => $WP_Table_Reloaded_Frontend->page_slug, 'action' => 'edit', 'table_id' => $table['id'] ); $edit_url = add_query_arg( $url_params, admin_url( $admin_menu_page ) ); $edit_url = esc_url( $edit_url ); } } $output_options['edit_table_url'] = $edit_url; // check if table output shall and can be loaded from the transient cache, otherwise generate the output $cache_name = "wp_table_reloaded_table_output_{$table_id}"; if ( !$output_options['cache_table_output'] || is_user_logged_in() || ( false === ( $output = get_transient( $cache_name ) ) ) ) { // render/generate the table HTML $render = $WP_Table_Reloaded_Frontend->create_class_instance( 'WP_Table_Reloaded_Render', 'render.class.php' ); $render->output_options = apply_filters( 'wp_table_reloaded_frontend_output_options', $output_options, $table['id'], $table ); $render->table = $table; $output = $render->render_table(); if ( $output_options['cache_table_output'] && !is_user_logged_in() ) set_transient( $cache_name, $output, 60*60*24 ); // store $output in a transient, set cache timeout to 24 hours } return $output; } return false; } add_filter( 'wp_table_reloaded_shortcode_table_default_atts', 'wp_table_reloaded_add_atts',10,1 ); function wp_table_reloaded_add_atts($atts) { $atts['c_filter_id'] = ''; $atts['c_filter'] = ''; return $atts; }
Radyium
Hi,
this is actually already possible, with a plugin extension. Your work looks good, too, though.
You can find more at https://tobias.baethge.com/2010/03/extension-6-showing-only-rows-that-match-a-filter/ (and the introduction at https://tobias.baethge.com/wordpress-plugins/wp-table-reloaded-english/extensions/ ). For TablePress, the designated and official successor of WP-Table Reloaded, you can find the code at https://tablepress.org/extensions/row-filter/ (It actually has more features there, like the column that you can filter on, and whether it shall do exact matching).
Regards,
TobiasThanks you, i will check later for the last version of your plugin and the new one ??
Radyium
Hi,
great ?? I hope you like it!
Best wishes,
Tobias
- The topic ‘Call table with special filter’ is closed to new replies.