PHP Критическая ошибка: Объект класса WP_Error не может быть преобразован в строку
Мне нужна помощь с этим:
PHP Критическая ошибка: Объект класса WP_Error не может быть преобразован в строку в файле /hosting/www/ortopediairati.es/public/wp-content/themes/irati/rt-framework/functions/rt_breadcrumb.php на строке 58
Я обновил WordPress до версии 4.8, и сайт работает некорректно.
Полный файл здесь:
<?php
/* Функция хлебных крошек RT-Breadcrumb */
function rt_breadcrumb(){
global $taxonomy,$term_slug,$post,$delimiter;
if(!get_option('rttheme_breadcrumb_menus')){
return false;
}
//Разметка
$before='<div class="breadcrumb">'.wpml_t(THEMESLUG, 'Текст меню хлебных крошек', get_option(THEMESLUG.'_breadcrumb_text')).' ';
$after='</div>';
$delimiter=' | ';
/* Хлебные крошки WooCommerce */
if ( function_exists( 'woocommerce_breadcrumb' ) ) {
if( is_woocommerce() ){
$defaults = array(
'delimiter' => $delimiter,
'wrap_before' => $before,
'wrap_after' => $after,
'before' => '',
'after' => '',
'home' => null
);
woocommerce_breadcrumb($defaults);
return false;
}
}
echo $before;
//Главная страница
echo "<a href=\"". BLOGURL ."\" title=\"". get_bloginfo('name')."\">".__( 'Главная', 'rt_theme' )."</a>";
// функция родительских страниц
function page_parents($parent_page_id,$child_pages){
global $delimiter;
$parent_page = get_page($parent_page_id);
$page_parents = $delimiter."<a href=\"".get_permalink($parent_page->ID)."\" title=\"". get_the_title($parent_page->ID) ."\" >". get_the_title($parent_page->ID) ."</a>" .$child_pages;
if ($parent_page->post_parent) page_parents($parent_page->post_parent,$page_parents);
else echo $page_parents;
}
// функция родительских терминов
function term_parents($term_id,$child_terms){
global $taxonomy,$delimiter;
$parent_term = get_term_by('ID',$term_id, $taxonomy);
$term_parents = $delimiter."<a href=\"".get_term_link($parent_term->slug,$taxonomy)."\" title=\"". $parent_term->name ."\" >". $parent_term->name ."</a>" .$child_terms;
if ($parent_term->parent) term_parents($parent_term -> parent,$term_parents);
else echo $term_parents;
}
//получить начальную страницу
function get_start_page($start_page){
global $delimiter;
//родители начальной страницы
$get_start_page=get_page($start_page);
if ($get_start_page -> post_parent){
page_parents( $get_start_page -> post_parent,'');
}
//начальная страница
if ($start_page && !get_query_var('lang')) {
echo $delimiter."<a href=\"".get_permalink($start_page)."\" title=\"". get_the_title($start_page) ."\" >". get_the_title($start_page) ."</a>";
}
}
//термины
function term_links(){
global $taxonomy,$post_type,$term_slug,$delimiter;
//Найти начальную страницу и определить имена таксономий
if($taxonomy=="product_categories"){
$start_page=get_option('rttheme_product_list');
}elseif($taxonomy=="portfolio_categories"){
$start_page=get_option('rttheme_portf_page');
}
//получить начальную страницу
if ($start_page) get_start_page($start_page);
$term=get_term_by('slug',$term_slug, $taxonomy);
//родительские термины
if (is_object($term) && $term -> parent){
echo term_parents($term -> parent,'');
}
//текущий термин
if(is_object($term) && $term->slug) echo $delimiter."<a href=\"".get_term_link($term->slug,$taxonomy)."\" title=\"". $term->name ."\" >". $term->name ."</a>";
}
//Страницы
if ( is_page() ){
//родительские страницы
if ($post -> post_parent){
page_parents( $post -> post_parent,'');
}
//текущая страница
echo $delimiter ."". $post->post_title;
}
//Запись
elseif (is_single() && !is_attachment()){
// Получить тип записи
$post_type = get_post_type();
//Таксономии
if($post_type == 'products' || $post_type == 'portfolio'){
term_links();
//текущая страница
echo $delimiter."<a href=\"".get_permalink()."\" title=\"". get_the_title() ."\" >". get_the_title() ."</a>";
}else{
//Категории
//начальная страница
$start_page=get_option('rttheme_blog_page');
//получить начальную страницу
if ($start_page) get_start_page($start_page);
$category_id = get_the_category();
$category_id = $category_id[0]->cat_ID;//только одна категория может быть показана в списке - первая
echo $delimiter;
if($category_id){
echo get_category_parents($category_id, TRUE, $delimiter, FALSE );
}
echo $post->post_title;
}
//Категория
}elseif (is_category()){
//начальная страница
$start_page=get_option('rttheme_blog_page');
//получить начальную страницу
if ($start_page) get_start_page($start_page);
echo $delimiter."".get_category_parents(get_query_var('cat'), TRUE, $delimiter, FALSE);
//Таксономия
}elseif (is_tax()){
term_links();
} else {
echo $delimiter."";
wp_title('');
}
echo $after;
wp_reset_query();
}
?>
Может кто-нибудь помочь?
Строка 58, как указано в ошибке, выглядит следующим образом:
$parent_term = get_term_by('ID',$term_id, $taxonomy);
$term_parents = $delimiter."<a href=\"".get_term_link($parent_term->slug,$taxonomy)."\" title=\"". $parent_term->name ."\" >". $parent_term->name ."</a>" .$child_terms;
И наша ошибка:
Объект класса WP_Error не может быть преобразован в строку
Это означает, что один из элементов, которые добавляются, не является строкой "string"
, а представляет собой объект WP_Error
.
Подозрение падает на get_term_link
, который, вероятно, возвращает объект ошибки. Это может указывать на то, что:
- термин не существует
- таксономия не зарегистрирована или недействительна
- передаваемые значения неожиданно пусты
$parent_term
не является термином, а представляет собой объект ошибки
Из этого следует важный урок:
Иногда функции возвращают объекты ошибок, и вам нужно проверять это, а не просто предполагать успешное выполнение
Как проверять ошибки
Рассмотрим пример, который всегда завершится ошибкой:
$value = get_term_link( "not a real term","fake taxonomy" );
if ( is_wp_error( $value ) ) {
// что-то пошло не так
}
is_wp_error
вернет true
, если $value
является объектом ошибки. Некоторые функции могут возвращать false
или null
, поэтому также полезно использовать проверку !empty( $value )
Объекты ошибок могут содержать коды и сообщения об ошибках, и вы можете использовать метод get_error_message()
для их отображения:
$value = get_term_link( "not a real term","fake taxonomy" );
if ( is_wp_error( $value ) ) {
// что-то пошло не так
echo $value->get_error_message();
}
Вы также можете вручную установить для $value
значение по умолчанию
Заметка о глобальных переменных
В коде используются глобальные переменные, но их имена слишком общие, например, $taxonomy
. Другие плагины могут также использовать их, что может привести к конфликтам. То же самое относится и к именам функций.
Лучший вариант
Добавьте префиксы:
// функция для получения родительских терминов
function sergi_term_parents( $term_id, $child_terms ) {
global $sergi_taxonomy, $sergi_delimiter;
Идеальный вариант
Используйте внедрение зависимостей и исключите глобальные переменные:
// функция для получения родительских терминов
function sergi_term_parents( $term_id, $child_terms, $taxonomy, $delimeter ){
Теперь ваша функция term_parents
никогда не вызовет конфликтов и будет работать с любой таксономией или разделителем
