更新到WordPress 4.8.2后SQL语法错误

时间:2017-10-30 16:00:26

标签: mysql wordpress advanced-custom-fields

我一直在高级自定义字段插件(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

1 个答案:

答案 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');