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

WordPress零件价格查询插件转短码异常:仅显输入框无CSV上传按钮

解决WordPress短码仅显示部分表单模块的问题

问题根源

你的代码存在两个核心问题:

  1. 函数重定义:声明了两个同名的init()函数,后定义的会直接覆盖前一个,导致后台原有逻辑被替换。
  2. 环境适配逻辑错误:后台的init()函数通过两层if(!$uploaded)判断控制表单显示,但前端短码版本中,test_csv_upload()或test_pricelist_updated()在前端环境下可能错误返回true,导致CSV上传相关表单被跳过渲染。

修复方案

以下是调整后的代码,解决了上述问题并确保所有表单模块在前端正常显示:

// 重构初始化函数,区分后台与前端逻辑
function oe_checker_init($is_frontend = false) {
    ob_start();

    // 后台保留原有上传状态判断逻辑
    if (!$is_frontend) {
        test_pricelist_updated();
        $uploaded = test_csv_upload();
        if (!$uploaded) {
            $uploaded = test_form_submit();
        }
        if (!$uploaded) {
            render_oe_checker_forms();
        }
    } else {
        // 前端直接渲染全部表单,不受上传状态影响
        render_oe_checker_forms();
    }

    return ob_get_clean();
}

// 单独提取表单渲染逻辑,提升复用性
function render_oe_checker_forms() {
?>
<h1>OE Part Number Checker</h1>
<h2>Enter Part Numbers <small>(One per line)</small></h2>
<form method="post">
    <?php wp_nonce_field('oe_checker_part_nonce', 'oe_part_nonce'); // 添加前端表单防CSRF验证 ?>
    <textarea name="partnumbers" placeholder="XX0000..." rows="6" style="width: 300px"></textarea>
    <?php submit_button('Check Part Numbers', 'primary', 'check_parts'); ?>
</form>
<hr/>
<h2>Upload a CSV File</h2>
<form method="post" enctype="multipart/form-data">
    <?php wp_nonce_field('oe_checker_csv_upload_nonce', 'oe_csv_nonce'); // 添加文件上传防CSRF验证 ?>
    <input type='file' id='oe_csv' name='oe_csv' accept=".csv" required>
    <?php submit_button('Upload', 'primary', 'upload_csv'); ?>
</form>
<hr/>
<h2>Update Price List CSV File</h2>
<form method="post" enctype="multipart/form-data">
    <?php wp_nonce_field('oe_checker_pricelist_nonce', 'oe_pricelist_nonce'); // 添加价格表上传防CSRF验证 ?>
    <input type='file' id='pricelist_csv' name='pricelist_csv' accept=".csv" required>
    <?php submit_button('Upload Pricelist CSV', 'primary', 'upload_pricelist'); ?>
</form>
<?php
}

// 后台初始化(保留原有逻辑挂载)
function oe_checker_admin_init() {
    oe_checker_init(false);
}
// 此处请根据你原后台的挂载方式调整,比如绑定到admin_menu或其他钩子

// 短码实现函数
function fts_africa_oecheck_shortcode() {
    return oe_checker_init(true);
}
add_shortcode('fts_africa_oecheck', 'fts_africa_oecheck_shortcode');

关键修改说明

  • 拆分逻辑:将表单渲染单独提取为render_oe_checker_forms()函数,避免重复代码,同时清晰分离后台与前端的逻辑分支。
  • 环境隔离:通过$is_frontend参数控制逻辑,前端直接渲染全部表单,不受后台上传状态判断的影响。
  • 补充安全验证:前端表单添加wp_nonce_field()防止CSRF攻击,这是后台submit_button()自动处理但前端需要手动补充的部分。
  • 消除函数冲突:重构原有的重复init()函数,避免函数覆盖问题。

额外注意事项

  1. 确保test_csv_upload()、test_pricelist_updated()等函数在前端执行时不会报错,若这些函数仅适用于后台,需在函数内部添加is_admin()判断,避免前端执行出错。
  2. 前端的submit_button()可通过第二个参数指定样式,比如'primary'让按钮更贴合前端页面风格。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 23:04:54