我的wordpress查询有问题。
我要做的是:
我有一个csv文件,里面有产品数据(名称、价格、库存、sku等),我想导入这个文件,但是当我试图按sku获取产品id时,我的查询对于我的服务器来说太高了,但是我做了一些愚蠢的想法:在foreach中,我试图获取所有的产品id。
可以拆分我的wp查询而不终止我的服务器吗?我试着睡觉,但没有结果。。。
我的代码在这里:
public function new_import_stock_prices(){
global $wpdb;
global $post;
if ( !function_exists( 'wc_get_product_id_by_sku' ) ) {
require_once '/includes/wc-product-functions.php';
}
echo '<h1>Import stanów magazynowych i cen z pliku CSV </h1>';
echo '<h4>Plik pobierany jest z netis/products.csv</h4>';
$fn = 'https://e-xxxxx.pl/xxx/products.csv';
$file_array = file($fn);
echo '<table>';
echo '<tr>';
echo '<td>LP</td>';
echo '<td>Nazwa</td>';
echo '<td>SKU</td>';
echo '<td>Stan magazynowy</td>';
echo '<td>Cena</td>';
echo '<td>Product ID</td>';
$i = 1;
if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
foreach ($file_array as $line_number =>&$line)
{
if ($line_number > 0 && $line_number % 10 == 0) {
$row2=explode('|',$line);
$sku = $row2[1];
// get the product ID from the SKU
$product_id = $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key='_sku' AND meta_value='%s' LIMIT 1", $sku ) );
// Get an instance of the WC_Product object
$product = new WC_Product( $product_id );
//Get product stock quantity and stock status
$stock_quantity = $product->get_stock_quantity();
$stock_status = $product->get_stock_status();
echo '<tr>';
echo '<td>'.$i.'</td>';
echo '<td>'.$row2[0].'</td>';
echo '<td>'.$row2[1].'</td>';
echo '<td>'.$row2[5].'</td>';
echo '<td>'.$row2[2].'</td>';
echo '<td>'.$product_id.'</td>';
echo '</tr>';
$i = $i +1;
sleep(10);
}
}
}
echo '</table>';
}
顺便说一句,我的wp\u postmeta表有90多万条记录:o
1条答案
按热度按时间nhhxz33t1#
我想导入这个文件
我没有看到任何用于导入的代码,我看到了用于显示的代码。假设导入是指显示:
可能发生的事情只是其中一件。
你的内存不足(你应该得到一个错误)
不要使用
file($fn)
使用打开文件并逐行读取的文件函数,例如fgetcsv
你的时间不多了除了发送更少的数据外,您对此无能为力
通过发送大量输出,您的浏览器缓冲区被淹没。
同样,你不能做太多,但发送较少的数据。
唯一真正的解决方案(假设导入是指显示)是分页数据。
现在,即使在文件中也可以分页数据,但我建议使用sqlfileobject而不是过程文件函数。也就是说,您可以使用过程样式分页,但它是按字节偏移量,而不是按页码。
虽然我无法编写整个寻呼系统的代码,但我可以给您一些提示:
例如
try {
$fn = 'https://e-xxxxx.pl/xxx/products.csv';
$csv = new SplFileObject($fn, 'r');
} catch (RuntimeException $e ) {
printf("Error openning csv: %s\n", $e->getMessage());
}
$csv->seek($_GET['line']); //seek to a predefined line
while(!$csv->eof() && ($row = $csv->fgetcsv()) && null !== $row[0]) {
if(($csv->key()-$_GET['line'])==10)
$line = $csv->key(); //get line offset
++$i;
}
$csv->seek(PHP_INT_MAX);
$total = $csv->key();
$csv->rewind(); //or $csv->seek($_GET['line'])
// Turn off output buffering
ini_set('output_buffering', 'off');
// Turn off PHP output compression
ini_set('zlib.output_compression', false);
//Flush (send) the output buffer and turn off output buffering
//ob_end_flush();
while (ob_get_level()) ob_end_flush();
// Implicitly flush the buffer(s)
ini_set('implicit_flush', true);
ob_implicit_flush(true);