You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按自定义字段对Divi博客模块元素进行排序?

给Divi博客模块按ACF自定义字段排序的实现思路

方法一:通过Divi过滤器直接修改查询参数

利用Divi提供的et_pb_blog_get_posts过滤器,修改博客模块的文章查询排序规则,这是最直接的方式。

1. 按ACF日期字段排序

将以下代码添加到子主题的functions.php或自定义代码插件中,替换对应的字段名和模块标识:

function custom_divi_blog_sort_by_acf_date( $args, $instance ) {
    // 用自定义CSS类标识目标博客模块,可在Divi模块设置的"高级"->"CSS类"中设置
    if ( isset( $instance['custom_css_class'] ) && $instance['custom_css_class'] === 'sort-by-acf-date' ) {
        $args['meta_key'] = 'your_acf_date_field_slug'; // 替换为你的ACF日期字段键名
        $args['orderby'] = 'meta_value_date';
        $args['order'] = 'DESC'; // 可选ASC(升序)/DESC(降序)
    }
    return $args;
}
add_filter( 'et_pb_blog_get_posts', 'custom_divi_blog_sort_by_acf_date', 10, 2 );
  • 注意:ACF日期字段需保持默认存储格式(Ymd),才能确保排序逻辑正确。

2. 按ACF地点字段排序

根据地点字段的类型选择对应代码:

文本类型地点字段

function custom_divi_blog_sort_by_acf_location( $args, $instance ) {
    if ( isset( $instance['custom_css_class'] ) && $instance['custom_css_class'] === 'sort-by-acf-location' ) {
        $args['meta_key'] = 'your_acf_location_field_slug'; // 替换为你的ACF地点字段键名
        $args['orderby'] = 'meta_value'; // 文本字段用此参数做字符串排序
        $args['order'] = 'ASC'; // 按地点名称A-Z升序,可改为DESC
    }
    return $args;
}
add_filter( 'et_pb_blog_get_posts', 'custom_divi_blog_sort_by_acf_location', 10, 2 );

谷歌地图类型地点字段

如果是ACF的地理位置字段,需按纬度/经度排序,代码如下:

function custom_divi_blog_sort_by_acf_map( $args, $instance ) {
    if ( isset( $instance['custom_css_class'] ) && $instance['custom_css_class'] === 'sort-by-acf-map' ) {
        $args['meta_key'] = 'your_acf_map_field_slug';
        $args['orderby'] = 'meta_value_num';
        $args['order'] = 'ASC'; // 按纬度从小到大排序,可调整
        // 确保只查询有地理位置字段的文章
        $args['meta_query'] = array(
            array(
                'key' => 'your_acf_map_field_slug',
                'compare' => 'EXISTS'
            )
        );
    }
    return $args;
}
add_filter( 'et_pb_blog_get_posts', 'custom_divi_blog_sort_by_acf_map', 10, 2 );

方法二:给Divi博客模块添加可视化排序选项

如果需要在Divi编辑器里直接选择排序字段,可先给模块添加自定义设置选项,再根据选项调整查询:

1. 添加ACF排序选项到模块设置

function add_acf_sort_option_to_divi_blog( $settings ) {
    $settings['fields'][] = array(
        'type' => 'select',
        'label' => 'ACF排序字段',
        'option_category' => 'basic_option',
        'options' => array(
            'none' => '默认排序',
            'acf_date' => 'ACF日期字段',
            'acf_location' => 'ACF地点字段',
        ),
        'default' => 'none',
        'toggle_slug' => 'main_content',
    );
    return $settings;
}
add_filter( 'et_pb_blog_settings_modal_tabs', 'add_acf_sort_option_to_divi_blog' );

2. 根据选项应用排序规则

function custom_divi_blog_sort_by_acf_option( $args, $instance ) {
    $acf_sort_option = isset( $instance['acf_sort_option'] ) ? $instance['acf_sort_option'] : 'none';
    
    switch ( $acf_sort_option ) {
        case 'acf_date':
            $args['meta_key'] = 'your_acf_date_field_slug';
            $args['orderby'] = 'meta_value_date';
            $args['order'] = 'DESC';
            break;
        case 'acf_location':
            $args['meta_key'] = 'your_acf_location_field_slug';
            $args['orderby'] = 'meta_value';
            $args['order'] = 'ASC';
            break;
        default:
            // 保持默认排序逻辑
            break;
    }
    return $args;
}
add_filter( 'et_pb_blog_get_posts', 'custom_divi_blog_sort_by_acf_option', 10, 2 );

注意事项

  • 所有代码中的字段键名需替换为你实际创建的ACF字段“字段名称”(不是显示标签)。
  • 建议将代码添加到子主题或自定义代码插件中,避免主题更新导致代码丢失。
  • 若使用自定义CSS类标识模块,需在目标博客模块的“高级”设置中填写对应的类名。

内容的提问来源于stack exchange,提问作者Pat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 17:55:22