在后台按名为“date”的自定义字段对帖子进行排序

时间:2020-10-13 作者:geraldo

我定义了一个名为“quot;“日期”;现在要按此字段对后端的帖子列表进行排序。

我定义了过滤器来进行订购,标题可以单击并显示订购箭头图标。问题是,帖子列表按发布日期排序,而不是按自定义字段排序;日期;。

function crimes_columns($columns) {
    $columns[\'crimedate\'] = \'Crime date\';
    return $columns;
}
add_filter(\'manage_posts_columns\', \'crimes_columns\');

function crimes_show_columns($name) {
    global $post;
    switch ($name) {
        case \'crimedate\':
            echo get_post_meta($post->ID, "date", true);
            break;
    }
    return $row_output;
}
add_action(\'manage_posts_custom_column\',  \'crimes_show_columns\');

add_filter( \'manage_edit-sortable_columns\', \'crimes_add_custom_column_make_sortable\' );
function crimes_add_custom_column_make_sortable( $columns ) {
    $columns[\'crimedate\'] = \'crimedate\';
    return $columns;
}

add_action( \'pre_get_posts\', \'crimes_orderby_meta\' );
function crimes_orderby_meta( $query ) {
    if(!is_admin())
        return;
 
    $orderby = $query->get( \'orderby\');
 
    if( \'crimedate\' == $orderby ) {
        $query->set(\'meta_key\',\'date\');
        $query->set(\'meta_type\', \'DATE\');
        $query->set(\'orderby\',\'meta_value_date\');
    }
}
你认为问题是字段的名称吗?我是否必须重命名字段才能使其工作?还是我的代码有问题?

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

代码中的主要问题是这一部分:$query->set(\'orderby\',\'meta_value_date\'); 因此,您应该使用meta_value 而不是meta_value_date. (有meta_value_num, 但这不适合用于按日期排序。)

然后确保meta_type 设置为DATE (是的,你已经做对了),and 使用正确的日期格式-10132020 确实不是一个好的日期,MySQL/MariaDB也无法将这些值转换为有效的日期-WordPress/WP_Query 当元类型设置为时,指示MySQL/MariaDB将值转换为日期date.

作为对(你的评论)的回应:“我想,我的朋友们,我的朋友们。”但是,如果不更改格式并使用所选格式mmddYYYY对结果查询排序,是否有任何解决方案“;,对不起,但我认为没有一种简单的方法可以做到这一点。

更好的做法是在保存元数据时使用正确的格式,而不是在检索元数据时。例如,您可以使用ISO 8601 date format 也用于current_time( \'mysql\' ) 在WordPress中:Y-m-d — 但这就是PHP;对于jQuery Datepicker小部件,您可以使用yy-mm-dd or $.datepicker.ISO_8601 然后给出一个日期2020-10-14 2020年10月14日。

因此,请更正日期格式并使用meta_value 使用orderby 参数,排序将按预期工作。

代码中的其他问题crimes_show_columns(), 如果需要访问完整的post数据,请使用get_post() 而不是global 呼叫例如,您可以将函数重写为:

function crimes_show_columns( $name, $post_id ) {
//  $post = get_post( $post_id ); // like this
//  global $post;                 // not this

    switch ( $name ) {
        case \'crimedate\':
            echo get_post_meta( $post_id, \'date\', true );
            break;
    }

    // action hooks do not need anything be returned back
//  return $row_output; // moreover, $row_output is not defined anywhere..
}
add_action( \'manage_posts_custom_column\',  \'crimes_show_columns\', 10, 2 );
  • 正确的挂钩(用于添加自定义可排序列的名称)是manage_edit-post_sortable_columns 而不是manage_edit-sortable_columns 因为在edit.php?post_type=post admin屏幕,屏幕ID为edit-post; i、 e。<name of the PHP file without .php>-<post type>.

  • 相关推荐

    在UPDATE_USER_META之后WP_REDIRECT不工作

    我创建了一个自定义页面,让用户能够编辑他们的个人资料。一切都很好,但我真的不知道为什么wp_redirect 不起作用my edit-profile-proccess.php。<?php $user = wp_get_current_user(); $userID = $user->ID; $has_error = false; $has_success = false; $message = array(); &#x