我正在尝试通过Wordpress中的自定义字段对我的分类术语表进行排序。但我错过了一些东西。
我有自定义分类。我们在这个例子中称之为教育。
我添加了一个排序顺序字段,并使用update_term_meta()
将值保存到该字段。
这很有效。
接下来,我在分类的admin表中添加了一列:
// Add the column to the table with terms
add_filter('manage_edit-education_columns', array( $this, 'addSortOrderColumn' ));
function addSortOrderColumn( $columns ){
$columnsBefore = array_slice( $columns, 0, 2, true); // NOTE: First column is the checkbox
$columnsAfter = array_slice( $columns, 2, count( $columns ), true);
$columnsInsert = array('sort-order' => ‘Sort’ );
$columns = array_merge($columnsBefore, $columnsInsert, $columnsAfter);
return $columns;
}
// Display the contents for the column
add_filter('manage_education_custom_column',array( $this, 'addSortOrderColumnContent'), 10, 3 );
function addSortOrderColumnContent( $content, $columnName, $termId ){
if( $columnName !== 'sort-order' ){
return $content;
}
$termId = absint( $termId );
$order = get_term_meta( $termId, 'sort-order', true );
if( !empty( $order ) ){
$content .= esc_attr( $order );
}
return $content;
}
// Make the column sortable
add_filter( 'manage_edit-education_sortable_columns', array( $this, 'makeSortOrderColumnSortable' ));
function makeSortOrderColumnSortable( $sortable ){
$sortable[ 'sort-order' ] = 'sort-order';
return $sortable;
}
我看到了列,我可以点击它的标题,然后点击表格行(a c z e< - > e z c a),但它不会根据内容对其进行排序。
我需要添加什么才能使排序知道列内容?
答案 0 :(得分:0)
您需要调整get_terms函数运行的基础sql以检索分类术语列表。它默认为术语名称,单击&更改排序将更改url中的orderby = xxx,但会流经代码中的switch语句并返回默认值。这样做的方法是通过terms_clauses过滤器:
add_filter( 'terms_clauses', 'filter_terms_clauses', 10, 3 );
/**
* Filter WP_Term_Query meta query
*
* @param object $query WP_Term_Query
* @return object
*/
function filter_terms_clauses( $pieces, $taxonomies, $args ) {
global $pagenow, $wpdb;
// Require ordering
$orderby = ( isset( $_GET['orderby'] ) ) ? trim( sanitize_text_field( $_GET['orderby'] ) ) : '';
if ( empty( $orderby ) ) { return $pieces; }
// set taxonomy
$taxonomy = $taxonomies[0];
// only if current taxonomy or edit page in admin
if ( !is_admin() || $pagenow !== 'edit-tags.php' || !in_array( $taxonomy, [ 'education' ] ) ) { return $pieces; }
// and ordering matches
if ( $orderby === 'sort-order' ) {
$pieces['join'] .= ' INNER JOIN ' . $wpdb->termmeta . ' AS tm ON t.term_id = tm.term_id ';
$pieces['where'] .= ' AND tm.meta_key = "sort-order"';
$pieces['orderby'] = ' ORDER BY tm.meta_value ';
}
return $pieces;
}
WP_Term_Query仅来自WP4.6,所以这个功能非常新鲜。