custom sortable column

时间:2013-11-08 作者:asaunders

我正在尝试在我的时间线自定义帖子中为年份创建一个额外的列。我可以创建额外的列,实际上我可以对它进行排序,它工作正常,但我的所有页面似乎都不工作。

这是我用来创建列并使其可排序的所有代码:

// Register the column
add_filter( \'manage_edit-maryg_timeline_columns\', \'set_custom_edit_date_columns\' );
add_action( \'manage_maryg_timeline_posts_custom_column\' , \'custom_date_column\', 10, 2 );

function set_custom_edit_date_columns($columns) {
    unset( $columns[\'date\'] );
    $columns[\'timeline_date\'] = __( \'Year\', \'your_text_domain\' );

    return $columns;
}

//output data for the column
function custom_date_column( $column, $post_id ) {
    switch ( $column ) {
        case \'timeline_date\' :
            $year = get_post_meta( $post_id, \'timeline_date\', true );

            if ( is_string( $year ) )
                echo $year;
            else
                echo \'Unable to retrieve year\';
            break;
    }
}

//make columns sortable
add_filter("manage_edit-maryg_timeline_sortable_columns", \'timeline_sort\');
function timeline_sort($columns) {
    // $custom = array(
    //     \'timeline_date\'   => \'Year\'
    // );
    // return wp_parse_args($custom, $columns);
    //or this way
    $columns[\'timeline_date\'] = \'Year\';
    return $columns;
}

//make the date column sorted by year by default
add_filter( \'request\', \'timeline_column_orderby\' );
function timeline_column_orderby( $vars ) {
    if ( !isset( $vars[\'orderby\'] ) || ( isset( $vars[\'orderby\'] ) && \'Year\' == $vars[\'orderby\'] ) ) {
        $vars = array_merge( $vars, array(
            \'meta_key\' => \'timeline_date\',
            \'orderby\' => \'meta_value\'
        ) );
    }
    return $vars;
}
我将问题代码缩小到:

add_filter( \'request\', \'timeline_column_orderby\' );
function timeline_column_orderby( $vars ) {
    if ( !isset( $vars[\'orderby\'] ) || ( isset( $vars[\'orderby\'] ) && \'Year\' == $vars[\'orderby\'] ) ) {
        $vars = array_merge( $vars, array(
            \'meta_key\' => \'timeline_date\',
            \'orderby\' => \'meta_value\'
        ) );
    }
    return $vars;
}
唯一的问题是我不明白为什么我的页面不再工作了

提前感谢

EDIT

我进一步缩小了范围,只剩下这行代码:

!isset( $vars[\'orderby\'] ) ||
但我想做的是自动按此列排序,如果我删除它,它不会这样做

1 个回复
最合适的回答,由SO网友:asaunders 整理而成

我通过更改一些代码修复了此问题。

我更改了:

add_filter( \'request\', \'timeline_column_orderby\' );


function timeline_column_orderby( $vars ) {
          if ( !isset( $vars[\'orderby\'] ) || ( isset( $vars[\'orderby\'] ) && \'Year\' == $vars[\'orderby\'] ) ) {
            $vars = array_merge( $vars, array(
                \'meta_key\' => \'timeline_date\',


                  \'orderby\' => \'meta_value\'
                ) );
            }
            return $vars;
 }
收件人:

add_action( \'load-edit.php\', \'sort_year_load\' );

function sort_year_load() {
    add_filter( \'request\', \'sort_year\' );
}

//make the date column sortable by year
function sort_year( $vars ) {

    /* Check if we\'re viewing the \'maryg_timeline\' post type. */
    if ( isset( $vars[\'post_type\'] ) && \'maryg_timeline\' == $vars[\'post_type\'] ) {

        /* Check if \'orderby\' is set to \'year\'. */
        if ( isset( $vars[\'orderby\'] ) && \'Year\' == $vars[\'orderby\'] ) {

            /* Merge the query vars with our custom variables. */
            $vars = array_merge(
                $vars,
                array(
                    \'meta_key\' => \'timeline_date\',
                    \'orderby\' => \'meta_value_num\'
                )
            );
        }
    }

    return $vars;
}
它告诉WordPress当我点击可点击的表格标题时如何对表格进行排序。

我所做的只是在编辑上运行我的自定义。管理中的php页面。

然后我检查我们是否查看了正确的自定义帖子,以及是否将其设置为“年”。然后我就按meta\\U键订购。

我的主要问题是订购装载的桌子。我用这个代码修复了这个问题:

function set_year_post_type_admin_order($wp_query) {
    if (is_admin()) {
        $post_type = $wp_query->query[\'post_type\'];

        if ( $post_type == \'maryg_timeline\') {
            $wp_query->set(\'meta_key\', \'timeline_date\');
            $wp_query->set(\'orderby\', \'meta_value_num\');
            $wp_query->set(\'order\', \'DESC\');
        }
    }
}

add_filter ( \'pre_get_posts\', \'set_year_post_type_admin_order\' );
它检查您的管理员和帖子类型,然后将查询设置为我设置的值。

希望这对其他人有帮助

结束