php - WooCommerce PDF 水印 : Using custom order item meta data

标签 php wordpress pdf woocommerce watermark

我正在销售电子书,并且我正在捕获一个名称以使用自定义字段为每本电子书授权,因为电子书主要由教师代表学生购买。每本电子书都使用 WooCommerce PDF Watermark 带有许可信息水印
我还有一段代码将同一产品的多个项目分成单独的行项目:

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 );
这一切正常,我的订单完整页面如下所示:
enter image description here
我的测试电子书 (ID 16786) 的每个副本都单独显示,并带有关联的 license_to 字段。
然后我有以下代码根据 developer's docs here 将自定义字段添加到 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 个名字,而每个可下载的电子书应该只授权给一个人:
enter image description here
有什么办法可以以某种方式将每个自定义元字段与其对应的 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 );

关于php - WooCommerce PDF 水印 : Using custom order item meta data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66679793/

相关文章:

php - INSERT IGNORE INTO 不起作用

php - azure 的PHP导入

wordpress - 站点地图包含被 robots.txt 阻止的网址

html - Wordpress:页脚下方的额外空间

pdf - 使用各种压缩/设置将 JPG 页面压缩为 PDF

pdf - JsDoc 到 PDF 渲染器

javascript - 如何在 PHP 中使用 sweetalert2

php - 如何将空 XML 节点转换为空字符串而不是 SimpleXMLElement

php - WordPress PHP Hack 中不允许使用 HTML

c# - ITextSharp - 使用 PdfStamper 产生的 MemoryStream 关​​闭