Ошибка: Warning: Missing argument 2 for wpdb::prepare(), — после обновления на 3.5
После обновления WordPress к версии 3.5 на некоторых сайтах вылезли ошибки. Ошибки относятся к запросам.
Вот пример на одном из пациентов на котором стоит тема Classipress 3.1.8 (ошибка вылазит когда открываем категории):
Warning: Missing argument 2 for wpdb::prepare(), called in /**************/includes/theme-refine.php on line 27 and defined in /**************/wp-includes/wp-db.php on line 990
Вот код (файл theme-refine.php, строка 27 ):
$results = $wpdb->get_results( $sql = $wpdb->prepare( "SELECT ID, form_cats FROM ". $wpdb->prefix . "cp_ad_forms WHERE form_status = 'active'" ) );
Вылазила еще одна ошибка в админке (когда заходим в настройки темы):
Warning: Missing argument 2 for wpdb::prepare(), called in /**************/wp-content/themes/classipress_318/includes/admin/admin-options.php on line 842 and defined in /***************/wp-includes/wp-db.php on line 990
Вот код (admin-options.php, строка 842):
$ad_rev_total = $wpdb->get_var( $wpdb->prepare( "SELECT sum(mc_gross) FROM $wpdb->prefix" . 'cp_order_info' ) );
Что это за ошибки и почему они возникают?
На версии WordPress 3.4.2 они не возникали в теме Classipress 3.1.8. Так в чем же дело?
Оказывается изменился файл wp-includes/wp-db.php
Версия 3.5 (строка 990):
function prepare( $query, $args ) { if ( is_null( $query ) ) return;
Версия 3.4.2 (строка 893):
function prepare( $query = null ) { // ( $query, *$args ) if ( is_null( $query ) ) return;
Этот код насколько я понимаю использует 2 аргумента. Последний аргумент и вызывает ошибку. Чтобы решить проблему нужно добавить пустой массив данных в этот аргумент, или поставить null в нужных местах (где появляются ошибки, или двойные кавычки вместо аргумента.
Разработчики обещали решить эту проблему в следующем обновлении.
Но мы можем уже сейчас решить наши проблемы, чтобы не делать откат на старую версию WordPress.
Я предлагаю несколько решений:
1 вариант: замена кода в файле wp-includes/wp-db.php (строка 990).
Мы заменяем этот код:
function prepare( $query, $args ) { if ( is_null( $query ) ) return;
на этот:
function prepare( $query = null ) { // ( $query, *$args ) if ( is_null( $query ) ) return;
Проверяем работоспособность сайта — у меня ошибки пропали и сайт работает нормально.
2 вариант: работаем с аргументами в тех местах, где возникают ошибки.
В ф-цию в файле theme-refine.php, строка 27 добавляем null:
$results = $wpdb->get_results( $sql = $wpdb->prepare( "SELECT ID, form_cats FROM ". $wpdb->prefix . "cp_ad_forms WHERE form_status = 'active'", null ) );
В ф-цию в файле admin-options.php, строка 842 также добавляем null:
$ad_rev_total = $wpdb->get_var( $wpdb->prepare( "SELECT sum(mc_gross) FROM $wpdb->prefix" . 'cp_order_info', null ) );
Проверяем работоспособность сайта — у меня ошибки пропали и сайт работает нормально.
Можно вместо ,null добавлять ,»». Или ,array()
3 вариант:
старый код с ошибкой:
$ad_rev_total = $wpdb->get_var( $wpdb->prepare( "SELECT sum(mc_gross) FROM $wpdb->prefix" . 'cp_order_info') );
заменили на:
$ad_rev_total = $wpdb->get_var( "SELECT sum(mc_gross) FROM $wpdb->prefix" . 'cp_order_info');
4 вариант:
Ну и на крайняк можна вообще скрыть все ошибки — но считаю это отклонением от нормы (скрывать ошибки нужно, но не от себя).
Добавьте в файл wp-config.php этот код:
@ini_set('display_errors', 0);
Выбирайте удобный для вас вариант, исправляйте ошибки и ждите обновления. Удачи!