我正在制作一个 WordPress 插件,该插件应该加载 2 种类型的 XML 文件(产品提要文件),然后找到库存状态字段,然后保留所有库存产品并从这些 XML 产品返回库存产品 URL 列表饲料。
我已经对库存状态字段可以采用的所有可能的库存值进行了硬编码,到目前为止,这些值只有“有库存”、“有库存”、“是”和大于 0 的值。但是在新产品 Feed 中我刚刚补充说,库存价值是“På lager”。我认为我可以将这个新值添加到我的函数中(在我对值进行硬编码的部分),但这不起作用。
我已经尝试了一切(与 ChatGPT 进行了 8 小时的对话,我尝试使用
mb_convert_encoding
和其他类型的技巧),但没有任何帮助......我也尝试回显这些值,并查看我的插件输出的值(即“På lager”),但我无法将其解码为“på lager”。
我不知道这是否与 XML 的编码有关或完全不同。我真的希望有人能帮助我......
我已附上我的功能代码,并且我已附上新产品提要的示例。
功能:
function fetch_and_parse_product_feed_with_xmlreader($feed_entry) {
$reader = new XMLReader();
// Access the 'url' key from the feed entry
if (!$reader->open($feed_entry['url'])) {
echo "<p>Failed to open feed: " . esc_url($feed_entry['url']) . "</p>";
return array();
}
$in_stock_products = array();
while ($reader->read()) {
if ($reader->nodeType == XMLReader::ELEMENT) {
if ($reader->localName == 'produkt') {
// Handling for Feed type 1
$productXml = $reader->readOuterXML();
$product = simplexml_load_string($productXml);
$stock_status = strtolower((string)$product->lagerantal);
if ($stock_status === 'instock' || $stock_status === 'in stock' || intval($stock_status) > 0 || $stock_status === 'yes' || $stock_status === 'på lager') {
$processed_url = process_url_for_comparison((string)$product->vareurl);
$in_stock_products[] = $processed_url;
}
} elseif ($reader->localName == 'product') {
// Handling for Feed type 2
$productXml = $reader->readOuterXML();
$product = simplexml_load_string($productXml);
$stock_status = strtolower((string)$product->Instock);
if ($stock_status === 'instock' || $stock_status === 'in stock' || intval($stock_status) > 0 || $stock_status === 'yes') {
$processed_url = process_url_for_comparison((string)$product->TrackingUrl);
$in_stock_products[] = $processed_url;
}
}
}
}
$reader->close();
return $in_stock_products;
}
XML 产品提要:
<?xml version="1.0" encoding="iso-8859-1"?>
<produkter>
<produkt>
<forhandler>Cykelpartner</forhandler>
<kategorinavn>Rullebremser & fodbremser</kategorinavn>
<brand>Shimano</brand>
<produktnavn>Shimano Nexus - Skrue og møtrik for bremsewire ved rullebremser bag - BR-IM45-R</produktnavn>
<produktid>4524667690467</produktid>
<ean>4524667690467</ean>
<beskrivelse>Original øjebolt med møtrik der anvendes til fastgørelse af bremsewiren på en Shimano Nexus rullebremse i bag model BR-I...</beskrivelse>
<nypris>24.00</nypris>
<glpris>24.00</glpris>
<fragtomk>45</fragtomk>
<lagerantal>På lager</lagerantal>
<leveringstid>1-3 dage</leveringstid>
<size></size>
<color></color>
<billedurl>https://resources.chainbox.io/cykelpartner/public/pim/0cdd0111-b47f-44f7-8099-54fa6dd278aa/Y8JK98050_A_default.jpg</billedurl>
<vareurl>https://www.partner-ads.com/dk/klikbanner.php?bannerid=16446&partnerid=16025&htmlurl=https://www.cykelpartner.dk/rullebremser-shimano-nexus-og-dele/shimano-nexus---skrue-og-moetrik-for-bremsewire-ved-rullebremser-bag---br-im45-r</vareurl>
</produkt>
<produkt>
<forhandler>Cykelpartner</forhandler>
<kategorinavn>Bremsegreb</kategorinavn>
<brand>Shimano</brand>
<produktnavn>Shimano GRX - STI greb Højre - ST-RX820 - Til 12 gears kassetter - Hydraulisk</produktnavn>
<produktid>4550170173432</produktid>
<ean>4550170173432</ean>
<beskrivelse>Dette STI skifte- og bremsegreb fra Shimanos GRX gravel 12 gears serie, tilhører den kvalitetsmæssige top. Grebet er model ST-RX820, o...</beskrivelse>
<nypris>2349.00</nypris>
<glpris>2349.00</glpris>
<fragtomk>0</fragtomk>
<lagerantal>Ikke på lager</lagerantal>
<leveringstid>Ukendt leveringstid</leveringstid>
<size></size>
<color></color>
<billedurl>https://resources.chainbox.io/5/cykelpartner/public/pim/bb10bd81-d2af-401d-a50c-ed5f3adcc159/istrx820rbi_a_default.jpg</billedurl>
<vareurl>https://www.partner-ads.com/dk/klikbanner.php?bannerid=16446&partnerid=16025&htmlurl=https://www.cykelpartner.dk/bremsegreb-til-faelgbremser/shimano-grx-sti-greb-hoejre-st-rx820-til-12-gears-kassetter-hydraulisk</vareurl>
</produkt>
</produkter>
所以基本上,我希望该函数仅返回产品提要中第一个产品的 URL(因为第一个产品的有库存值“På lager”,而第二个产品的缺货值“Ikke”) på lager”。
我尝试通过回显初始库存状态值进行调试。
经过一些测试,我可以重现这个奇怪的问题。从 8.1 开始的 PHP 版本直接从 HTTP 解析时会出现这种情况。
作为解决方法,请将 feed 下载到本地临时文件:
$file = tempnam('.', 'feed');
$local = fopen($file, 'w');
$remote = fopen('https://www.partner-ads.com/dk/feed_udlaes.php?partnerid=16025&bannerid=16446&feedid=2', 'r');
stream_copy_to_stream($remote, $local);
fclose($local);
fclose($remote);
$nb = 0;
$reader = new XMLReader();
$reader->open($file);
while ($reader->read()) {
if ($reader->nodeType == XMLReader::ELEMENT) {
if ($reader->localName == 'produkt') {
$productXml = $reader->readOuterXML();
$product = simplexml_load_string($productXml);
$stock_status = strtolower((string)$product->lagerantal);
if ($stock_status === 'på lager')
$nb++;
}
}
}
echo "På lager found: $nb";
unlink($file);
输出:
På lager found: 22026
备注:我没有做任何错误检查,我会让你正确地做。