如何不修改核心文件更改WooCommerce后台订单列表列内容
可行实现方案
WooCommerce 官方的模板覆盖规则仅适用于 templates 目录下的前端模板文件,includes 目录存放核心运行逻辑,不支持直接上传同名文件覆盖,直接修改核心文件会在版本更新时被完全覆盖,不推荐使用。针对你要修改后台订单列表状态列输出的需求,完全可以通过官方提供的钩子机制实现,代码不会随版本更新丢失,具体有两种实现路径,可根据你的修改需求选择:
方案1:仅调整最终输出HTML结构(推荐,代码量最小)
如果你只是要修改那两处printf输出的HTML标签、属性、类名等内容,不需要调整方法内部的tooltip计算逻辑,直接用PHP输出缓冲拦截对应页面的渲染结果即可,不需要重写整个类。
将以下代码放入子主题的functions.php文件,或自定义功能插件中:
add_action('admin_init', function() { global $pagenow; // 仅在后台订单列表页加载缓冲,不影响其他后台页面性能 if ($pagenow !== 'edit.php' || !isset($_GET['post_type']) || $_GET['post_type'] !== 'shop_order') { return; } ob_start(function($rendered_html) { // 在此处编写你的替换规则即可,示例为给状态标签新增自定义class // 原带tooltip的标签格式:<mark class="order-status status-{状态slug} tips" data-tip="{提示内容}"> // 原无tooltip的标签格式:<mark class="order-status status-{状态slug}"> $rendered_html = preg_replace( '/<mark class="order-status (status-[^"]+)( tips)?"/', '<mark class="order-status $1$2 my-custom-status-class"', $rendered_html ); // 其他结构修改直接增加对应的替换规则即可 return $rendered_html; }); });
该方案兼容性极强,只要WooCommerce不重构订单状态列的基础标签结构,跨版本升级也不会失效。
方案2:需要修改方法内部逻辑时使用(如调整tooltip生成规则)
如果你不仅要改最终输出,还要修改render_order_status_column方法内部的计算逻辑(比如改tooltip的内容、显示规则),可以自定义类继承原订单列表类,重写对应方法后通过官方钩子替换原类实例。
代码如下:
add_action('plugins_loaded', function() { // 避免WooCommerce未激活时触发类不存在的致命错误 if (!class_exists('WC_Admin_List_Table_Orders')) { return; } // 自定义类继承原订单列表类 class Custom_WC_Order_List_Table extends WC_Admin_List_Table_Orders { // 重写需要修改的状态列渲染方法 protected function render_order_status_column() { $tooltip = ''; $comment_count = get_comment_count( $this->object->get_id() ); $approved_comments_count = absint( $comment_count['approved'] ); if ( $approved_comments_count ) { $latest_notes = wc_get_order_notes([ 'order_id' => $this->object->get_id(), 'limit' => 1, 'orderby' => 'date_created_gmt', ]); $latest_note = current($latest_notes); if ( isset($latest_note->content) && 1 === $approved_comments_count ) { $tooltip = wc_sanitize_tooltip( $latest_note->content ); } elseif ( isset($latest_note->content) ) { $tooltip = wc_sanitize_tooltip( $latest_note->content . '<br/><small style="display:block">' . sprintf( _n( 'Plus %d other note', 'Plus %d other notes', ( $approved_comments_count - 1 ), 'woocommerce' ), $approved_comments_count - 1 ) . '</small>' ); } else { $tooltip = wc_sanitize_tooltip( sprintf( _n( '%d note', '%d notes', $approved_comments_count, 'woocommerce' ), $approved_comments_count ) ); } } if ( $tooltip ) { // 在此处修改你需要的printf输出逻辑 printf( '<mark class="order-status %s tips" data-tip="%s"><span>%s</span></mark>', esc_attr( sanitize_html_class( 'status-' . $this->object->get_status() ) ), wp_kses_post( $tooltip ), esc_html( wc_get_order_status_name( $this->object->get_status() ) ) ); } else { // 在此处修改你需要的printf输出逻辑 printf( '<mark class="order-status %s"><span>%s</span></mark>', esc_attr( sanitize_html_class( 'status-' . $this->object->get_status() ) ), esc_html( wc_get_order_status_name( $this->object->get_status() ) ) ); } } } }); // 挂载钩子将原订单列表类替换为自定义类 add_filter('woocommerce_list_table_class', function($class, $list_id) { if ($list_id === 'orders') { return 'Custom_WC_Order_List_Table'; } return $class; }, 10, 2);
注意事项
- 不要直接手动引入自定义的includes目录文件替换核心文件,会和WooCommerce的类加载机制冲突,大概率出现致命错误。
- 上述两种方案的代码存放于子主题或自定义插件中,WooCommerce版本更新不会被覆盖。
- 仅需修改输出结构优先选方案1,需要调整内部计算逻辑再使用方案2。
内容的提问来源于stack exchange,提问作者Snorlax
相关产品推荐
相关产品推荐

