Eroare PHP Catchable fatală: Obiectul de tip WP_Error nu poate fi convertit în string

12 iun. 2017, 14:02:44
Vizualizări: 42.3K
Voturi: 6

Am nevoie de ajutor cu următoarea eroare:

PHP Catchable fatal error: Object of class WP_Error could not be converted to string în /hosting/www/ortopediairati.es/public/wp-content/themes/irati/rt-framework/functions/rt_breadcrumb.php la linia 58

Am actualizat la WordPress 4.8 și site-ul nu mai funcționează corect.

Fișierul complet este aici:

<?php

/* Funcția RT-Breadcrumb */
function rt_breadcrumb(){
global $taxonomy,$term_slug,$post,$delimiter;

if(!get_option('rttheme_breadcrumb_menus')){
    return false;
}

//Markup 
$before='<div class="breadcrumb">'.wpml_t(THEMESLUG, 'Breadcrumb Menu Text', get_option(THEMESLUG.'_breadcrumb_text')).' ';
$after='</div>';
$delimiter=' | ';

/* Breadcrumb 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;

//Pagina Home
echo "<a href=\"". BLOGURL ."\" title=\"". get_bloginfo('name')."\">".__( 'Home', 'rt_theme' )."</a>";

// funcție pagini părinte
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;

}


// funcție termeni părinte
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;

}

//obține pagina de start
function get_start_page($start_page){
    global $delimiter;

    //pagini părinte de start
    $get_start_page=get_page($start_page);
    if ($get_start_page -> post_parent){
        page_parents( $get_start_page -> post_parent,''); 
    }

    //pagina de start
    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>";
    }
}

//termeni
function term_links(){
    global $taxonomy,$post_type,$term_slug,$delimiter;

    //Găsește pagina de start și definește numele taxonomiei
    if($taxonomy=="product_categories"){
        $start_page=get_option('rttheme_product_list');
    }elseif($taxonomy=="portfolio_categories"){
        $start_page=get_option('rttheme_portf_page');
    }   

    //obține pagina de start
    if ($start_page) get_start_page($start_page);


    $term=get_term_by('slug',$term_slug, $taxonomy);

    //termeni părinte
    if (is_object($term) && $term -> parent){
        echo term_parents($term -> parent,'');   
    } 

    //termenul curent
    if(is_object($term) && $term->slug) echo  $delimiter."<a href=\"".get_term_link($term->slug,$taxonomy)."\" title=\"". $term->name ."\" >". $term->name ."</a>";
}



//Pagini
if ( is_page() ){
    //pagini părinte
    if ($post -> post_parent){
        page_parents( $post -> post_parent,''); 
    } 

    //pagina curentă
    echo  $delimiter ."". $post->post_title;
}

//Singulară
elseif (is_single() && !is_attachment()){ 
    // Obține tipul de postare
    $post_type = get_post_type();

    //Taxonomii
    if($post_type == 'products' || $post_type == 'portfolio'){

        term_links();
        //pagina curentă
        echo  $delimiter."<a href=\"".get_permalink()."\" title=\"". get_the_title() ."\" >". get_the_title() ."</a>";

    }else{
    //Categorii

    //pagina de start
    $start_page=get_option('rttheme_blog_page');

    //obține pagina de start
    if ($start_page) get_start_page($start_page);

        $category_id = get_the_category();
        $category_id = $category_id[0]->cat_ID;//doar o categorie poate fi afișată în listă - prima
        echo $delimiter;
        if($category_id){
            echo get_category_parents($category_id, TRUE, $delimiter, FALSE );
        }
        echo $post->post_title;
    }

//Categorie
}elseif (is_category()){
    //pagina de start
    $start_page=get_option('rttheme_blog_page');

    //obține pagina de start
    if ($start_page) get_start_page($start_page);

        echo $delimiter."".get_category_parents(get_query_var('cat'), TRUE, $delimiter, FALSE);

//Taxonomie
}elseif (is_tax()){
    term_links();
} else {
    echo  $delimiter."";
    wp_title('');
}

echo $after;

wp_reset_query(); 
}
?>

Poate cineva să mă ajute?

1
Comentarii

Ce se află pe linia 58 a funcției menționate în eroare? Undeva pe parcurs, ceva returnează un WP_Error și este convertit într-un șir de caractere.

Welcher Welcher
12 iun. 2017 14:17:46
Toate răspunsurile la întrebare 1
0
16

Linia 58, așa cum indică eroarea, este această linie:

$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;

Iar eroarea noastră este:

Obiectul de clasă WP_Error nu a putut fi convertit în șir

Ceea ce înseamnă că unul dintre acele elemente care sunt concatenate nu este un "șir", ci de fapt un obiect WP_Error.

Aș bănui că get_term_link este cel care returnează obiectul de eroare, ceea ce sugerează fie că:

  • termenul nu există
  • taxonomia nu este înregistrată sau validă
  • valorile transmise sunt neașteptat de goale
  • $parent_term nu este un termen, ci un obiect de eroare

Ceea ce ne duce la lecția de aici:

Uneori funcțiile returnează obiecte de eroare și trebuie să verifici acest lucru, nu doar să presupui că a reușit

Cum să verifici erorile

Să luăm un exemplu care va eșua întotdeauna:

$value = get_term_link( "nu este un termen real","taxonomie falsă" );
if ( is_wp_error( $value ) ) {
    // ceva nu a funcționat
}

is_wp_error va fi adevărat dacă $value este un obiect de eroare. Unele funcții pot returna false sau null, așa că !empty( $value ) este de asemenea o verificare utilă

Obiectele de eroare pot conține coduri și mesaje de eroare și poți folosi metoda get_error_message() pentru a le afișa:

$value = get_term_link( "nu este un termen real","taxonomie falsă" );
if ( is_wp_error( $value ) ) {
    // ceva nu a funcționat
    echo $value->get_error_message();
}

Ai putea de asemenea să setezi manual $value la o valoare implicită în loc

O notă finală despre globale

Codul folosește variabile globale, dar aceste variabile au nume super generice precum $taxonomy. Alte plugin-uri le pot folosi și ele și pot intra în conflict. Același lucru este valabil și pentru numele de funcții.

Mai bine

Prefixează-le:

// funcția pentru părinții termenului
function sergi_term_parents( $term_id, $child_terms ) {
    global $sergi_taxonomy, $sergi_delimiter;

Cel mai bine

Folosește injectarea dependențelor și elimină variabilele globale cu totul:

// funcția pentru părinții termenului
function sergi_term_parents( $term_id, $child_terms, $taxonomy, $delimeter ){

Acum funcția ta term_parents nu va intra niciodată în conflict și funcționează pentru orice taxonomie sau delimitator

12 iun. 2017 16:22:54