首页 > 解决方案 > 帖子表中的可排序自定义列

问题描述

我在 wordpress 管理帖子表中添加了一个自定义列,但我无法对其进行排序,按钮正在工作,但实际上没有任何反应。

add_filter( 'manage_edit-post_columns', 'new_column');
function new_column( $columns ) {
    $column_meta = array( 'meta' => 'Views' );
    $columns = array_slice( $columns, 0, 5, true ) + $column_meta + array_slice( $columns, 2, NULL, true );
    return $columns;
}


add_action( 'manage_posts_custom_column' , 'custom_columns' );
function custom_columns( $column ) {
    global $post;
    switch ( $column ) {
        case 'meta':
            $metaData = get_post_meta( $post->ID, 'penci_post_views_count', true );
            echo $metaData;
        break;
    }
}

add_filter( 'manage_edit-post_sortable_columns', 'register_sortable_columns' );
// Register the column as sortable
function register_sortable_columns( $columns ) {
    $columns['meta'] = 'Views';
    return $columns;
}

标签: wordpress

解决方案


您快到了。但是,由于帖子查看计数是数字(我假设),您需要向请求添加一个过滤器以定义它要被评估为这样。添加此过滤器,您应该对已有的内容感到满意。

我还建议将您的字段从metato重命名,views以免在其他人查看此代码或使用诸如 meta 之类的核心词时混淆问题。

add_filter( 'manage_edit-post_columns', 'new_column' );
function new_column( $columns ) {
    $column_meta = array( 'views' => 'Views' );
    $columns = array_slice( $columns, 0, 5, true ) + $column_meta + array_slice( $columns, 2, NULL, true );
    return $columns;
}


add_action( 'manage_posts_custom_column', 'custom_columns' );
function custom_columns( $column ) {
    global $post;
    switch ( $column ) {
        case 'views':
            $metaData = get_post_meta( $post->ID, 'penci_post_views_count', true );
            echo $metaData;
            break;
    }
}

add_filter( 'manage_edit-post_sortable_columns', 'register_sortable_columns' );
// Register the column as sortable
function register_sortable_columns( $columns ) {
    $columns['views'] = 'views';
    return $columns;
}

add_filter( 'request', 'views_columns_orderby' );
// Filter the request to evaluate the meta as a number.
function views_columns_orderby( $vars ) {
    if ( isset( $vars['orderby'] ) && 'views' === $vars['orderby'] ) {
        $vars = array_merge( $vars,
            array(
                'meta_key' => 'penci_post_views_count',
                'orderby'  => 'meta_value_num',
            )
        );
    }
    return $vars;
}

推荐阅读