【问题标题】:WooCommerce PDF Watermark: Using custom order item meta dataWooCommerce PDF 水印:使用自定义订单商品元数据
【发布时间】:2021-06-15 04:29:12
【问题描述】:

我正在销售电子书,并且我正在获取一个名称,以便使用自定义字段来许可每本电子书,因为这些电子书大多是由教师代表学生购买的。每本电子书都使用 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 );

一切正常,我的订单完成页面如下所示:

我的测试电子书 (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 个名称,而每个可下载的电子书应该只授权给一个人:

有什么方法可以让每个自定义元字段与其对应的 PDF 相匹配?也许在数组中计算位置或其他什么?

或者,是否还有其他技巧可以更改已完成订单的产品名称,并在名称中包含自定义字段?然后可以将其包含在水印中并解决我的问题。

【问题讨论】:

  • @LoicTheAztec 感谢您的回答,有时间我会尽快查看。目前正在从事另一个项目。

标签: php wordpress pdf woocommerce watermark


【解决方案1】:

改用以下方法(我使用第 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 );

【讨论】:

  • 嘿@LoicTheAztec,我已经尝试了你建议的代码,但它仍然会导致相同的行为。不幸的是,所有 3 个名字仍然印在电子书的每份副本中。
猜你喜欢
  • 1970-01-01
  • 2019-05-10
  • 2021-04-05
  • 2019-05-20
  • 2019-03-31
  • 2020-07-06
  • 1970-01-01
  • 2019-08-06
  • 2019-02-23
相关资源
最近更新 更多