php - WooCommerce PDF 水印:使用自定义订单商品元数据
问题描述
我正在销售电子书,并且我正在获取一个名称,以便使用自定义字段许可每本电子书,因为这些电子书大多是由教师代表学生购买的。每本电子书都使用WooCommerce PDF 水印使用许可信息添加水印
我还有一段代码将同一产品的多个项目分成单独的行项目:
function split_product_individual_cart_items( $cart_item_data, $product_id ){
$ids = array(16786);
if (!empty($product_id) && is_numeric($product_id) && in_array((int)$product_id, $ids)) {
$unique_cart_item_key = uniqid();
$cart_item_data['unique_key'] = $unique_cart_item_key;
}
return $cart_item_data;
}
add_filter( 'woocommerce_add_cart_item_data', 'split_product_individual_cart_items', 10, 2 );
这一切正常,我的订单完成页面如下所示:
我的测试电子书 (ID 16786) 的每个副本都单独显示,并带有相关的 license_to 字段。
然后我有以下代码,根据此处的开发人员文档将自定义字段添加到 PDF
function wc_pdf_watermark_extend_template_tags( $parsed_text, $unparsed_text, $order, $product ) {
$licensed_to_string = ' ';
$order_items_array = $order->get_items();
foreach ( $order_items_array as $item_id => $item ) {
$product_id = $item->get_product_id();
$licensed_to = $item->get_meta( 'licensed_to', true );
$licensed_to_string .= $product_id . ' - ' . $item_id . ' - ' . $licensed_to . ' | ';
}
$parsed_text = str_replace( '{licensed_to}', $licensed_to_string, $parsed_text );
return $parsed_text;
}
add_filter( 'woocommerce_pdf_watermark_parse_template_tags', 'wc_pdf_watermark_extend_template_tags', 10, 4 );
问题是每个 PDF 显示所有 3 个名称,而每个可下载的电子书应该只授权给一个人:
有什么办法可以以某种方式将每个自定义元字段与其对应的 PDF 匹配?也许在数组中计算位置或其他什么?
或者,是否有其他技巧可以更改已完成订单的产品名称,并在名称中包含自定义字段?然后可以将其包含在水印中并解决我的问题。
解决方案
请尝试以下方法(我使用第 4 个变量函数参数$product
从订单项中定位当前产品):
add_filter( 'woocommerce_pdf_watermark_parse_template_tags', 'wc_pdf_watermark_extend_template_tags', 10, 4 );
function wc_pdf_watermark_extend_template_tags( $parsed_text, $unparsed_text, $order, $product ) {
// Loop through order items
foreach ( $order->get_items() as $item_id => $item ) {
// Target only current product
if( in_array( $product->get_id(), [$item->get_product_id(), $item->get_variation_id()] ) ) {
$product_id = $item->get_product_id();
$licensed_to = $item->get_meta('licensed_to');
$replacement = $product_id . ' - ' . $item_id . ' - ' . $licensed_to;
$parsed_text = str_replace( '{licensed_to}', $replacement, $parsed_text );
}
}
return $parsed_text;
}
代码位于活动子主题(或活动主题)的 functions.php 文件中。它可以工作。
也许(不确定),您可以尝试替换以下行:
$parsed_text = str_replace( '{licensed_to}', $replacement, $parsed_text );
和:
$parsed_text = str_replace( '{licensed_to}', $replacement, $unparsed_text );
推荐阅读
- ssis - SSIS 脚本任务 - 不选择任何 ddl
- graphql-js - 来自 Gatsby 中单个对象 JSON 文件的 GraphQL 模式
- scala - Scala - 如何读取方法签名
- tkinter - Python中的简单下拉日历+日期选择器
- angular - 导入时的打字稿类和名称脚本层次结构
- java - 读取第一行的文本文件具有键和第二行向前的值
- postgresql - 如何在 Postgres 中使用空格分隔的表名进行 sql 查询?
- javascript - S3 - 阻止任何 CORS 请求,无论如何
- powerbi - PowerBI - 直接查询 DAX 模型不支持 Min 函数
- c# - 将搜索功能添加到视图模型的正确方法是什么?