Wie erstelle ich den Status “Keine Variablen zuweisen”, wenn WP_Error einen Fehler austriggers?

Ich habe diesen Code, um Instagram-Bilder von einem bestimmten Konto zu scrappen:

username = $username; } private function build_endpoint() { /** * Builds the endpoint for the Instagram API, provided the username from constructor. * @param $end_cursor Used in case the user wants more pictures to be scrapped. */ return 'https://www.instagram.com/' . trim( strtolower( $this->username ) ) . '/?__a=1'; } private function get_json() { /** * GET's the data from Instagram, provided the endpoint. */ $request = wp_remote_get( $this->build_endpoint() ); if( is_wp_error( $request ) ) { return new WP_Error( 'site-down', esc_html__( 'Instagram may be down. Unable to communicate.', '_s') ); } elseif( wp_remote_retrieve_response_code( $request ) !== 200 ) { return new WP_Error( 'invalid-response', esc_html__( 'Got an invalid response.', '_s') ); } else { return wp_remote_retrieve_body( $request ); } } private function get_data() { /** * Ingests the data from get_json() then converts / decodes into an array. */ $data = json_decode( $this->get_json(), true); if ( is_wp_error( $data ) ) { return new WP_Error( 'invalid-data', esc_html__( 'Something is wrong. Did you enter the right username?', '_s' ) ); } else { return $data; } } protected function get_links() { /** * Based on the array generated from get_data(), some nodes have resulted that contain information about * each photo the user has, as such, we'll loop through each photo and access any data. * @see ['user']['media']['nodes'] - individual node / image. */ $response = $this->get_data(); foreach( $response['user']['media']['nodes'] as $node ) { // Check if type is video, if not, set default image array_push( $this->images, $node['thumbnail_src'] ); } return $this->images; } public function get_instagram_photos_links() { return $this->get_links(); } } 

Es gibt mehrere WP_Error , die vermutlich Fehler behandeln sollen, die von den Variablen stammen, nach denen sie WP_Error .

Also, innerhalb der Methode get_json() , habe ich:

 private function get_json() { /** * GET's the data from Instagram, provided the endpoint. */ $request = wp_remote_get( $this->build_endpoint() ); if( is_wp_error( $request ) ) { return new WP_Error( 'site-down', esc_html__( 'Instagram may be down. Unable to communicate.', '_s') ); } elseif( wp_remote_retrieve_response_code( $request ) !== 200 ) { return new WP_Error( 'invalid-response', esc_html__( 'Got an invalid response.', '_s') ); } else { return wp_remote_retrieve_body( $request ); } } 

Das sollte verhindern, dass $data irgendeinen Wert erhält, wenn es fehlschlägt. Was ich möchte / dachte, wäre (obwohl ich erkenne, dass ich zuerst $data deklariert habe):

Hey, WordPress, see this $data? Yea, don't assign anything to it if these WP_Errors say it's bad. Just drop it and break loop. .

Leider passiert das nicht und ich habe ein Widget dafür erstellt, mit:

  'custom_widget_instagram_pictures', 'description' => esc_html__('A widget to display instagram photos.', '_s') ); $control_ops = array('id_base' => 'custom_widget_instagram_pictures'); parent::__construct( 'custom_widget_instagram_pictures', __('_s: Instagram Widget', '_s_simple_image_widget'), $widget_ops, $control_ops ); } public function widget( $args, $instance ) { extract( $args ); $title = isset( $instance['title'] ) ? apply_filters('widget_title', $instance['title'] ) : ''; $username = isset( $instance['username'] ) ? $instance['username'] : ''; $profile_link = isset( $instance['profile_link'] ) ? $instance['profile_link'] : ''; echo ent2ncr( $before_widget ); if ( $title ) { echo ent2ncr( $before_title . $title . $after_title ); } ?> 
    get_instagram_photos_links(); foreach( $instagram_links as $link ) { ?>
  • <a href="https://wordpress.stackexchange.com/questions/290470/how-do-i-create-a-state-of-dont-assign-anything-to-variable-if-wp-error-throw/"><img src="https://wordpress.stackexchange.com/questions/290470/how-do-i-create-a-state-of-dont-assign-anything-to-variable-if-wp-error-throw/"/>
'', 'username' => '', 'profile_link' => '', ); $instance = wp_parse_args( (array) $instance, $defaults ); ?>

<label for="get_field_id( 'title' ); ?>">Widget Title:(Leave Blank to Hide)
<input class="widefat" id="get_field_id( 'title' ); ?>" name="get_field_name( 'title' ); ?>" value="" />

<label for="get_field_id( 'username' ); ?>">Username:
<input class="widefat" id="get_field_id( 'username' ); ?>" name="get_field_name( 'username' ); ?>" value="" />

<input class="checkbox" type="checkbox" id="get_field_id( 'profile_link' ); ?>" name="get_field_name( 'profile_link' ); ?>" /> <label for="get_field_id( 'profile_link' ); ?>">Show Instagram Button?

Und wenn ich einen falschen Benutzernamen eingeben, sagen: “kinfolk53252395932”, es wirft nur das:

Der Fehler

Wie kann ich das schaffen?

Solutions Collecting From Web of "Wie erstelle ich den Status “Keine Variablen zuweisen”, wenn WP_Error einen Fehler austriggers?"

Sieht so aus, als wäre die Zeile, die den Fehler angibt, eher diese

 $data = json_decode( $this->get_json(), true); 

So (ungeprüft) sollte es funktionieren:

 private function get_data() { /** * Ingests the data from get_json() then converts / decodes into an array. */ $json = $this->get_json(); if (is_wp_error($json)) { return new WP_Error( 'invalid-data', esc_html__( 'Something is wrong. Did you enter the right username?', '_s' ) ); } $data = json_decode( $json, true); if ( is_wp_error( $data ) ) { return new WP_Error( 'invalid-data', esc_html__( 'Something is wrong. Did you enter the right username?', '_s' ) ); } else { return $data; } } 

Ich bin eigentlich nicht mit WP_Error vertraut, aber sollen keine Fehler geworfen anstatt zurückgegeben werden?

Warum funktioniert das so? Nun, die PHP-Fehlermeldung sagt Ihnen, was schief läuft

json_decode () erwartet, dass Parameter 1 ein String ist, ein Objekt ist gegeben

 json_decode( $this->get_json(), ^ should be a string but is an object 

Aus Ihrem Code wissen wir, dass es ein Objekt von WP_Error , weil Sie das von get_json() .

Ich schätze das Wichtigste, was du mitnehmen solltest: Prüfe auf einen Fehler in einer Variablen / Rückgabe, bevor du es verwendest.