94 lines
2.6 KiB
PHP
94 lines
2.6 KiB
PHP
<?php
|
||
|
||
namespace app\utils;
|
||
|
||
use GuzzleHttp\Client;
|
||
use GuzzleHttp\Exception\GuzzleException;
|
||
|
||
/**
|
||
* 通用的 CF7 + Advanced CF7 DB 询盘客户端
|
||
*
|
||
* 支持多站点使用:
|
||
* - 每个站点 new 一个实例(传入 baseUri + auth)
|
||
* - 调用 fetchForms / fetchEntries 获取对应站点的数据
|
||
*/
|
||
class Cf7InquiryClient
|
||
{
|
||
protected Client $client;
|
||
|
||
/** 站点基础地址,例如:https://hesupipe.com */
|
||
protected string $baseUri;
|
||
|
||
/** 构造函数:传入当前要访问的 WP 站点配置 */
|
||
public function __construct(string $baseUri, string $username, string $password, array $options = [])
|
||
{
|
||
$this->baseUri = rtrim($baseUri, '/');
|
||
|
||
$config = [
|
||
'base_uri' => $this->baseUri,
|
||
'auth' => [$username, $password],
|
||
'timeout' => $options['timeout'] ?? 10,
|
||
'verify' => $options['verify'] ?? false, // 正式环境建议改成 true
|
||
];
|
||
|
||
$this->client = new Client($config);
|
||
}
|
||
|
||
/**
|
||
* 获取当前站点的 CF7 表单列表(从 Advanced CF7 DB 推断)
|
||
* 对应插件里的 /acf7db/v1/forms
|
||
*
|
||
* @return array
|
||
* @throws GuzzleException
|
||
*/
|
||
public function fetchForms(): array
|
||
{
|
||
$response = $this->client->get('/wp-json/acf7db/v1/forms');
|
||
$body = (string)$response->getBody();
|
||
|
||
return json_decode($body, true) ?: [];
|
||
}
|
||
|
||
/**
|
||
* 获取 Advanced CF7 DB 询盘列表(存量 + 增量通用)
|
||
*
|
||
* @param int $cf7Id 表单 ID(可选,为 0 时表示所有表单)
|
||
* @param int $lastId 上次同步到的最大 submit_id
|
||
* @param int $perPage 每次拉取数量
|
||
* @param string|null $from 起始时间(可选,Y-m-d H:i:s)
|
||
* @param string|null $to 结束时间(可选)
|
||
*
|
||
* @return array ['data' => [...], 'meta' => [...]]
|
||
* @throws GuzzleException
|
||
*/
|
||
public function fetchEntries(
|
||
int $cf7Id = 0,
|
||
int $lastId = 0,
|
||
int $perPage = 200,
|
||
?string $from = null,
|
||
?string $to = null
|
||
): array {
|
||
$query = [
|
||
'last_id' => $lastId,
|
||
'per_page' => $perPage,
|
||
];
|
||
|
||
if ($cf7Id > 0) {
|
||
$query['cf7_id'] = $cf7Id;
|
||
}
|
||
if ($from) {
|
||
$query['from'] = $from;
|
||
}
|
||
if ($to) {
|
||
$query['to'] = $to;
|
||
}
|
||
|
||
$response = $this->client->get('/wp-json/acf7db/v1/entries', [
|
||
'query' => $query,
|
||
]);
|
||
|
||
$body = (string)$response->getBody();
|
||
return json_decode($body, true) ?: ['data' => [], 'meta' => []];
|
||
}
|
||
}
|