仅使用日和月按周年排序帖子

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

我使用标准日期格式定义了一个名为crimedate的自定义字段Y-m-d. 我定义了过滤器,以便在后端的post列表中按此日期排序,这很好。

现在,我需要能够显示按周年日排序的帖子,只使用犯罪日期的日期和月份,但我不知道如何做到这一点:

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

function crimes_show_columns($name, $post_id) {
    switch ($name) {
        case \'crimedate\':
            // show whole date
            echo get_post_meta($post_id, "crimedate", true);
            break;
        case \'crimeanniversary\':
            // show only anniversary in format dd/mm
            $date = get_post_meta($post_id, "crimedate", false);
            echo substr($date,6)."/".substr($date,4,2);
            break;
    }
    return $row_output;
}
add_action(\'manage_posts_custom_column\',  \'crimes_show_columns\');

add_filter( \'manage_edit-post_sortable_columns\', \'crimes_add_custom_column_make_sortable\' );
function crimes_add_custom_column_make_sortable( $columns ) {
    $columns[\'crimedate\'] = \'crimedate\';
    $columns[\'crimeanniversary\'] = \'Crime anniversary\';
    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\',\'crimedate\');
        $query->set(\'orderby\',\'meta_value\');
    }
    else if( \'crimeanniversary\' == $orderby ) {
        // ¿¿¿ what to do here ???
    }
}
是否可以只按天和月排序日期,而忽略hook中的年份pre_get_posts? 或者,我必须在两个单独的字段中保存天数和月份才能使其正常工作?

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

不,使用pre_get_posts 单独地但您不必为日期使用单独的字段。

WP_Query, 虽然没有提供一个简单的查询参数,只按月份和日期对帖子进行排序,但您可以使用posts_orderby filter hook 要修改ORDER BY 条款(即。ORDER BY <the part here>) 用于对帖子进行排序。

中的工作示例pre_get_posts 挂钩,设置meta_keycrimedate:

// In crimes_orderby_meta():

elseif ( \'crimeanniversary\' == $orderby ) {
    $query->set( \'meta_key\', \'crimedate\' );
}
posts_orderby hook,你可以使用STR_TO_DATE() MySQL中的函数按元值的月份和日期对帖子进行排序:

请注意,我故意使用静态闰年,这意味着29/02 (2月29日)28/02 (2月28日)ASC.

add_filter( \'posts_orderby\', \'posts_orderby_crimeanniversary\', 10, 2 );
function posts_orderby_crimeanniversary( $orderby, $query ) {
    if ( is_admin() && \'crimeanniversary\' === $query->get( \'orderby\' ) ) {
        global $wpdb;

        $order = ( \'ASC\' === strtoupper( $query->get( \'order\' ) ) ) ? \'ASC\': \'DESC\';

        // This means, we still sort by the date, but we "recreate" the date using
        // the year 2020 (or any leap year), and month and day from the meta value.
        $orderby = "STR_TO_DATE( CONCAT( \'2020-\',
            MONTH( {$wpdb->postmeta}.meta_value ), \'-\',
            DAY( {$wpdb->postmeta}.meta_value
        ) ), \'%Y-%m-%d\' ) $order";
    }

    return $orderby;
}
我希望这会有所帮助,请更正代码中的这些问题:

英寸crimes_add_custom_column_make_sortable():

$columns[\'crimeanniversary\'] = \'crimeanniversary\';  // like this
$columns[\'crimeanniversary\'] = \'Crime anniversary\'; // not this
  • 英寸crimes_show_columns():

    get_post_meta($post_id, "crimedate", true)  // like this
    get_post_meta($post_id, "crimedate", false) // not this
    
    然后用$row_output — 未定义。

    不要忘记这里的第四个参数:

    add_action(\'manage_posts_custom_column\', \'crimes_show_columns\', 10, 2); // like this
    add_action(\'manage_posts_custom_column\', \'crimes_show_columns\');        // not this!
    
  • 相关推荐

    Bulk update custom post types

    我使用内置的主题自定义帖子类型,并将帖子导入到该自定义帖子类型中。一切都正常,但不是这些自定义帖子类型的过滤器。如果我手动更新每个自定义帖子类型(我是指蓝色的更新按钮),那么它将开始显示在过滤器中。有没有办法更新所有帖子?我不想手动操作,因为大约有600篇帖子。//更新这里我发送了一张图片。这是我导入的自定义帖子类型。https://imgur.com/kefN0sV 我需要全部更新。如果我单击每个导入的帖子并单击更新按钮,那么它就会开始工作。我不需要改变任何东西,只需点击更新按钮,然后它在过滤器中工作良