我一直在高级自定义字段插件(load_field)中使用一个钩子,它将对象从我的数据库中的表加载到ACF选择字段。该表(' wp_new_royalsliders')由RoyalSlider图像滑块插件创建,因此我使用钩子来填充带有滑块名称的选择字段。
这个功能已经运行了很长时间但最近停止工作 - 我认为在将核心更新到4.8.2之后:
add_filter('acf/load_field/name=media_gallery_slider', 'my_acf_royalslider_choices');
function my_acf_royalslider_choices($field){
$field['choices'] = array();
global $wpdb;
$query = $wpdb->prepare('SELECT * FROM %1$s ORDER BY ID ASC', 'wp_new_royalsliders');
$results = $wpdb->get_results($query);
if(!empty($results)) :
foreach($results as $result) :
$value = $result->id;
$label = $result->name;
$field['choices'][ $value ] = $label;
endforeach;
endif;
return $field;
}
当我打开调试时出现错误:
WordPress数据库错误:[You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%1$s ORDER BY ID ASC' at line 1]
SELECT * FROM %1$s ORDER BY ID ASC
答案 0 :(得分:0)
当您传入硬编码字符串值时,您不需要占位符,只需使用
即可$query = $wpdb->prepare('SELECT * FROM wp_new_royalsliders ORDER BY ID ASC');
如果您想获得花哨和便携,可以选择
$query = $wpdb->prepare('SELECT * FROM ' . $wpdb->prefix . 'new_royalsliders ORDER BY ID ASC');
所以它也适用于其他前缀,但如果这是一个非常自定义的东西,它不会进入任何其他网站。
其他人似乎也注意到了这种可能性,请参阅this request。
更新:因为$ wpdb-> prepare()需要第二个参数(因为它的作业是转义用于SQL的变量输入),它可能会抱怨。解决方案:摆脱它并直接将SQL提供给get_results:
$results = $wpdb->get_results('SELECT * FROM ' . $wpdb->prefix . 'new_royalsliders ORDER BY ID ASC');