如何按自定义字段对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
相关产品推荐
相关产品推荐

