Ошибка: 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;

Проверяем работоспособность сайта — у меня ошибки пропали и сайт работает нормально.

Читайте:  Как включить дебагинг в WordPress?

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);

Выбирайте удобный для вас вариант, исправляйте ошибки и ждите обновления. Удачи!

Подписаться
Уведомить о
guest

24 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии