WordPress短码中mysql_fetch_array转$wpdb->get_results后无数据问题
问题分析与修正方案
原代码的核心错误:
- 错误使用
$wpdb->query():该方法执行查询时,返回的是受影响的行数(写操作)或布尔值(读操作),并非查询结果集,不能传递给$wpdb->get_results()使用。 - 字段不匹配:初始代码中
SELECT countryid,但输出时调用$row->city,字段名称不一致,无法获取对应数据。 - 循环变量引用错误:修改后的foreach代码中,错误使用
$rows->city,应使用循环迭代的单个对象$row->city。 - option标签的value属性不完整:原代码中
<option value>未赋值,不符合HTML规范,也无法正确传递选中值。
修正后的完整代码:
add_shortcode( 'get-city', function () { ob_start(); global $wpdb; // 直接用get_results执行查询,获取结果集对象数组 $rows = $wpdb->get_results("SELECT city FROM {$wpdb->prefix}city"); ?> <select name="city"> <option>Select City</option> <?php foreach( $rows as $row ): ?> <!-- 给option的value和文本都赋值为city字段的值 --> <option value="<?php echo esc_attr($row->city); ?>"><?php echo esc_html($row->city); ?></option> <?php endforeach; ?> </select> <?php return ob_get_clean(); });
额外优化说明:
- 使用
esc_attr()和esc_html()对数据库取出的值进行转义,避免XSS安全风险,符合WordPress开发规范。 - 采用PHP替代语法(
foreach(): ... endforeach;),让HTML和PHP代码混合更易读。
内容的提问来源于stack exchange,提问作者Plonic
相关产品推荐
相关产品推荐

