如何将Give Donation WP插件数据填充至Google Tag Manager dataLayer?
嘿,我刚好折腾过Give WP + Stripe + GTM的集成需求,给你梳理下两种靠谱的实现方式,优先推荐第一种,稳定性拉满:
方法1:借助Give WP内置钩子(最推荐)
Give WP提供了专门的动作钩子,在捐赠记录成功写入数据库后触发,我们可以在子主题的functions.php或者自定义插件里加一段代码,直接把所需参数推送到dataLayer里。
// 捐赠记录插入数据库后触发钩子 add_action( 'give_insert_payment', 'push_give_donation_to_datalayer', 10, 2 ); function push_give_donation_to_datalayer( $payment_id, $payment_data ) { // 从Give WP获取捐赠相关数据 $donor_obj = give_get_payment_donor( $payment_id ); $donation_status = give_get_payment_status( $payment_id ); $total_donation = give_get_payment_amount( $payment_id ); $donation_date = give_get_payment_date( $payment_id, 'Y-m-d H:i:s' ); // 自定义时间格式 $payment_method = give_get_payment_gateway( $payment_id ); $payment_key = give_get_payment_key( $payment_id ); // 只在捐赠成功时推送(Give WP里"publish"代表成功状态) if ( $donation_status !== 'publish' ) { return; } // 构建要推送的dataLayer数据结构 $datalayer_payload = array( 'event' => 'donationCompleted', // 自定义事件名,方便GTM识别触发 'donor' => array( 'id' => $donor_obj->id, 'name' => $donor_obj->name, 'email' => $donor_obj->email ), 'date' => $donation_date, 'total_donation' => $total_donation, 'donation_status' => $donation_status, 'donation_id' => $payment_id, 'payment_key' => $payment_key, 'payment_method' => $payment_method ); // 输出推送脚本到页面 ?> <script> window.dataLayer = window.dataLayer || []; dataLayer.push(<?php echo json_encode( $datalayer_payload ); ?>); </script> <?php }
注意点:
- 别直接改父主题的
functions.php,用子主题或者自定义插件,避免主题更新后代码丢失。 - 如果需要区分测试捐赠和真实捐赠,可以加个判断:
if ( give_is_test_mode() ) { return; },跳过测试数据的推送。
方法2:GTM自定义JavaScript变量(无需修改代码)
如果你不想碰PHP代码,可以在GTM里创建自定义JS变量,从捐赠成功页面的DOM元素里抓取数据。但这种方式依赖页面结构,插件更新后可能失效,适合临时快速实现。
举个例子,假设你的捐赠成功页面有对应的DOM元素,变量代码可以这么写:
function() { // 先判断是否在捐赠成功页面,避免其他页面报错 if ( !document.querySelector('.give-donation-receipt') ) { return null; } // 根据页面实际的DOM选择器抓取数据 return { donor: { name: document.querySelector('.give-donation-receipt-donor-name').textContent.trim(), email: document.querySelector('.give-donation-receipt-donor-email').textContent.trim() }, date: document.querySelector('.give-donation-receipt-date').textContent.trim(), total_donation: parseFloat(document.querySelector('.give-donation-receipt-total').textContent.replace(/[^0-9.]/g, '')), donation_status: 'completed', // 成功页面默认是完成状态 donation_id: document.querySelector('.give-donation-receipt-id').textContent.trim().replace('#', ''), payment_method: document.querySelector('.give-donation-receipt-payment-method').textContent.trim(), payment_key: '' // 这个字段页面一般不显示,所以还是推荐方法1获取 }; }
GTM后续配置步骤
不管用哪种方法,都需要在GTM里做这两步:
- 创建自定义事件触发器:触发条件设为
event等于我们定义的donationCompleted(方法1里的事件名),或者如果用方法2,就用页面URL匹配捐赠成功页面。 - 创建标签并关联变量:比如GA4事件标签,事件名设为
donation,然后把dataLayer里的参数对应到GA4事件参数里(比如total_value绑定{{DLV - total_donation}},donation_id绑定{{DLV - donation_id}}等)。
测试的时候记得打开GTM预览模式,提交一笔测试捐赠,查看dataLayer面板里是否有我们推送的参数,确保没问题再发布版本。
内容的提问来源于stack exchange,提问作者DoubleA
相关产品推荐
相关产品推荐

