WordPress插件中函数内调用函数是否允许?页面加载异常求助
问题分析与解决方案
首先得说,你的代码里藏着一个致命错误,这就是页面加载失败的核心原因:在outputprice()函数里,你用了$this->latest_price()来调用另一个函数,但$this只有在类的成员方法内部才有意义,而你的这两个函数都是独立的全局函数,不是类的方法,所以这里的$this是未定义的,会直接触发致命错误。至于调试模式没看到错误,大概率是你的WordPress调试配置没完全开启(比如wp_debug_display没设为true,导致错误没显示在页面上)。
不用OOP的快速修复方案
直接修改outputprice()里的调用方式,同时遵循WordPress短代码的最佳实践——返回内容而非直接echo(避免输出顺序混乱),再加上空值判断防止报错:
function latest_price(){ global $wpdb; // 用$wpdb->prefix代替硬编码的wp_,适配自定义数据库前缀的情况 $result = $wpdb->get_results("SELECT bid,ask FROM {$wpdb->prefix}ticker ORDER BY indate DESC limit 1"); // 增加空值判断,避免$result为空时触发报错 if (!empty($result) && isset($result[0]->bid)) { return $result[0]->bid; } return '暂无数据'; // 兜底返回内容 } function outputprice(){ $output = latest_price(); // 直接调用全局函数,不需要$this return $output; // 短代码函数必须返回内容,不要直接echo } add_shortcode ('getprice', 'outputprice');
是否需要采用OOP方式?
不是必须的!如果你的插件功能很简单,就这两个函数,用普通全局函数完全能正常工作。但如果之后你要给插件扩展更多功能,OOP方式会更利于代码的组织、封装和维护,比如把相关功能都封装到一个类里:
class Latest_Price_Plugin { public function latest_price(){ global $wpdb; $result = $wpdb->get_results("SELECT bid,ask FROM {$wpdb->prefix}ticker ORDER BY indate DESC limit 1"); if (!empty($result) && isset($result[0]->bid)) { return $result[0]->bid; } return '暂无数据'; } public function outputprice(){ return $this->latest_price(); // 这里用$this就合法了,因为是类的成员方法 } } // 实例化类并注册短代码 $price_plugin = new Latest_Price_Plugin(); add_shortcode('getprice', array($price_plugin, 'outputprice'));
这种写法能避免全局函数污染,后续扩展功能时也更清晰。
内容的提问来源于stack exchange,提问作者samv
相关产品推荐
相关产品推荐

