TutorialesWordpress

Cómo arreglar el “Instagram has returned invalid data” del template Flatsome

Publicado el
Cómo arreglar el "Instagram has returned invalid data" del template Flatsome

¿Te sale el error “Instagram has returned invalid data” en tu blog/web en WordPress con el template Flatsome con el plugin de Instagram? No te preocupes, nos ha pasado a todos. Por suerte hay solución.

¿Qué ha pasado?

A principios de 2018, a finales de Enero para ser más exactos, anunciaron cambios de la API de Instagram por lo que no fue una sorpresa para los desarrolladores de aplicaciones ni de plugins ya que deberían de estar preparados y que deberían implementar una función de actualización automática para su complemento, ya que esta nueva API de gráficos provocará cambios frecuentes de los servicios conectados a Instagram.

Es curioso porque hay gente que paga por unos templates/themes/plugins que contienen estas APIs y, aunque la mayoría de los buenos plugins de Instagram volvieron a la normalidad en algunas horas, otros llevan meses sin arreglar. Y este es el caso del template Flatsome, que tiene la opción de añadir un bloque de una cuenta de Instagram en tu blog/web pero que desde comienzo de años da el siguiente error: “Instagram has returned invalid data”.

¿Cómo se soluciona?

Por suerte, internet es grande y la gente ha dado algunas soluciones para reparar este fallo. Para ello tienes que tener acceso al servidor donde tengas alojado la web/blog vía FTP o en el directorio local donde lo tengas y modificar el archivo ux_instagram_feed.php que está alojado dentro de wp-content/themes/flatsome/inc/shortcodes. Tienes que sustituir completamente la función flatsome_scrape_instagram por las siguientes líneas de código o descargar el siguiente archivo y sustituirlo por el anteriormente mencionado:

function flatsome_scrape_instagram( $username ) {

$username = trim( strtolower( $username ) );

switch ( substr( $username, 0, 1 ) ) {
case ‘#’:
$url = ‘https://instagram.com/explore/tags/’ . str_replace( ‘#’, ”, $username );
$transient_prefix = ‘h’;
break;

default:
$url = ‘https://instagram.com/’ . str_replace( ‘@’, ”, $username );
$transient_prefix = ‘u’;
break;
}

if ( false === ( $instagram = get_transient( ‘insta-a10-‘ . $transient_prefix . ‘-‘ . sanitize_title_with_dashes( $username ) ) ) ) {

$remote = wp_remote_get( $url );

if ( is_wp_error( $remote ) ) {
return new WP_Error( ‘site_down’, esc_html__( ‘Unable to communicate with Instagram.’, ‘wp-instagram-widget’ ) );
}

if ( 200 !== wp_remote_retrieve_response_code( $remote ) ) {
return new WP_Error( ‘invalid_response’, esc_html__( ‘Instagram did not return a 200.’, ‘wp-instagram-widget’ ) );
}

$shards = explode( ‘window._sharedData = ‘, $remote[‘body’] );
$insta_json = explode( ‘;’, $shards[1] );
$insta_array = json_decode( $insta_json[0], true );

if ( ! $insta_array ) {
return new WP_Error( ‘bad_json’, esc_html__( ‘Instagram has returned invalid data.’, ‘wp-instagram-widget’ ) );
}

if ( isset( $insta_array[‘entry_data’][‘ProfilePage’][0][‘graphql’][‘user’][‘edge_owner_to_timeline_media’][‘edges’] ) ) {
$images = $insta_array[‘entry_data’][‘ProfilePage’][0][‘graphql’][‘user’][‘edge_owner_to_timeline_media’][‘edges’];
} elseif ( isset( $insta_array[‘entry_data’][‘TagPage’][0][‘graphql’][‘hashtag’][‘edge_hashtag_to_media’][‘edges’] ) ) {
$images = $insta_array[‘entry_data’][‘TagPage’][0][‘graphql’][‘hashtag’][‘edge_hashtag_to_media’][‘edges’];
} else {
return new WP_Error( ‘bad_json_2’, esc_html__( ‘Instagram has returned invalid data.’, ‘wp-instagram-widget’ ) );
}

if ( ! is_array( $images ) ) {
return new WP_Error( ‘bad_array’, esc_html__( ‘Instagram has returned invalid data.’, ‘wp-instagram-widget’ ) );
}

$instagram = array();

foreach ( $images as $image ) {
if ( true === $image[‘node’][‘is_video’] ) {
$type = ‘video’;
} else {
$type = ‘image’;
}

$caption = __( ‘Instagram Image’, ‘wp-instagram-widget’ );
if ( ! empty( $image[‘node’][‘edge_media_to_caption’][‘edges’][0][‘node’][‘text’] ) ) {
$caption = wp_kses( $image[‘node’][‘edge_media_to_caption’][‘edges’][0][‘node’][‘text’], array() );
}

$instagram[] = array(
‘description’ => $caption,
‘link’ => trailingslashit( ‘//instagram.com/p/’ . $image[‘node’][‘shortcode’] ),
‘time’ => $image[‘node’][‘taken_at_timestamp’],
‘comments’ => $image[‘node’][‘edge_media_to_comment’][‘count’],
‘likes’ => $image[‘node’][‘edge_liked_by’][‘count’],
‘thumbnail’ => preg_replace( ‘/^https?\:/i’, ”, $image[‘node’][‘thumbnail_resources’][0][‘src’] ),
‘small’ => preg_replace( ‘/^https?\:/i’, ”, $image[‘node’][‘thumbnail_resources’][2][‘src’] ),
‘large’ => preg_replace( ‘/^https?\:/i’, ”, $image[‘node’][‘thumbnail_resources’][4][‘src’] ),
‘original’ => preg_replace( ‘/^https?\:/i’, ”, $image[‘node’][‘display_url’] ),
‘type’ => $type,
);
} // End foreach().

// do not set an empty transient – should help catch private or empty accounts.
if ( ! empty( $instagram ) ) {
$instagram = base64_encode( serialize( $instagram ) );
set_transient( ‘insta-a10-‘ . $transient_prefix . ‘-‘ . sanitize_title_with_dashes( $username ), $instagram, apply_filters( ‘null_instagram_cache_time’, HOUR_IN_SECONDS * 2 ) );
}
}

if ( ! empty( $instagram ) ) {

return unserialize( base64_decode( $instagram ) );

} else {

return new WP_Error( ‘no_images’, esc_html__( ‘Instagram did not return any images.’, ‘wp-instagram-widget’ ) );

}
}

y después guardamos. Con ésto ya tienes el plugin modificado y funcionando correctamente otra vez.

Espero que te haya funcionado aunque si tienes algún problema o duda puedes dejarme un comentario en este post.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.