如何在SFCC站点编写REST API获取WordPress搜索内容?
解决SFCC调用WordPress REST API搜索无效及跨域数据获取问题
一、先排查WordPress REST API搜索失效的问题
你使用wp/v2/posts?search=xxx返回全站内容,大概率是WordPress默认REST搜索逻辑被主题或插件干扰导致的,先解决这个基础问题:
- 排查插件冲突:暂时禁用SEO类(如Yoast SEO)、REST相关插件,重新测试搜索接口,看是否恢复正常。
- 强制绑定搜索参数:在WordPress后台的
functions.php中添加代码,确保search参数被正确映射到WP的搜索查询逻辑:
add_filter('rest_post_query', function($args, $request) { if (isset($request['search']) && !empty($request['search'])) { $args['s'] = sanitize_text_field($request['search']); } return $args; }, 10, 2);
添加后重新调用https://my-site.com/wp-json/wp/v2/posts?search=你的关键词,确认是否仅返回匹配内容。
二、在SFCC中编写REST API获取WordPress数据
SFCC端需要自定义API端点来代理WP的REST请求(解决跨域+统一数据格式),步骤如下:
1. 创建SFCC自定义API控制器
在SFCC的cartridges/你的项目名/controllers目录下新建WordPressData.js:
'use strict'; var server = require('server'); var HttpClient = require('dw/net/HttpClient'); var Encoding = require('dw/crypto/Encoding'); server.get('Search', function(req, res, next) { // 获取前端传入的搜索关键词 var searchTerm = req.querystring.q || ''; if (empty(searchTerm)) { res.json({ error: '搜索关键词不能为空' }); return next(); } // 发起WP REST API请求 var httpClient = new HttpClient(); var wpApiUrl = 'https://my-site.com/wp-json/wp/v2/posts?search=' + Encoding.urlEncode(searchTerm); httpClient.open('GET', wpApiUrl); httpClient.send(); // 处理响应并格式化数据 if (httpClient.statusCode === 200) { try { var posts = JSON.parse(httpClient.text); var formattedPosts = posts.map(post => ({ id: post.id, title: post.title.rendered, content: post.content.rendered, date: post.date, url: post.link })); res.json(formattedPosts); } catch (e) { res.json({ error: '解析WP数据失败' }); } } else { res.json({ error: '调用WP API失败,状态码:' + httpClient.statusCode }); } next(); }); module.exports = server.exports();
2. 配置SFCC API路由
在cartridges/你的项目名/routes.yaml中添加路由规则:
- name: WordPressData-Search pattern: /wp/search method: GET handler: WordPressData-Search
3. 处理跨域问题
在SFCC控制器中添加跨域响应头(生产环境建议指定具体域名):
res.setHeader('Access-Control-Allow-Origin', 'https://你的SFCC站点域名'); res.setHeader('Access-Control-Allow-Methods', 'GET, OPTIONS'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
4. 前端调用SFCC自定义API
SFCC前端页面通过以下方式调用搜索接口:
fetch('/wp/search?q=' + encodeURIComponent(搜索关键词)) .then(res => res.json()) .then(data => { // 渲染搜索结果到页面 console.log(data); }) .catch(err => console.error('搜索失败:', err));
三、额外优化建议
- 缓存响应结果:用SFCC的
dw/cache/CacheMgr缓存搜索结果,减少重复调用WP API的次数,提升性能。 - 支持分页:在SFCC API中传递WP的
page和per_page参数,实现分页搜索功能。 - 权限控制:如果WP内容需要认证,在HttpClient请求中添加Bearer Token等认证头,确保能获取私有内容。
内容的提问来源于stack exchange,提问作者RayaanKhan
相关产品推荐
相关产品推荐

