一些使用WordPress表格插件WP-Table Reloaded的用户可能会想要实现下面的想法:您有一个相当大的表格,维护着某些东西的列表(比如产品)。但是在某些页面上,您不希望将表格全部都显示出来,而只是想将某一列里那些符合某个关键词的行显示出来。
在这种情况下,您就可以使用下面的筛选扩展了。该扩展在简码中加入另一个参数 filter ,可以使用一个或多个(使用逻辑运算符连接的)关键词对表格内容进行筛选:
[table id=1 filter="word1&&word2" /]
然后,只有那些符合条件的行才会显示出来,这些行拥有可以精确匹配设定的关键词的列。在上面的例子中,只有一列精确匹配值“word1”并且还有一列精确匹配“word2”的行才会显示出来。
要使用 WP-Table Reloaded 扩展,您应该先阅读扩展页面,了解相关方法和说明,并按照相关要求进行操作。您还能从该页面找到实现其它功能的扩展的链接。
下面就是该扩展的代码:
/**
* 仅显示匹配“filter”参数值/包含的逻辑表达式的行
* Show only rows that match the "filter" parameter value/contained logical expression
*/
function wp_table_reloaded_filter_rows( $output_options, $table_id, $table ) {
// early exit if no "filter" parameter given
if ( empty( $output_options['filter'] ) )
return $output_options;
$filter = $output_options['filter']; // from the Shortcode parameter "filter"
// && is the passed value for &&
if ( false !== strpos( $filter, '&&' ) ) {
$compare = 'and';
$filter = explode( '&&', $filter );
} elseif ( false !== strpos( $filter, '||' ) ) {
$compare = 'or';
$filter = explode( '||', $filter );
} else {
$compare = 'none'; // single filter word
$filter = array( $filter );
}
foreach ( $filter as $key => $string ) {
// remove HTML entities and turn them into characters, escape/slash other characters
$filter[ $key ] = addslashes( wp_specialchars_decode( $string, ENT_QUOTES, false, true ) );
}
$row_match = false;
foreach ( $table['data'] as $row_idx => $row ) {
if ( 0 == $row_idx && $output_options['first_row_th'] )
continue;
$found = array();
foreach ( $filter as $key => $string ) {
$found[ $key ] = in_array( $string, $row );
}
switch ( $compare ) {
case 'none':
case 'or':
if ( in_array( true, $found ) ) // at least one word was found / only filter word was found
$row_match = true;
else
$output_options['hide_rows'][] = (string)$row_idx;
break;
case 'and':
if ( ! in_array( false, $found ) ) // if not (at least one word was *not* found) == all words were found
$row_match = true;
else
$output_options['hide_rows'][] = (string)$row_idx;
break;
}
}
// if search term(s) was/were not found in any of the rows, all rows need to be hidden
// but only if first row is used as table head
if ( ! $row_match && $output_options['first_row_th'] ) {
$row_idx = 0;
$output_options['hide_rows'][] = (string)$row_idx;
}
return $output_options;
}
/**
* Add "filter" as a valid parameter to the [table] Shortcode
*/
function wp_table_reloaded_shortcode_parameter_filter( $default_atts ) {
$default_atts['filter'] = '';
return $default_atts;
}
/**
* Register necessary Plugin Filters
*/
add_filter( 'wp_table_reloaded_frontend_output_options', 'wp_table_reloaded_filter_rows', 10, 3 );
add_filter( 'wp_table_reloaded_shortcode_table_default_atts', 'wp_table_reloaded_shortcode_parameter_filter' );
只需要将这段代码复制到 “wp-table-reloaded-extensions.php”文件里,该文件可以根据扩展页面的使用说明来创建,在插件头声明之后而在PHP结束符号 ?>之前。如果您还没有激活这个新插件“WP- Table Reloaded Extensions”,激活即可。
作者在上面的代码中加入了一些注释,应该会比较容易理解。下面是他对其工作方式的解释:该扩展通过执行挂钩注入到 WP-Table Reloaded 代码中,注册一个新的简码参数 filter。这是必须的,因为实际的参数值需要随参数一起传递给筛选算法。该算法首先判断需要进行什么类型的筛选(“and”(与),“or”(或),还是只有一个词)。然后从搜索表达式中解析出关键词并搜索匹配的行。再执行条件检查,如果该行不满足条件,就在输出中将它标记为隐藏。其中会有少量的健壮性判断(比如,第一行需要区别对待,或者如果结果中所有行都是隐藏的就需要进行说明),不过该扩展基本上就是这样工作的了。
下面是几个简单的示例,向您展示3种可能的使用情况(请注意,在任何情况下都需要单元格内容精确匹配关键词,例如,如果您搜索 “test”,但是单元格内容是“testing”,这就不匹配!):
在行中搜索一个关键词:
[table id=1 filter="word1" /]
(如果没有任何一个单元格包含该内容,所有行都会被隐藏。)
搜索至少一个关键词:
[table id=1 filter="word1||word2" /]
(没有单元格包含“word1”或者 “word2”的行都会被隐藏。)
您可以使用 || 将所有需要的关键词组合起来。
搜索所有关键词:
[table id=1 filter="word1&&word2&&word3" /]
(如果行中没有单元格包含“word1”,同时也没有单元格包含“word2”,还没有单元格包含“word3”,则满足条件的所有行均被隐藏。)
你也可以使用 && 将所有需要的关键词组合起来。
重要提示:无法使用组合的逻辑运算,如
[table id=1 filter="word1||word2&&word3" /]
该简码将无法工作!
这样一来,您就可以只显示一个大表格中需要的那些部分了:-)
使用中如果有什么问题,请详细阅读相关文档,或者到讨论区相应板块寻求解答。©
本文发表于水景一页。永久链接:<http://cnzhx.net/blog/extension-6-showing-only-rows-that-match-a-filter/>。转载请保留此信息及相应链接。
好难啊,学习中
呵呵,不用学,直接用就行了。看着虽然多,可都是一样的步骤。