На днях WordPress обновился до версии 3.2
Хорошее обновление, быстродействие движка увеличилось и пр. пр., но лично меня, при попытке создать новую запись в обновленной админке, подкараулила вот такая неприятность.
Fatal error: Call to undefined function json_encode() in /var/www/includes/class-wp-list-table.php on line 905
В результате невозможно переключиться в визуальный редактор, да и некоторые другие нужные кнопки перестали нажиматься.
В чем проблема?
Проблема в функции PHP — json_encode(). Она является дополнением и потому не все хостеры включают ее в сборку для своих серверов.
Решение
Всего-то нужно добавить в WordPress собственный обработчик этой функции.
Делается это элементарно:
1. Копируем этот код в буфер обмена (выделяем, жмем правой кнопкой мыши, в выпавшем меню выбираем «Копировать»).
/* ===================== Костыли для json ============================ */
if (!function_exists('json_encode')) {
function json_encode($value)
{
if (is_int($value)) {
return (string)$value;
} elseif (is_string($value)) {
$value = str_replace(array('\\\', '/', '"', "\r", "\n", "\b", "\f", "\t"),
array('\\\\\', '\/', '\"', '\r', '\n', '\b', '\f', '\t'), $value);
$convmap = array(0x80, 0xFFFF, 0, 0xFFFF);
$result = "";
for ($i = mb_strlen($value) - 1; $i >= 0; $i--) {
$mb_char = mb_substr($value, $i, 1);
if (mb_ereg("&#(\\d+);", mb_encode_numericentity($mb_char, $convmap, "UTF-8"), $match)) {
$result = sprintf("\\u%04x", $match[1]) . $result;
} else {
$result = $mb_char . $result;
}
}
return '"' . $result . '"';
} elseif (is_float($value)) {
return str_replace(",", ".", $value);
} elseif (is_null($value)) {
return 'null';
} elseif (is_bool($value)) {
return $value ? 'true' : 'false';
} elseif (is_array($value)) {
$with_keys = false;
$n = count($value);
for ($i = 0, reset($value); $i < $n; $i++, next($value)) {
if (key($value) !== $i) {
$with_keys = true;
break;
}
}
} elseif (is_object($value)) {
$with_keys = true;
} else {
return '';
}
$result = array();
if ($with_keys) {
foreach ($value as $key => $v) {
$result[] = json_encode((string)$key) . ':' . json_encode($v);
}
return '{' . implode(',', $result) . '}';
} else {
foreach ($value as $key => $v) {
$result[] = json_encode($v);
}
return '[' . implode(',', $result) . ']';
}
}
}
/* ===================== костыли для json ============================ */
2. Заходим на ваш сайт с помощью любого FTP клиента, заходим в папку wp-admin, а в ней в папку includes. Выкачиваем оттуда файл class-wp-list-table.php
Скачайте в 2 разных места. Один будем редактировать, а второй оставим про запас на всякий случай.
3. Открываем файл (который сохранили для редактирования) в тестовом редакторе. Редактор нужен типа Programmer’s Notepad. Придется скачивать и устанавливать если нет ничего наподобие. Ворды и блокноты — решительно не подходят.
4. Находим в открывшемся файле находим такой тэг
Alexmuz) большущее спасибо за статью Реализация json_encode на PHP – русский язык UTF-8.
PS Я тоже не буду против благодарности)))
А с вами был Лексиум.
Всего вам доброго.
Применил Ваш костыль для другого движка. Сразу заработала регистрация на сайте. А то сутки не мог исправить ошибку. Спасибо за подсказку!
Всегда пожалуйста))
Спасибо, заработало!
Здравствуйте) после последнего ответа на ваш пост прошло уже 3 года, а проблема не поменялась))) Пожалуйста, помогите!!!! Обновляла WP с 4.0 на 4.2 вручную и получила вот: Fatal error: Call to undefined function wp_json_encode() in …. /http/wp-admin/includes/misc.php on line 668. Нашла ваш пост, но, увы, заплатка уже не работает(((( Помогите, плз))
Попробуйте переустановить движок, возможно сайт торпедировали и нафаршировали вредоносным кодом. Если нет, меняйте хостера. «У всех всё работает»))