You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 13:45:13