按自定义排序字段对admin中的分类术语表进行排序

时间:2016-07-08 14:13:49

标签: wordpress

我正在尝试通过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),但它不会根据内容对其进行排序。

我需要添加什么才能使排序知道列内容?

1 个答案:

答案 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,所以这个功能非常新鲜。