WordPress零件价格查询插件转短码异常:仅显输入框无CSV上传按钮
解决WordPress短码仅显示部分表单模块的问题
问题根源
你的代码存在两个核心问题:
- 函数重定义:声明了两个同名的
init()函数,后定义的会直接覆盖前一个,导致后台原有逻辑被替换。 - 环境适配逻辑错误:后台的
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()函数,避免函数覆盖问题。
额外注意事项
- 确保
test_csv_upload()、test_pricelist_updated()等函数在前端执行时不会报错,若这些函数仅适用于后台,需在函数内部添加is_admin()判断,避免前端执行出错。 - 前端的
submit_button()可通过第二个参数指定样式,比如'primary'让按钮更贴合前端页面风格。
内容的提问来源于stack exchange,提问作者irfan spi
相关产品推荐
相关产品推荐

