I am trying to fetch some content from a CPT using actions.source.fetch()
however I am facing some weird issues. Here is my case:
- I want to fetch media that has a specific parent. In my frontity settings I have this
postTypes: [
{
type: "product",
endpoint: "product",
archive: "/product",
},
{
type: "media",
endpoint: "media",
archive: "/media",
},
],
- In my Gallery component I want to fetch media that belongs to a specific parent . My code:
useEffect(() => {
actions.source.fetch('/media?parent=914');
}, [])
const data = state.source.get("/media?parent=914");
const images =
data.isReady &&
data.items.map(({ type, id }) => state.source[type][id]);
However once I do this, inside images I get basically everything from my media folder, not only the one related to the parent(914).
If I just manually go the the url in my browser site.com/wp-json/wp/v2/media?parent=914, then I see everything correctly, namely only the images with parent=914.
- Moreover, if I simply navigate to the browser console and type
frontity.ate.source.get("/media?parent=914")
i get the same response. I can basically see all media, lots and lots of entries.
So i am wondering if what I am trying to do is even possible and if yes, what am I doing wrong. I also realize that I can filter the images to get the correct ones but I don’t understand why I have to fetch 1000 images when I need 10 in that specific context.
Hopefully someone can help clarify this.
Greetings,
Nikolay
Hi @ni.bonev
media
is an endpoint in the WP REST API, but it’s not a queryable path or link, and state.source.get()
requires such a link or path (see docs here).
Instead you need to use libraries.source.api.get()
and then libraries.source.populate()
. (docs here and here).
Hopefully this will guide you to solving your problem, and you won’t need to define media
as a postType in the postTypes
array in Frontity.
Let us know how you get on with this.
1 Like
Hi @mburridge,
that was the solution. Thanks for clarifying. Should have read the documentation better.
Here is how my final code looks. Maybe it helps someone else as well.
import React, { useEffect, useState} from 'react';
import { connect, styled } from 'frontity';
import ImageGallery from "react-image-gallery";
const Gallery = ({ productId, state, libraries }) => {
const [data, setData] = useState({
isReady: false,
items: []
});
useEffect(() => {
getMedia(productId, libraries, state, setData);
}, [])
const images = data.isReady && data.items.map(({ type, id }) => state.source[type][id])
let imageLinks = [];
images && images.map(image => {
imageLinks.push({
original: image.media_details.sizes.medium.source_url,
thumbnail:
image.media_details.sizes.woocommerce_gallery_thumbnail.source_url,
});
});
return (
<GalleryWrapper>
{imageLinks.length > 0 && (
<ImageGallery
items={imageLinks}
slideDuration={0}
showPlayButton={false}
showFullscreenButton={false}
/>
)}
</GalleryWrapper>
);
};
export default connect(Gallery)
const GalleryWrapper = styled.div`
.image-gallery-left-nav .image-gallery-svg, .image-gallery-right-nav .image-gallery-svg {
height: 40px;
width: 40px;
}
`;
const getMedia = async (parentId, libraries, state, setData) => {
// Get other images
const response = await libraries.source.api.get({
endpoint: "media",
params: {
parent: parentId,
},
});
const entitiesAdded = await libraries.source.populate({ response, state });
await setData({
isReady: true,
items: entitiesAdded
});
};
2 Likes
Awesome @ni.bonev, glad that helped you find a solution.
Hi @mburridge
const response = libraries.source.api.get({ endpoint: "media", params: {
parent: "826",
} });
const entitiesAdded = libraries.source.populate({ response, state });
I am trying to get the media using the above method, but I am getting below error
(node:6756) UnhandledPromiseRejectionWarning: TypeError: response.json is not a function
at Object.populate (webpack-internal:///./node_modules/@frontity/wp-source/src/libraries/populate.ts:35:27)
Hi @parth.nextbits
I think you need to wrap that code in an async
function and then await
each of the two promises.
Hope this helps.
1 Like
Hi,
Could you show me how you config webpack for react-image-gallery ?
I have problem with loading styles for react-image-gallery
Hey,
Last time I worked frontity we were not having the option to configure webpack so I haven’t done anything there.
I did however have issues with the styles, so I did a manual import:
import GalleryStyles from "../../../node_modules/react-image-gallery/styles/css/image-gallery.css";
And then I am loading those styles on the pages where i need the gallery.
{data && data.isProduct && <Global styles={css(GalleryStyles)} />}
Hope that helps.