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

使用ACF与PHP搭建在线交易市场遇报错及功能实现求助

解决代码报错与货币系统实现方案

一、先修复代码语法错误

你当前的代码存在语法问题,导致无法保存:

// get the current user id
$user_id = get_current_user_id();
// get a field from the user
$value = get_field('field_name', 'user_'.$user_id'); // 末尾多了一个单引号,属于语法错误

修正后的代码(可直接获取两种货币字段值):

// 获取当前登录用户ID
$user_id = get_current_user_id();
// 获取用户的coins字段值
$user_coins = get_field('coins', 'user_' . $user_id);
// 获取用户的leaves字段值
$user_leaves = get_field('leaves', 'user_' . $user_id);

保存这段修正后的代码,即可解决「Could not update snippet. The server did not send a valid response.」的错误。

二、前端展示用户货币数量

添加以下代码,通过短代码在页面/文章中展示当前用户的两种货币:

function show_user_currencies() {
    // 未登录时提示登录
    if (!is_user_logged_in()) {
        return '<p>请先登录查看你的货币</p>';
    }

    $user_id = get_current_user_id();
    // 获取字段值,为空时默认设为0
    $coins = empty(get_field('coins', 'user_' . $user_id)) ? 0 : get_field('coins', 'user_' . $user_id);
    $leaves = empty(get_field('leaves', 'user_' . $user_id)) ? 0 : get_field('leaves', 'user_' . $user_id);

    return "<p>你的金币:{$coins} | 你的叶子:{$leaves}</p>";
}
// 注册短代码,在页面中插入[user_currencies]即可调用
add_shortcode('user_currencies', 'show_user_currencies');

三、实现货币兑换功能

1. 添加兑换逻辑代码

在Code Snippets中添加以下PHP代码(示例为1金币=2叶子的兑换比例,可自行调整):

function handle_currency_exchange() {
    // 仅处理POST请求
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        return;
    }

    // 未登录用户直接返回错误
    if (!is_user_logged_in()) {
        wp_send_json_error('请先登录再进行兑换');
    }

    $user_id = get_current_user_id();
    $exchange_type = sanitize_text_field($_POST['exchange_type'] ?? '');
    $amount = intval($_POST['amount'] ?? 0);

    // 校验兑换数量合法性
    if ($amount <= 0) {
        wp_send_json_error('兑换数量必须大于0');
    }

    // 获取当前用户货币值,为空则默认0
    $coins = empty(get_field('coins', 'user_' . $user_id)) ? 0 : get_field('coins', 'user_' . $user_id);
    $leaves = empty(get_field('leaves', 'user_' . $user_id)) ? 0 : get_field('leaves', 'user_' . $user_id);

    // 金币换叶子逻辑
    if ($exchange_type === 'coins_to_leaves') {
        if ($coins < $amount) {
            wp_send_json_error('金币数量不足');
        }
        update_field('coins', $coins - $amount, 'user_' . $user_id);
        update_field('leaves', $leaves + ($amount * 2), 'user_' . $user_id);
        wp_send_json_success('兑换成功!');
    }
    // 叶子换金币逻辑
    elseif ($exchange_type === 'leaves_to_coins') {
        if ($leaves < $amount) {
            wp_send_json_error('叶子数量不足');
        }
        update_field('leaves', $leaves - $amount, 'user_' . $user_id);
        update_field('coins', $coins + ($amount / 2), 'user_' . $user_id);
        wp_send_json_success('兑换成功!');
    } else {
        wp_send_json_error('无效的兑换类型');
    }
}
// 注册AJAX钩子,处理兑换请求
add_action('wp_ajax_currency_exchange', 'handle_currency_exchange');

2. 添加兑换表单短代码

继续添加以下代码,生成兑换表单的短代码:

function exchange_form_shortcode() {
    ob_start();
    ?>
    <div class="exchange-container">
        <h3>货币兑换</h3>
        <div id="exchange-status" style="margin:10px 0;"></div>
        <form id="exchange-form">
            <label>兑换类型:</label>
            <select name="exchange_type" required>
                <option value="coins_to_leaves">金币换叶子(1:2)</option>
                <option value="leaves_to_coins">叶子换金币(2:1)</option>
            </select>
            <br><br>
            <label>兑换数量:</label>
            <input type="number" name="amount" min="1" required>
            <br><br>
            <button type="submit">确认兑换</button>
        </form>
    </div>

    <script>
    document.getElementById('exchange-form').addEventListener('submit', function(e) {
        e.preventDefault();
        const formData = new FormData(this);
        formData.append('action', 'currency_exchange');

        fetch('<?php echo admin_url('admin-ajax.php'); ?>', {
            method: 'POST',
            body: formData
        })
        .then(res => res.json())
        .then(data => {
            const statusEl = document.getElementById('exchange-status');
            if (data.success) {
                statusEl.style.color = 'green';
                statusEl.textContent = data.data;
                // 1.5秒后刷新页面,更新货币显示
                setTimeout(() => location.reload(), 1500);
            } else {
                statusEl.style.color = 'red';
                statusEl.textContent = data.data;
            }
        })
        .catch(() => {
            document.getElementById('exchange-status').textContent = '兑换出错,请重试';
        });
    });
    </script>
    <?php
    return ob_get_clean();
}
add_shortcode('exchange_form', 'exchange_form_shortcode');

在页面中插入[exchange_form]即可显示兑换表单。

注意事项

  • 确保ACF插件已激活,get_field和update_field是ACF的内置函数
  • 兑换比例可自行修改代码中的倍数(如$amount * 2)
  • 所有代码在Code Snippets中添加时,可选择「仅在前端运行」模式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 09:35:13