如何按单表单修改GiveWP插件支付收据区域文本
问题根因
give_pre_form_output 钩子仅在捐赠表单前端主体渲染时触发,支付完成后的收据页加载流程不会执行该钩子,因此嵌套在该钩子内注册的gettext文本替换过滤器不会在收据页生效,自然无法修改收据区域的对应文本。如果直接全局挂载过滤器不加表单判断,又会导致全站所有GiveWP相关页面的目标文本被替换,影响其他表单。
实现代码
直接将以下代码添加到主题的functions.php文件或者自定义功能插件中即可:
add_filter( 'gettext', function( $translated_text, $original_text, $domain ) { // 提前筛除无关文本与非GiveWP域的内容,降低性能开销 if ( $domain !== 'give' || $original_text !== 'Secure Donation' ) { return $translated_text; } $target_form_id = 590; $current_context_form_id = 0; // 匹配表单渲染页场景 if ( function_exists( 'give_get_form_id' ) ) { $current_context_form_id = (int) give_get_form_id(); } // 匹配支付收据/成功页场景 if ( ! $current_context_form_id && function_exists( 'give_is_success_page' ) && give_is_success_page() ) { $donation_id = isset( $_GET['donation_id'] ) ? absint( $_GET['donation_id'] ) : 0; if ( $donation_id && function_exists( 'give_get_payment_meta' ) ) { $current_context_form_id = (int) give_get_payment_meta( $donation_id, '_give_payment_form_id', true ); } } // 仅当前上下文属于目标表单时才替换文本 if ( $current_context_form_id === $target_form_id ) { return 'Secure Payment'; } return $translated_text; }, 10, 3 );
实现逻辑说明
- 全局挂载
gettext过滤器,保证无论是表单页还是收据页都能触发文本替换判断 - 前置校验逻辑优先判断文本与文本域,不符合匹配规则直接返回原内容,不会产生额外性能损耗
- 自动识别两种生效场景:ID为590的捐赠表单页面、由该表单生成的捐赠对应的支付成功/收据页面
- 严格匹配表单ID,其他ID的捐赠表单、其他表单生成的收据页都不会触发文本替换,不会产生全局影响
- 增加了函数存在性校验,即使GiveWP插件临时未启用,也不会触发PHP报错导致站点异常
内容的提问来源于stack exchange,提问作者user1972265
相关产品推荐
相关产品推荐

