WooCommerce如何删除默认产品CSV导出生成的换行符

4sup72z8  于 2023-05-26  发布在  其他
关注(0)|答案(1)|浏览(226)

bounty还有3天到期。此问题的答案有资格获得+50声望奖励。Alan希望引起更多关注这个问题。

我在一个项目中,使用WordPress默认的CSV导入/导出工具来管理在线商店的产品。由于它在某些领域(与插件的兼容性)有已知的限制,我不能仅仅依靠该工具来拥有一个只有CSV的产品基础。某些更改也需要直接在WP GUI中完成。
当我想通过添加换行符和段落来改进产品描述以使内容更具可读性时,问题就开始了:当我导入一个正确格式化的CSV时,我可以将它导出为完美的格式,直到我直接通过GUI修改产品中的某些内容。它甚至不一定需要改变描述。更改任何其他字段也会破坏我的下一个CSV导出:换行符(<br>)和段落(<p>)无论出于何种原因,都将替换为后跟“\n”的换行符。产品导出不再可用,并迫使我在使用之前使用Notepad++对任何导出进行预格式化,这超出了烦人的范围。
默认的导入-导出工具到目前为止真的那么糟糕吗?还是我错过了一些非常基本的东西来避免这个问题?有什么办法可以方便地管理产品的进出口吗?本项目使用的版本是Wordpress 6.2。
先谢谢你,
艾伦

zfycwa2u

zfycwa2u1#

  • “换行符<br>和段落<p>标记,无论出于何种原因,被换行符后跟\n所取代。产品出口不再可用 *

原因是class-wc-product-csv-exporter.php中的protected function called "filter_description_field"
这是woocommerce提供的导致这种行为的函数!

/**
 * Filter description field for export.
 * Convert newlines to '\n'.
 *
 * @param string $description Product description text to filter.
 *
 * @since  3.5.4
 * @return string
*/
protected function filter_description_field( $description ) {
  $description = str_replace( '\n', "\\\\n", $description );
  $description = str_replace( "\n", '\n', $description );
  return $description;
}

它同时被descriptionshort_description字段调用。

p标签:

默认情况下,浏览器用一个空行分隔段落。

br标签:

The br HTML element produces a line break in text (carriage-return).
因此,如果我将p标记和/或br标记添加到short description字段,它将是这样的:

有些csv解析器不能按照你想要的方式处理\n,而有些可以!例如,这是一个来自Microsoft Excel的屏幕截图,在本例中,它没有进入新的单元格,并正确显示了数据:

但是如果我打开与Windows Notepad相同的csv文件,它将进入新的一行并扰乱数据的格式,这里有一个屏幕截图:

  • “强迫我在使用Notepad++之前预先格式化任何导出,这非常烦人。"*

幸运的是,Woocommerce为我们提供了一个名为woocommerce_product_export_row_data的过滤器钩子,可以让我们自动化这个过程。因此,您不必在导出之前手动操作descriptionshort_description字段!
我们可以使用regular expressionsstring manipulation techniques来修改Woocommerce添加的\n作为默认行为!

1-使用str_replace函数和woocommerce_product_export_row_data过滤器钩子:

add_filter('woocommerce_product_export_row_data', 'your_theme_custom_export_data', 2, 999);

function your_theme_custom_export_data($row, $product)
{
    foreach ($row as $row_name => $row_value)
    {
        $row_name = strstr($row_name, ':') ? current(explode(':', $row_name)) : $row_name;

        if ('description' === $row_name || 'short_description' === $row_name)
        {
            $row[$row_name] = str_replace('\n', '', $row_value);
        }
    }
    return $row;
}

2-使用preg_replace函数和woocommerce_product_export_row_data过滤器钩子:

add_filter('woocommerce_product_export_row_data', 'your_theme_custom_export_data', 2, 999);

function your_theme_custom_export_data($row, $product)
{
    foreach ($row as $row_name => $row_value)
    {
        $row_name = strstr($row_name, ':') ? current(explode(':', $row_name)) : $row_name;

        if ('description' === $row_name || 'short_description' === $row_name)
        {
            $row[$row_name] = preg_replace('/\\\\n+/', '', $row_value);
        }
    }
    return $row;
}

以下是删除/替换换行符\n后的屏幕截图:

注:

  • 我使用了999优先级,它允许在woocommerce exporter class修改了数据之后、生成csv文件之前运行函数。您可以随意更改优先级编号和/或正则表达式以满足您的需要。
  • 由于我们使用的是filter hook,数据库中的数据不会改变!所以描述字段在你的woocommerce商店的管理面板上保持不变,这意味着它们仍然是“人类可读的”!

这个答案已经过测试,效果很好!上面的片段将转到活动主题的functions.php文件。

相关问题