You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

mycred插件积分同步自定义插件报错:参数数量不足求助

解决myCRED积分同步到自定义数据库表的参数错误问题

错误原因

你遇到的ArgumentCountError是因为mycred_add钩子实际只传递3个参数,但你的函数声明了4个参数,导致参数不匹配。从错误栈可以看到,钩子调用时传递的是true(积分变动审批状态)、Array(积分变动日志条目)、myCRED_Settings对象,共3个参数。

修正后的代码

// Hook into myCRED points update event
add_action('mycred_add', 'update_plugin_points_on_mycred_award', 10, 3);

function update_plugin_points_on_mycred_award($approved, $log_entry, $mycred) {
    // 仅处理已通过的阅读内容积分变动
    if ($approved && $log_entry['ref'] === 'view_content') {
        $user_id = $log_entry['user_id'];
        // 获取用户当前的myCRED总余额
        $current_balance = $mycred->get_users_balance($user_id);
        
        if ($user_id) {
            update_user_points_in_plugin($user_id, $current_balance);
        }
    }
}

// 更新自定义插件数据库中的积分
function update_user_points_in_plugin($user_id, $points) {
    global $wpdb;
    $table_name = $wpdb->prefix . 'wallets';
    
    // 先检查用户记录是否存在,不存在则插入新记录
    $exists = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $table_name WHERE user_id = %d", $user_id));
    if ($exists) {
        $wpdb->update(
            $table_name,
            array('points' => $points),
            array('user_id' => $user_id),
            array('%d'),
            array('%d')
        );
    } else {
        $wpdb->insert(
            $table_name,
            array('user_id' => $user_id, 'points' => $points),
            array('%d', '%d')
        );
    }
}

关键改动说明

  1. 匹配钩子参数数量:将add_action的参数接收数量从4改为3,函数参数列表同步调整为$approved、$log_entry、$mycred,和钩子实际传递的参数对应。
  2. 精准获取用户ID:从$log_entry['user_id']直接获取变动积分的用户ID,替代get_current_user_id(),避免后台操作或特殊场景下的用户ID错误。
  3. 获取最新余额:通过$mycred->get_users_balance()获取用户当前的myCRED总余额,确保同步到自定义表的是最新积分数值。
  4. 兼容无记录场景:增加用户记录存在性检查,若自定义表中无该用户记录则插入新数据,避免更新操作失败。

内容的提问来源于stack exchange,提问作者Gabriella

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 18:03:24