WooCommerce 是用於構建電子商務應用程式的最流行的 WordPress 外掛之一。除了在傳統的 WordPress 應用程式中使用 WooCommerce 外,您還可以將其用作無頭解決方案。
本文將教你如何使用部署的 React 構建無頭 WooCommerce 應用程式。
無頭 WooCommerce 簡介
術語 “無頭電子商務” 是指電子商務應用程式的後臺(頭)與前臺(體)分離。無頭架構通過 API 在電子商務解決方案的展示層(前端)和應用層(後端)之間傳遞請求。
應用程式介面(API)定義了中間層之間的互動,允許企業在不影響應用層功能的情況下更改表現層,並更新、編輯或新增產品到多個應用層。
在無頭 WooCommerce 應用程式中,WooCommerce API 就是一箇中介,提供前臺和後臺之間的通訊。除了上述優點外,這還支援靈活、可擴充套件的前端開發,使您能夠專注於使用 React 或 Vue 等現代技術棧製作引人入勝的動態使用者介面。
此外,使用無頭 WooCommerce 還能幫助您適應不斷變化的客戶需求和技術進步,從而使電子商務基礎架構面向未來。您可以毫不費力地更新前端元件,同時確保後臺 WooCommerce 平臺的穩定性和可靠性。
傳統的電子商務應用程式和無頭 WooCommerce 應用程式。
與傳統的 WordPress 電子商務設定相比,這種現代方法具有眾多優勢。
既然你已經瞭解了什麼是無頭 WooCommerce 應用程式及其優勢,那麼是時候為自己建立一個了。使用 WordPress、React 和 WooCommerce 外掛,您將建立一個電子商務應用程式並將其部署到伺服器上。
先決條件
在開始之前,請確保您具備以下條件:
無頭 WooCommerce 的優勢
當您為自己的 WooCommerce 應用程式選擇無頭路徑時,您將獲得一系列好處,尤其是讓一個後臺支援您應用程式的各種前端的靈活性。
以下是無頭 WooCommerce 的其他一些優勢:
- 增強了定製功能 – 您可以使用任何網路框架,隨心所欲地構建您的 WooCommerce 應用程式。
- 提高網站效能 – 您可以利用 React 和 Vue 等快速網路框架來顯著提高網站效能。
- 搜尋引擎優化優勢 – 您可以更靈活地控制搜尋引擎優化策略,從而實現業務目標。
- 更好的可擴充套件性 – 您的網站可以更有效地擴充套件,即使在高流量期間也能確保效能流暢。
- 創造獨特客戶體驗的能力 – 您可以擺脫傳統模板的束縛。您可以為客戶打造創新的個性化體驗。
設定無頭 WooCommerce 網站
以下是設定 WooCommerce 網站的分步指南:
- 登入 MyKinsta 面板
- 導航至新增 Add Service > WordPress site。
- 選擇 Install WordPress 選項。
- 在 Add new WordPress site 頁面,填寫安裝 WordPress 所需的欄位。
- 在單擊 “Continue” 之前,選中 “Install WooCommerce” 框。
安裝 WordPress 和 WooCommerce 外掛。
啟用 WooCommerce 外掛
- 在 MyKinsta 控制面板上,單擊側邊欄上的 “Domains“。
- 在 “Domains” 頁面上,單擊 “Open WordPress Admin“。
- 登入 WordPress 管理面板,導航至外掛,選擇 WooCommerce 外掛並將其啟用。
啟用 WooCommerce 外掛。
注:如果您使用的是 Kinsta,安裝過程中不會要求您提供檔案傳輸協議(FTP)的詳細資訊。但是,如果您使用本地安裝的 WordPress,則必須提供 FTP 詳細資訊。繼續為無頭操作配置 WooCommerce 外掛。
為無頭操作配置 WooCommerce
配置 WooCommerce 為無頭操作:
- 登入 WordPress 管理儀表板。在側邊欄上,單擊 WooCommerce > Settings。
- 在 “Settings” 頁面上,單擊 “Advanced” 選項卡。然後,單擊 Rest API。
- 現在點選 Add key。為 REST API 新增金鑰:
- 單擊 Create an API key。給新的 REST API 新增描述,將 Permissions 欄位設定為 “Read/Write“,然後單擊 “Generate API key“。生成 WooCommerce API 金鑰:
- 複製消費者金鑰和祕密,並將它們安全地儲存起來,以便在 React 應用程式中使用。
- 最後,調整固定連結結構,確保在請求 API 時返回 JSON 資料。在 WordPress 管理儀表板上,單擊”設定“>”固定連結“,然後選擇 “文章名“。
在繼續之前,請為您的 WooCommerce 商店新增一些產品。導航至 WordPress 面板中的 WooCommerce 部分,點選產品,然後根據提示新增產品。您也可以為您的商店匯入這些示例產品。
安裝好 WordPress 和 WooCommerce 後,你就可以專注於無頭電子商務應用的前端了。
設定 React 專案
下面介紹如何建立 React 專案:
- 在首選目錄中,使用以下命令建立 React 專案:
# Remember to replace <app-name> with your preferred name# With npxnpx create-react-app <app-name> && cd <app-name># With yarnyarn create react-app <app-name> && cd <app-name># Remember to replace <app-name> with your preferred name # With npx npx create-react-app <app-name> && cd <app-name> # With yarn yarn create react-app <app-name> && cd <app-name>
# Remember to replace <app-name> with your preferred name # With npx npx create-react-app <app-name> && cd <app-name> # With yarn yarn create react-app <app-name> && cd <app-name>
- 建立專案後,在專案根目錄下建立一個 .env 檔案,並新增以下內容:
REACT_APP_CONSUMER_KEY=your_Woocommerce_consumer_keyREACT_APP_CONSUMER_SECRET=your_Woocommerce_consumer_secretREACT_APP_CONSUMER_KEY=your_Woocommerce_consumer_key REACT_APP_CONSUMER_SECRET=your_Woocommerce_consumer_secret
REACT_APP_CONSUMER_KEY=your_Woocommerce_consumer_key REACT_APP_CONSUMER_SECRET=your_Woocommerce_consumer_secret
將其替換為之前生成的 WooCommerce 消費者金鑰和私鑰。
- 接下來,使用下面的命令安裝用於管理路由的包:
## With npmnpm i react-router-dom## With yarnyarn add react-router-dom## With npm npm i react-router-dom ## With yarn yarn add react-router-dom
## With npm npm i react-router-dom ## With yarn yarn add react-router-dom
- 最後,使用以下命令啟動 React 專案:
## With npmnpm start## With yarnyarn start## With npm npm start ## With yarn yarn start
## With npm npm start ## With yarn yarn start
為您的無頭 WooCommerce 網站開發前端
一個成功的電子商務商店應展示產品並方便購買。首先要在前端顯示 WooCommerce 商店中的產品。這需要向 WooCommerce API 發起請求。
列出所有產品的端點是 wp-json/wc/v3/products
。必須將此端點新增到主機 URL 中。在您的 .env 檔案中為基礎 URL 新增此變數,基礎 URL 就是附加了 products
端點的主機 URL。使用您的 WooCommerce 網站域名更新 http://example.com
。
REACT_APP_BASE_URL=http://example.com/wp-json/wc/v3/products
在進行 API 請求時,必須在 URL 中包含使用者金鑰和祕密。合併後的 URL 如下:
https://yourdomain.com/wp-json/wc/v3/products?consumer_key=your_consumer_key&consumer_secret=your_consumer_secret
讓我們在 React 應用程式中使用 Fetch API 發起 API 請求,以獲取 WooCommerce 產品。
- 在 React 應用程式中,開啟 src 目錄中的 App.js 檔案,並用下面的程式碼替換其內容:
import {Link} from 'react-router-dom';import {useEffect, useState} from 'react';function App() {const BASE_URL = process.env.REACT_APP_BASE_URL;const CONSUMER_KEY = process.env.REACT_APP_CONSUMER_KEY;const CONSUMER_SECRET = process.env.REACT_APP_CONSUMER_SECRET;const [products, setProducts] = useState([]);const [loading, setLoading] = useState(true);useEffect(() => {const fetchProducts = async () => {const response = await fetch(`${BASE_URL}?consumer_key=${CONSUMER_KEY}&consumer_secret=${CONSUMER_SECRET}`);const data = await response.json();setProducts(data);setLoading(false);};fetchProducts();}, [BASE_URL, CONSUMER_KEY, CONSUMER_SECRET]);return loading ? (<div className="loaderText"><h2>Just a moment. Fetching products...</h2>{' '}</div>) : (<ul>{products ? (products.map((product) => (<li key={product.id}><Link to={`/product/${product.id}`}><img src={product.images[0].src} alt="Product banner"/><h2>{product.name}</h2><p>Sale price: {product.sale_price}</p><strong>{product.stock_status === 'instock'? 'In stock': 'Out of stock'}</strong><button>Add to Cart</button></Link></li>))) : (<li>No products found</li>)}</ul>);}export default App;import {Link} from 'react-router-dom'; import {useEffect, useState} from 'react'; function App() { const BASE_URL = process.env.REACT_APP_BASE_URL; const CONSUMER_KEY = process.env.REACT_APP_CONSUMER_KEY; const CONSUMER_SECRET = process.env.REACT_APP_CONSUMER_SECRET; const [products, setProducts] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { const fetchProducts = async () => { const response = await fetch(`${BASE_URL}?consumer_key=${CONSUMER_KEY}&consumer_secret=${CONSUMER_SECRET}`); const data = await response.json(); setProducts(data); setLoading(false); }; fetchProducts(); }, [BASE_URL, CONSUMER_KEY, CONSUMER_SECRET]); return loading ? ( <div className="loaderText"> <h2>Just a moment. Fetching products...</h2>{' '} </div> ) : ( <ul> {products ? ( products.map((product) => ( <li key={product.id}> <Link to={`/product/${product.id}`}> <img src={product.images[0].src} alt="Product banner"/> <h2>{product.name}</h2> <p>Sale price: {product.sale_price}</p> <strong> {product.stock_status === 'instock' ? 'In stock' : 'Out of stock'} </strong> <button>Add to Cart</button> </Link> </li> )) ) : ( <li>No products found</li> )} </ul> ); } export default App;
import {Link} from 'react-router-dom'; import {useEffect, useState} from 'react'; function App() { const BASE_URL = process.env.REACT_APP_BASE_URL; const CONSUMER_KEY = process.env.REACT_APP_CONSUMER_KEY; const CONSUMER_SECRET = process.env.REACT_APP_CONSUMER_SECRET; const [products, setProducts] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { const fetchProducts = async () => { const response = await fetch(`${BASE_URL}?consumer_key=${CONSUMER_KEY}&consumer_secret=${CONSUMER_SECRET}`); const data = await response.json(); setProducts(data); setLoading(false); }; fetchProducts(); }, [BASE_URL, CONSUMER_KEY, CONSUMER_SECRET]); return loading ? ( <div className="loaderText"> <h2>Just a moment. Fetching products...</h2>{' '} </div> ) : ( <ul> {products ? ( products.map((product) => ( <li key={product.id}> <Link to={`/product/${product.id}`}> <img src={product.images[0].src} alt="Product banner"/> <h2>{product.name}</h2> <p>Sale price: {product.sale_price}</p> <strong> {product.stock_status === 'instock' ? 'In stock' : 'Out of stock'} </strong> <button>Add to Cart</button> </Link> </li> )) ) : ( <li>No products found</li> )} </ul> ); } export default App;
這段程式碼會在元件掛載(
useEffect
鉤子)時使用 Fetch API 從 WooCommerce API 端點獲取產品列表。端點 URL 是使用之前設定的環境變數構建的。獲取資料後,它會使用
setProducts(response)
更新元件狀態(products
),並使用setLoading(false)
將loading
設定為false
。在獲取資料時,會顯示一條載入資訊。一旦獲取資料並將
loading
設定為false
,就會對映products
陣列,並使用 JavaScript XML (JSX) 呈現產品專案列表。每個產品專案都封裝在一個來自react-router-dom
的Link
元件中,該元件會根據 ID 生成一個指向單個產品詳細資訊頁面的連結。每個產品都會顯示產品名稱、價格、描述(使用
dangerouslySetInnerHTML
注入 HTML 內容)、庫存狀態和一個按鈕。 - 在 src 目錄中開啟 index.js 檔案,將程式碼替換為以下程式碼段:
import React from "react";import ReactDOM from "react-dom";import { BrowserRouter, Route, Routes } from "react-router-dom";import "./index.css";import App from "./App";ReactDOM.render(<React.StrictMode><div className="container"><header><h1>Kinsta Store</h1></header><BrowserRouter><Routes><Route exact path="/" element={<App />} /></Routes></BrowserRouter></div></React.StrictMode>,document.getElementById("root"));import React from "react"; import ReactDOM from "react-dom"; import { BrowserRouter, Route, Routes } from "react-router-dom"; import "./index.css"; import App from "./App"; ReactDOM.render( <React.StrictMode> <div className="container"> <header> <h1>Kinsta Store</h1> </header> <BrowserRouter> <Routes> <Route exact path="/" element={<App />} /> </Routes> </BrowserRouter> </div> </React.StrictMode>, document.getElementById("root") );
import React from "react"; import ReactDOM from "react-dom"; import { BrowserRouter, Route, Routes } from "react-router-dom"; import "./index.css"; import App from "./App"; ReactDOM.render( <React.StrictMode> <div className="container"> <header> <h1>Kinsta Store</h1> </header> <BrowserRouter> <Routes> <Route exact path="/" element={<App />} /> </Routes> </BrowserRouter> </div> </React.StrictMode>, document.getElementById("root") );
當瀏覽器呼叫
/
路由時,它會渲染App
元件。 - 執行應用程式檢視更改。
## With npmnpm start## With yarnyarn start## With npm npm start ## With yarn yarn start
## With npm npm start ## With yarn yarn start
React 應用程式現在可以顯示 WooCommerce 商店的產品列表。
建立動態產品頁面
現在,為了增強使用者體驗,請使用 WooCommerce API 建立動態產品頁面。該 API 提供了一個用於獲取單個產品資料的端點: wp-json/wc/v3/products/<id>
。要使用該端點獲取並顯示商店中單個產品的資料,請按照以下步驟操作:
- 在 src 目錄中建立一個元件 ProductDetail.js,用於獲取和顯示有關單個產品的資料。該元件可獲取並顯示單個產品的詳細資訊。其操作方式與 App.js 檔案中的程式碼類似,只是它獲取的是單個產品的詳細資訊。
import {useState, useEffect} from 'react';import {useParams} from 'react-router-dom';function ProductDetail() {const BASE_URL = process.env.REACT_APP_BASE_URL;const CONSUMER_KEY = process.env.REACT_APP_CONSUMER_KEY;const CONSUMER_SECRET = process.env.REACT_APP_CONSUMER_SECRET;const {id} = useParams();const [product, setProduct] = useState(null);useEffect(() => {const fetchSingleProductDetails = async () => {const response = await fetch(`${BASE_URL}/${id}?consumer_key=${CONSUMER_KEY}&consumer_secret=${CONSUMER_SECRET}`);const data = await response.json();setProduct(data);};fetchSingleProductDetails();}, [BASE_URL, CONSUMER_KEY, CONSUMER_SECRET, id]);if (!product) {return (<div className="loaderText"><h2>Fetching product details...</h2></div>);}return (<div className="product-detail"><h2>{product.name}</h2><h4>Original Price: {product.regular_price}</h4><h4>Sale price: {product.sale_price}</h4><img src={product.images[0].src} alt="Product banner"/><strong>{product.stock_status === 'instock' ? 'In stock' : 'Out of stock'}</strong></div>);}export default ProductDetail;import {useState, useEffect} from 'react'; import {useParams} from 'react-router-dom'; function ProductDetail() { const BASE_URL = process.env.REACT_APP_BASE_URL; const CONSUMER_KEY = process.env.REACT_APP_CONSUMER_KEY; const CONSUMER_SECRET = process.env.REACT_APP_CONSUMER_SECRET; const {id} = useParams(); const [product, setProduct] = useState(null); useEffect(() => { const fetchSingleProductDetails = async () => { const response = await fetch( `${BASE_URL}/${id}?consumer_key=${CONSUMER_KEY}&consumer_secret=${CONSUMER_SECRET}` ); const data = await response.json(); setProduct(data); }; fetchSingleProductDetails(); }, [BASE_URL, CONSUMER_KEY, CONSUMER_SECRET, id]); if (!product) { return ( <div className="loaderText"> <h2>Fetching product details...</h2> </div> ); } return ( <div className="product-detail"> <h2>{product.name}</h2> <h4>Original Price: {product.regular_price}</h4> <h4>Sale price: {product.sale_price}</h4> <img src={product.images[0].src} alt="Product banner"/> <strong> {product.stock_status === 'instock' ? 'In stock' : 'Out of stock'} </strong> </div> ); } export default ProductDetail;
import {useState, useEffect} from 'react'; import {useParams} from 'react-router-dom'; function ProductDetail() { const BASE_URL = process.env.REACT_APP_BASE_URL; const CONSUMER_KEY = process.env.REACT_APP_CONSUMER_KEY; const CONSUMER_SECRET = process.env.REACT_APP_CONSUMER_SECRET; const {id} = useParams(); const [product, setProduct] = useState(null); useEffect(() => { const fetchSingleProductDetails = async () => { const response = await fetch( `${BASE_URL}/${id}?consumer_key=${CONSUMER_KEY}&consumer_secret=${CONSUMER_SECRET}` ); const data = await response.json(); setProduct(data); }; fetchSingleProductDetails(); }, [BASE_URL, CONSUMER_KEY, CONSUMER_SECRET, id]); if (!product) { return ( <div className="loaderText"> <h2>Fetching product details...</h2> </div> ); } return ( <div className="product-detail"> <h2>{product.name}</h2> <h4>Original Price: {product.regular_price}</h4> <h4>Sale price: {product.sale_price}</h4> <img src={product.images[0].src} alt="Product banner"/> <strong> {product.stock_status === 'instock' ? 'In stock' : 'Out of stock'} </strong> </div> ); } export default ProductDetail;
- 在 index.js 中建立新路由,併為其分配
ProductDetail
元件。此程式碼片段在 index.js 中建立一個新路由,併為其分配ProductDetail
元件。這樣,當使用者點選產品連結時,就會被引導到相應的產品頁面。// index.js…import ProductDetail from "./ProductDetail";ReactDOM.render(<React.StrictMode>…<Router><Routes><Route exact path="/" element={<App />} />{/* the new route */}<Route path="/product/:id" element={<ProductDetail />} /></Routes></Router></div></React.StrictMode>,document.getElementById("root"));// index.js … import ProductDetail from "./ProductDetail"; ReactDOM.render( <React.StrictMode> … <Router> <Routes> <Route exact path="/" element={<App />} /> {/* the new route */} <Route path="/product/:id" element={<ProductDetail />} /> </Routes> </Router> </div> </React.StrictMode>, document.getElementById("root") );// index.js … import ProductDetail from "./ProductDetail"; ReactDOM.render( <React.StrictMode> … <Router> <Routes> <Route exact path="/" element={<App />} /> {/* the new route */} <Route path="/product/:id" element={<ProductDetail />} /> </Routes> </Router> </div> </React.StrictMode>, document.getElementById("root") );
通過這些修改,點選應用程式中的任何產品都會將使用者重定向到一個頁面,顯示該特定產品的詳細資訊。服裝產品的詳細資訊:
您可以訪問 GitHub 程式碼庫中的完整程式碼。
在無頭設定中整合關鍵的 WooCommerce 功能
您可以在無頭 WooCommerce 應用程式中列出產品的基礎上,整合以下基本功能:
- 購物車 – 在客戶端管理購物車資料,或使用本地儲存,讓使用者可以無縫新增、刪除和更新商品。
- 結賬流程 – 使用 React 元件設計簡化的結賬流程,收集必要資訊,驗證使用者輸入,確保流暢的結賬體驗。
- 使用者身份驗證 – 使用 JSON Web Token (JWT) 或 Open Authorization 2.0 (OAuth2) 實現安全身份驗證,通過註冊、登入和密碼重置功能增強使用者體驗。
- 支付處理 – 使用安全的支付閘道器 API(如 Stripe 或 PayPal)進行交易和退款。
- 訂單管理 – 使用 WooCommerce API 高效管理訂單和狀態。為訂單歷史、跟蹤、退貨和退款提供使用者友好的功能,並使用網路鉤子或事件驅動架構實現流程自動化。
在伺服器上部署您的無頭 WooCommerce 網站
一旦您開發了無頭 WooCommerce 網站,將其部署到伺服器上就變得簡單易行了。以 Kinsta 為例:
此外,您還可以免費將您的 React 應用程式部署到 Kinsta 的靜態網站託管服務上,您只需將程式碼推送到您喜歡的 Git 提供商(Bitbucket、GitHub 或 GitLab)即可。
推送程式碼後,請按照以下步驟部署網站:
- 登入 MyKinsta 面板。
- 單擊 Add service,然後單擊 Static Site。
- 選擇 Git 提供商,然後單擊 Connect git provider。
- 選擇要部署的版本庫和分支。系統會自動檢測構建設定。
- 確保從 .env 檔案中新增任何必要的環境變數。
- 最後,點選 Create site 來部署 React 應用程式。
您已經成功部署了無頭 WooCommerce 應用程式!
小結
本文介紹了通過建立無頭 WooCommerce 網站來建立動態和高效能線上商店的眾多優勢和新的可能性。
通過將前端與後臺解耦,您可以自定義網站,為客戶提供更具吸引力和個性化的購物體驗,並從高效能、強大的安全性和可擴充套件性中獲益。
評論留言