Этот пост в блоге изначально был размещен на dev.to https://dev.to/boussama/complete-guide-to-wordpress-menu-sourcing-in-gatsby-h76.
Используя подключаемый модуль Gatsby gatsby-source-wordpress, мы можем получить почти все с веб-сайта WordPress.
Есть только две вещи, которых нет по умолчанию, меню и пользовательские параметры.
Этот пост в блоге о меню.
1. Подготовка меню
Как я только что упомянул, меню WordPress по умолчанию недоступно в REST API WordPress, поэтому первый шаг — сделать его видимым.
Мы можем легко сделать это с помощью плагина wordpress WP REST API Menus, который вы не можете найти, когда хотите установить его прямо со своего веб-сайта.
Вам нужно скачать его и использовать WordPress Admin Plugin Upload, вот ссылка на учебник, если вы не знаете, как это сделать.
Теперь, когда вы установили плагин, ваши меню доступны на остальных API.
WP-REST-API V2 Menus — не лучший подключаемый модуль для установки.
2. Запрос:
После установки плагина, если вы запустите gatsby develop
, будет доступен новый запрос GraphQL:
- allWordpressWpApiMenusMenus для доступа к меню
- allWordpressWpApiMenusMenusItems для получения пункта меню
- allWordpressWpApiMenusMenuLocations, чтобы получить доступное местоположение меню
3. Полезный запрос:
Есть много полезных запросов, но в нашем случае нам просто нужно получить меню и их элементы «содержимое», и это запрос для этого.
{
allWordpressWpApiMenusMenusItems {
edges{
node {
slug
name
items {
title
url
}
}
}
}
}
Если ваше меню содержит подменю, используйте атрибут wordpress_childer.
{
allWordpressWpApiMenusMenusItems {
edges{
node {
slug
name
items {
title
url
wordpress_children {
title
url
}
}
}
}
}
}
Если вы хотите получить определенное меню, используйте фильтры, подобные этому
{
allWordpressWpApiMenusMenusItems(filter: {slug: {eq: "sidebar-menu"}}) {
edges{
node {
slug
name
items {
title
url
object_slug
wordpress_children {
title,
url
}
}
}
}
}
}
4. Получение меню
Полный код в компоненте Gatsby:
Теперь, когда у нас есть все, что нам нужно, это небольшой компонент для отображения меню Wordpress.
import React from "react" import { StaticQuery, graphql } from "gatsby"
export default () => ( <StaticQuery query={graphql` query { allWordpressWpApiMenusMenusItems( filter: { slug: { eq: "sidebar-menu" } } ) { edges { node { slug name items { title url object_slug wordpress_children { title url } } } } } } `} render={data => { return ( <nav className="menu"> <ul className="nav flex-column"> {data && data.allWordpressWpApiMenusMenusItems && data.allWordpressWpApiMenusMenusItems.edges && data.allWordpressWpApiMenusMenusItems.edges[0] && data.allWordpressWpApiMenusMenusItems.edges[0].node && data.allWordpressWpApiMenusMenusItems.edges[0].node.items && data.allWordpressWpApiMenusMenusItems.edges[0].node.items.map( prop => { return ( <li className="nav-item"> <a className="nav-link active" href={prop.url} alt={prop.title} > {prop.title} </a> <div className="sub-menu"> {prop && prop.wordpress_children && prop.wordpress_children.map(child => { console.log("child ", child)
return ( <a className="dropdown-item" href={child.url} alt={child.title} > {child.title} </a> ) })} </div> </li> ) } )} </ul> </nav> ) }} /> )
5. Правильный URL
Если ваше доменное имя Wordpress не совпадает с вашим веб-сайтом Gatsby, не забудьте заменить их.
В gatsby-config.js укажите это в объявлении плагина.
searchAndReplaceContentUrls: {
sourceUrl: "http://localhost:8080",
replacementUrl: "http://localhost:8000",
}
вот полный пример:
{
resolve: "gatsby-source-wordpress",
options: {
baseUrl: "http://localhost:8080/",
protocol: "http",
hostingWPCOM: false,
useACF: false,
excludedRoutes: ["**/settings", "**/themes", "**/users/me"],
verboseOutput: true,
searchAndReplaceContentUrls: {
sourceUrl: "http://localhost:8080",
replacementUrl: "http://localhost:3000",
},
},
}
6. Заключение
Это не всегда хороший подход, а иногда и излишний, но приятно знать все о меню Wordpress и их использовании в Gatsby. У вас может быть другое мнение или другой метод.
Пожалуйста, поделитесь со мной своей точкой зрения в комментариях.