PHP Критическая ошибка: Объект класса WP_Error не может быть преобразован в строку

12 июн. 2017 г., 14:02:44
Просмотры: 42.3K
Голосов: 6

Мне нужна помощь с этим:

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(); 
}
?>

Может кто-нибудь помочь?

1
Комментарии

Что находится на строке 58 функции, упомянутой в ошибке? Где-то в коде что-то возвращает WP_Error, который затем преобразуется в строку.

Welcher Welcher
12 июн. 2017 г. 14:17:46
Все ответы на вопрос 1
0
16

Строка 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 никогда не вызовет конфликтов и будет работать с любой таксономией или разделителем

12 июн. 2017 г. 16:22:54