页面标题中的&符号为何导致foreach循环出现问题?
嘿,我来帮你排查这个问题!看起来有两个核心问题:带&符号的标题没出现在下拉列表,还有那个「Trying to get property of non-object」的Notice报错,咱们一步步解决:
先搞定「非对象属性」的Notice报错
这个报错的本质是:你用$wpdb->get_results()获取数据时,可能因为查询出错(比如SQL语法问题、特殊字符截断查询)返回了false而非结果对象,后续循环里访问$row->xxx属性时自然就会报错。
解决步骤:
- 首先用
$wpdb->prepare()来构建SQL查询,这既能避免SQL注入,还能自动转义特殊字符(包括&),防止查询中断。 - 循环前先判断查询结果是否有效,避免对空值/非对象进行属性访问。
再解决带&符号的标题不显示问题
&是HTML特殊字符,直接输出到<option>里会被浏览器解析成实体的一部分,或者在SQL查询时因为没转义导致匹配失败。解决要点:
- 查询阶段用
$wpdb->prepare()处理特殊字符,确保带&的标题能被正确从数据库中查出。 - 输出到HTML时,用WordPress的
esc_html()函数转义标题,把&转换成&,这样浏览器能正确显示&符号,还能避免XSS风险。
修正后的完整代码示例(对应你的下拉框逻辑)
把你第65行附近的代码替换成类似这样(根据你的实际表结构调整):
<?php // 假设你要获取当前照片集ID(替换成你插件里的实际逻辑) $current_photo_set_id = get_current_photo_set_id(); // 用prepare构建安全的关联查询 $query = $wpdb->prepare( "SELECT p.ID, p.post_title FROM {$wpdb->posts} p JOIN {$wpdb->prefix}your_plugin_relation_table r ON p.ID = r.page_id WHERE r.photo_set_id = %d AND p.post_status = 'publish' AND p.post_type = 'page'", $current_photo_set_id ); $related_pages = $wpdb->get_results($query); // 输出下拉框 echo '<select name="related_pages">'; echo '<option value="">请选择关联页面</option>'; // 先判断结果是否有效,再循环输出 if ($related_pages && is_array($related_pages)) { foreach ($related_pages as $page) { // 用esc_attr转义value,esc_html转义显示文本 echo sprintf( '<option value="%s">%s</option>', esc_attr($page->ID), esc_html($page->post_title) ); } } echo '</select>'; ?>
这样调整后,带&的标题会被正确查询并显示,同时那个Notice报错也会消失——因为我们确保了只有在查询到有效结果时才会进入循环访问对象属性。
内容的提问来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

