Глюк WordPress 2.5

Я уже писал о достаточно неприятном глюке, который появился в свежей версии WordPress – в некоторых случаях посты не хотели публиковаться, при публикации появлялась ошибка

Fatal error: Maximum execution time of 30 seconds exceeded in /home/servers/site/wp-includes/wp-db.php on line 360

Экспериментальным путем было выявлено, что ошибка возникает, если в названии поста присутсвуют русские буквы и начало названия совпадает с началом такового в уже существкющем посте ( количество символов совпадения при условии что все буквы русские равно 33 ). Почему же так происходит ?

WordPress требует, чтобы у каждого поста поле post_name было уникальным. Поле это заполняется на основании названия поста, причем не ASCII символы преобразовываются в их код
(например %DO%D1, тоесть один символ становится 6, если он не английский). Длина поля – 200 символов, и если в базе уже есть запись с таким же post_name, то оно модифицируется вот таким образом:

$alt_post_name = substr($post_name, 0, 200-(strlen($suffix)+1)). “-$suffix”;

$suffix увеличивается в цикле на 1 до тех пор, пока имя не станет уникальным. Уникальность имени проверяется вот такой строчкой кода:

$post_name_check = $wpdb->get_var($wpdb->prepare(“SELECT post_name FROM $wpdb->posts WHERE post_name = ‘$alt_post_name’ AND post_type = ‘$post_type’ AND ID != %d AND post_parent = %d LIMIT 1”, $post_ID, $post_parent));

Так вот вся загвоздка в том, что функция $wpdb->prepare имеет глюк – при наличии в строке % Она возвращает пустое значение, а $wpdb->get_var в случае получения в качестве запроса пустой строки выдает последнее значение, которое всегда одинаково. Получаем классический бесконечный цикл…

Как же исправить проблему ? Очень просто – избавтесь от $wpdb->prepare и сформируйте запрос вручную вот таким образом:

$post_name_check = $wpdb->get_var(“SELECT post_name FROM $wpdb->posts WHERE post_name = ‘$alt_post_name’ AND post_type = ‘$post_type’ AND ID != $post_ID AND post_parent = $post_parent LIMIT 1”);

Строчка, которую надо менять, находится в файле wp-includes/post.php



Digital Ocean
Провайдер облачного хостинга - заведи свой виртуальный сервер всего за $5 в месяц !

Leave a Reply