如何在前端客户订阅详情页展示WooCommerce Subscriptions自定义数据
我正在使用WooCommerce Subscriptions插件管理定期循环订单,需要让客户在自身的订阅详情页面看到我为所有新订阅添加的自定义数据。
我将客户婴儿名称对应的变量以_baby_name为键,存入订阅数据的post_meta中,实现代码如下:
/** * Triggered after a new subscription is created. * * @since 2.2.22 * @param WC_Subscription $subscription */ function action_wcs_create_subscription( $subscription ) { // Get ID $subscription_id = $subscription->get_id(); update_post_meta( $subscription_id, '_baby_name', get_current_user_id() ); } add_action( 'wcs_create_subscription', 'action_wcs_create_subscription', 10, 1 );
出于测试目的,我暂时将该字段的值设置为get_current_user_id()的返回结果。
为了在客户前端展示该自定义数据,我尝试修改subscription-details.php模板文件,该文件路径为:
wp-content/plugins/woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/templates/myaccount/subscription-details.php
我在subscription_details表格的顶部、状态行上方新增了一行展示内容,代码如下:
<tbody> <tr> <td><?php esc_html_e( 'Baby Name', 'woocommerce-subscriptions' ); ?></td> <td><?php echo esc_html( $subscription.'baby_name' ); ?></td> </tr> <tr> <td><?php esc_html_e( 'Status', 'woocommerce-subscriptions' ); ?></td> <td><?php echo esc_html( wcs_get_subscription_status_name( $subscription->get_status() ) ); ?></td> </tr>
但新增的婴儿名称行错误输出了$subscription对象关联的所有数据,请问应当使用什么代码替换$subscription.'_baby_name',才能正确拉取_baby_name字段的值并在表格中正常展示?
你写的$subscription.'baby_name'属于PHP字符串拼接操作,执行时会先把$subscription对象强制转换为字符串(这就是页面输出全部对象数据的原因),再拼接上baby_name字符串,本身没有实现读取自定义post meta的逻辑。
读取该字段有两种合规写法,优先使用WooCommerce Subscriptions自带的对象方法:
- 方法1(推荐,符合WooCommerce编码规范):调用订阅对象内置的
get_meta方法$subscription->get_meta( '_baby_name', true ) - 方法2:使用WordPress原生post meta读取函数,需要先获取订阅ID
get_post_meta( $subscription->get_id(), '_baby_name', true )
修改后婴儿名称行的完整代码为:
<tr> <td><?php esc_html_e( 'Baby Name', 'woocommerce-subscriptions' ); ?></td> <td><?php echo esc_html( $subscription->get_meta( '_baby_name', true ) ); ?></td> </tr>
注意事项
- 不要直接修改插件核心目录下的模板文件,后续插件更新会直接覆盖你的自定义修改。正确做法是将该模板文件复制到当前主题的
woocommerce/subscriptions/myaccount/路径下,再在复制后的文件中修改,后续插件更新不会丢失自定义内容。 - 你当前测试代码中把
_baby_name的值存为了当前用户ID,后续替换为真实的婴儿名称字段值即可正常展示对应内容。
内容的提问来源于stack exchange,提问作者Nowak

