Reputation: 23
I'm going to post my question again but differently this time. So this is my current app in React Native:
Where you see the picture of the suitcases, I need to put a picture from the post that I made in Wordpress. The title and description are also from the same posts, trough an API.
This is the current code:
return (
<View style={styles.box}>
<TouchableOpacity activeOpacity={0.5}>
<View style={styles.listItem}>
<Image
style={styles.image}
source={{uri: 'https://www.samsonite.be/on/demandware.static/-/Sites/default/dw851ab6f0/images/misc/sams_share-image.jpg'}}
/>
<Text style={styles.title}>{item.title.rendered}</Text>
<Text style={styles.eigenschappen}>{item.yoast_head_json.og_description}</Text>
<Pressable style={styles.seeProduct} onPress={() => navigation.navigate("DetailScreen", {itemTitle: item.title.rendered})}>
<Text style={styles.text}>Bekijk product: {item.title.rendered}</Text>
</Pressable>
</View>
</TouchableOpacity >
</View>
)
WITH:
const AllSuitcasesScreen = ({ navigation }) => {
const [suitcases, setSuitcases] = useState([]);
const getSuitcases = async () => {
try {
const response = await fetch("https://evivermeeren.com/wp-json/wp/v2/posts?categories=59", {
}
)
const json = await response.json();
console.log(json);
setSuitcases(json);
} catch (error) {
console.error(error);
}
}
useEffect(() => {
getSuitcases();
}, []);
const [input, setInput] = useState("");
console.log(input);
return (
<View style={styles.screen}>
<View style={styles.flexbox2}>
<Text style={styles.products}>Onze koffers</Text>
<View style={styles.shoppingcart}>
<Image
style={styles.icon}
source={{uri: 'https://cdn-icons-png.flaticon.com/512/1413/1413908.png'}}
/>
<Text style={styles.number}>0</Text>
</View>
</View>
<TextInput
value={input}
placeholder="Zoek op naam, maat, kleur, materiaal of prijs..."
style={styles.input}
onChangeText={(text) => setInput(text)}
/>
<SearchFilter data={suitcases} input={input} setInput={setInput}/>
</View>
);
}
This is the line I want to change:
<Image
style={styles.image}
source={{uri:'https://www.samsonite.be/on/demandware.static/-/Sites/default/dw851ab6f0/images/misc/sams_share-image.jpg'}}
/>
And in the JSON file, this is what I get:
[
{
"id": 2484,
"date": "2022-12-17T15:02:56",
"date_gmt": "2022-12-17T15:02:56",
"guid": {
"rendered": "https://evivermeeren.com/?p=2484"
},
"modified": "2022-12-18T10:39:37",
"modified_gmt": "2022-12-18T10:39:37",
"slug": "zwart-groot-hard-249euro",
"status": "publish",
"type": "post",
"link": "https://evivermeeren.com/zwart-groot-hard-249euro/koffers/",
"title": {
"rendered": "Evo L Black"
},
"content": {
"rendered": "\n<p id=\"desc\">Een grote koffer in een zwarte kleur, gemaakt van hard materiaal. De prijs van deze koffer is €249.</p>\n",
"protected": false
},
"excerpt": {
"rendered": "<p>Een grote koffer in een zwarte kleur, gemaakt van hard materiaal. De prijs van deze koffer is €249.</p>\n",
"protected": false
},
"author": 1,
"featured_media": 2229,
"comment_status": "closed",
"ping_status": "closed",
"sticky": false,
"template": "",
"format": "standard",
"meta": [],
"categories": [
59
],
"tags": [],
"yoast_head": "<!-- This site is optimized with the Yoast SEO plugin v19.12 - https://yoast.com/wordpress/plugins/seo/ -->\n<title>Evo L Black - Evi Vermeêren</title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" />\n<link rel=\"canonical\" href=\"https://evivermeeren.com/zwart-groot-hard-249euro/koffers/\" />\n<meta property=\"og:locale\" content=\"nl_NL\" />\n<meta property=\"og:type\" content=\"article\" />\n<meta property=\"og:title\" content=\"Evo L Black - Evi Vermeêren\" />\n<meta property=\"og:description\" content=\"Een grote koffer in een zwarte kleur, gemaakt van hard materiaal. De prijs van deze koffer is €249.\" />\n<meta property=\"og:url\" content=\"https://evivermeeren.com/zwart-groot-hard-249euro/koffers/\" />\n<meta property=\"og:site_name\" content=\"Evi Vermeêren\" />\n<meta property=\"article:published_time\" content=\"2022-12-17T15:02:56+00:00\" />\n<meta property=\"article:modified_time\" content=\"2022-12-18T10:39:37+00:00\" />\n<meta property=\"og:image\" content=\"https://evivermeeren.com/wp-content/uploads/2022/12/zwart-klein-4-300-hard-4-e1670410664142.webp\" />\n\t<meta property=\"og:image:width\" content=\"200\" />\n\t<meta property=\"og:image:height\" content=\"300\" />\n\t<meta property=\"og:image:type\" content=\"image/webp\" />\n<meta name=\"author\" content=\"evivermeeren\" />\n<meta name=\"twitter:card\" content=\"summary_large_image\" />\n<meta name=\"twitter:label1\" content=\"Geschreven door\" />\n\t<meta name=\"twitter:data1\" content=\"evivermeeren\" />\n\t<meta name=\"twitter:label2\" content=\"Verwachte leestijd\" />\n\t<meta name=\"twitter:data2\" content=\"1 minuut\" />\n<script type=\"application/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https://evivermeeren.com/zwart-groot-hard-249euro/koffers/#article\",\"isPartOf\":{\"@id\":\"https://evivermeeren.com/zwart-groot-hard-249euro/koffers/\"},\"author\":{\"name\":\"evivermeeren\",\"@id\":\"https://evivermeeren.com/#/schema/person/d74bd513920b6e8cf81e3693e10c9de0\"},\"headline\":\"Evo L Black\",\"datePublished\":\"2022-12-17T15:02:56+00:00\",\"dateModified\":\"2022-12-18T10:39:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https://evivermeeren.com/zwart-groot-hard-249euro/koffers/\"},\"wordCount\":20,\"publisher\":{\"@id\":\"https://evivermeeren.com/#/schema/person/d74bd513920b6e8cf81e3693e10c9de0\"},\"articleSection\":[\"Koffers\"],\"inLanguage\":\"nl\"},{\"@type\":\"WebPage\",\"@id\":\"https://evivermeeren.com/zwart-groot-hard-249euro/koffers/\",\"url\":\"https://evivermeeren.com/zwart-groot-hard-249euro/koffers/\",\"name\":\"Evo L Black - Evi Vermeêren\",\"isPartOf\":{\"@id\":\"https://evivermeeren.com/#website\"},\"datePublished\":\"2022-12-17T15:02:56+00:00\",\"dateModified\":\"2022-12-18T10:39:37+00:00\",\"breadcrumb\":{\"@id\":\"https://evivermeeren.com/zwart-groot-hard-249euro/koffers/#breadcrumb\"},\"inLanguage\":\"nl\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https://evivermeeren.com/zwart-groot-hard-249euro/koffers/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://evivermeeren.com/zwart-groot-hard-249euro/koffers/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https://evivermeeren.com/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Evo L Black\"}]},{\"@type\":\"WebSite\",\"@id\":\"https://evivermeeren.com/#website\",\"url\":\"https://evivermeeren.com/\",\"name\":\"Evi Vermeêren\",\"description\":\"\",\"publisher\":{\"@id\":\"https://evivermeeren.com/#/schema/person/d74bd513920b6e8cf81e3693e10c9de0\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https://evivermeeren.com/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"nl\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https://evivermeeren.com/#/schema/person/d74bd513920b6e8cf81e3693e10c9de0\",\"name\":\"evivermeeren\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl\",\"@id\":\"https://evivermeeren.com/#/schema/person/image/\",\"url\":\"https://evivermeeren.com/wp-content/uploads/2022/11/logo.png\",\"contentUrl\":\"https://evivermeeren.com/wp-content/uploads/2022/11/logo.png\",\"width\":661,\"height\":824,\"caption\":\"evivermeeren\"},\"logo\":{\"@id\":\"https://evivermeeren.com/#/schema/person/image/\"},\"sameAs\":[\"https://evivermeeren.com\"],\"url\":\"https://evivermeeren.com/author/evivermeeren/\"}]}</script>\n<!-- / Yoast SEO plugin. -->",
"yoast_head_json": {
"title": "Evo L Black - Evi Vermeêren",
"robots": {
"index": "index",
"follow": "follow",
"max-snippet": "max-snippet:-1",
"max-image-preview": "max-image-preview:large",
"max-video-preview": "max-video-preview:-1"
},
"canonical": "https://evivermeeren.com/zwart-groot-hard-249euro/koffers/",
"og_locale": "nl_NL",
"og_type": "article",
"og_title": "Evo L Black - Evi Vermeêren",
"og_description": "Een grote koffer in een zwarte kleur, gemaakt van hard materiaal. De prijs van deze koffer is €249.",
"og_url": "https://evivermeeren.com/zwart-groot-hard-249euro/koffers/",
"og_site_name": "Evi Vermeêren",
"article_published_time": "2022-12-17T15:02:56+00:00",
"article_modified_time": "2022-12-18T10:39:37+00:00",
"og_image": [
{
"width": 200,
"height": 300,
"url": "https://evivermeeren.com/wp-content/uploads/2022/12/zwart-klein-4-300-hard-4-e1670410664142.webp",
"type": "image/webp"
}
],
So I need this link:
"url": "https://evivermeeren.com/wp-content/uploads/2022/12/zwart-klein-4-300-hard-4-e1670410664142.webp",
To get here:
<Image
style={styles.image}
source={{uri:'https://www.samsonite.be/on/demandware.static/-/Sites/default/dw851ab6f0/images/misc/sams_share-image.jpg'}}
/>
I tried doing this:
<Image
style={styles.image}
source={{uri:item.yoast_head_json.og_image.url}}
/>
But it did not work. I get the error: 'undefined is not an object'.
Does anyone know how to fix this?
Upvotes: 0
Views: 189
Reputation: 465
You're getting that because you're not accessing the og_image
. Try it like this, you'll see that you'll get the URL. You also have to use optional chaining using a ?
to catch null/undefined errors. I used your suitcase variable to map through.
suitcases.map((item) => {
item.yoast_head_json?.og_image?.map((item2) => console.log(item2.url));
});
Adjusted solution to fit your case:
This might not be the cleanest solution but it works:
Your Suitcases
component trimmed down, passing the necessary URL to the SearchFilter
Component:
import { View } from "react-native";
import { useEffect, useState } from "react";
import { SearchFilter } from "./SearchFilter";
const Suitcases = () => {
const [suitcases, setSuitcases] = useState([]);
const getSuitcases = async () => {
try {
const response = await fetch(
"https://evivermeeren.com/wp-json/wp/v2/posts?categories=59"
);
const json = await response.json();
setSuitcases(json);
} catch (error) {}
};
useEffect(() => {
getSuitcases();
}, []);
return (
<View
style={{
flex: 1,
}}
>
{suitcases && <SearchFilter suitcases={suitcases} />}
</View>
);
};
export default Suitcases;
Your SearchFilter Component:
import { View, Image } from "react-native";
export const SearchFilter = ({ suitcases }) => {
return (
<View style={{ flex: 1 }}>
{suitcases.map((item) => {
item.yoast_head_json.og_image.map((item2) => {
console.log(item2.url, "item url");
return (
<Image
style={{ width: item2.width, height: item2.height }}
source={{
uri: item2.url,
}}
/>
);
});
})}
</View>
);
};
This should work, if not let me know.
Upvotes: 1