原始文章中的代码已损坏,在编写时可能已损坏。因此,过时不是问题(2年在WordPress时间内算不上什么)。
问题是这一行:
add_action(\'woocommerce_checkout_update_order_meta\', \'add_referral_meta\');
他们创建的回调函数,
add_referral_meta()
, 接受两个参数,
$order_id
和
$posted
:
function add_referral_meta( $order_id, $posted ) {
但如果回调函数接受多个参数,则
add_action()
调用需要指定数量。因此,第一行代码需要如下所示:
add_action( \'woocommerce_checkout_update_order_meta\', \'add_referral_meta\', 10, 2 );
您可以在
developer documentation.
尽管如此,这并不是一个经得起未来考验的解决方案,因为它没有使用适当的WooCommerce方法来保存订单元数据。我建议使用以下代码:
function wpse_330106_set_origin_cookie() {
$cookie_value = $_SERVER[\'HTTP_REFERER\'];
if ( ! is_admin() && ! isset( $_COOKIE[\'origin\'] ) ) {
setcookie( \'origin\', $cookie_value, time() + 3600*24*30, COOKIEPATH, COOKIE_DOMAIN, false );
}
}
add_action( \'init\', \'wpse_330106_set_origin_cookie\');
function wpse_330106_add_order_referrer( $order ) {
$order->add_meta_data( \'referrer\', $_COOKIE[\'origin\'] );
}
add_action(\'woocommerce_checkout_create_order\', \'wpse_330106_add_order_referrer\', 10, 1 );
此解决方案使用更现代的
$order->add_meta_data()
方法,这是当前向WooCommerce订单添加元数据的正确方法。这是因为无论WooCommerce将订单数据存储在何处,它都将继续工作。当WooCommerce不可避免地开始将订单存储在自定义表中而不是作为POST时,这将非常有用。