从Woocommerce电子邮件通知中过滤掉不需要的订单项元数据

Dan*_*eer 1 php wordpress metadata orders woocommerce

在订单电子邮件模板中(例如email-order-items.php),WooCommerce使用此功能wc_display_item_meta在订单表中显示产品详细信息。wc-template-functions.php文件中存在功能代码(行号3011)。我正在复制下面的功能代码以供参考

function wc_display_item_meta( $item, $args = array() ) {
    $strings = array();
    $html    = '';
    $args    = wp_parse_args( $args, array(
        'before'    => '<ul class="wc-item-meta"><li>',
        'after'     => '</li></ul>',
        'separator' => '</li><li>',
        'echo'      => true,
        'autop'     => false,
    ) );

    foreach ( $item->get_formatted_meta_data() as $meta_id => $meta ) {
        $value     = $args['autop'] ? wp_kses_post( $meta->display_value ) : wp_kses_post( make_clickable( trim( $meta->display_value ) ) );
        $strings[] = '<strong class="wc-item-meta-label">' . wp_kses_post( $meta->display_key ) . ':</strong> ' . $value;
    }

    if ( $strings ) {
        $html = $args['before'] . implode( $args['separator'], $strings ) . $args['after'];
    }

    $html = apply_filters( 'woocommerce_display_item_meta', $html, $item, $args );

    if ( $args['echo'] ) {
        echo $html; // WPCS: XSS ok.
    } else {
        return $html;
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是:它没有任何参数可以帮助我过滤掉不想在订单电子邮件中显示的项目数据。我不想在中更改此功能,wc-template-functions.php因为它是核心文件。因此,我想知道是否可以添加一段代码,从而以functions.php某种方式修改此wc_display_item_meta函数以过滤出特定的项目元。

注意:我知道有人可能会建议为什么不仅要从产品详细信息中删除特定项目数据,而且该数据对于内部订单处理至关重要。我只是不想让它展示给客户。

更新#1:我不想在订单电子邮件中显示哪些元数据?以下是订单电子邮件的屏幕截图。我突出显示了三个项目数据。“数量选择器”,“数量”和“总计”。我希望所有这三个都不显示在订单电子邮件中。

在此处输入图片说明

Loi*_*tec 9

不做任何保证就尝试以下操作(因为我实际上没有真正必要的密钥):

add_filter( 'woocommerce_order_item_get_formatted_meta_data', 'unset_specific_order_item_meta_data', 10, 2);
function unset_specific_order_item_meta_data($formatted_meta, $item){
    // Only on emails notifications
    if( is_admin() || is_wc_endpoint_url() )
        return $formatted_meta;

    foreach( $formatted_meta as $key => $meta ){
        if( in_array( $meta->key, array('Qty Selector', 'Qty', 'Total') ) )
            unset($formatted_meta[$key]);
    }
    return $formatted_meta;
}
Run Code Online (Sandbox Code Playgroud)

代码进入您的活动子主题(活动主题)的function.php文件中。经过除您和工作人员之外的其他元数据的测试。我希望它也对您有用。

现在,此代码使用的钩子是正确的过滤器钩子。它位于WC_Order_Item方法中,get_formatted_meta_data()并允许过滤订单项元数据。


rtp*_*rry 5

接受的答案以及我在互联网上找到的所有其他片段都有一个错误,所以我在这里发布我自己的答案,希望世界各地的商店不会意外泄露信息。

问题是,当您使用Order actions 元框重新发送电子邮件时,过滤器检查失败,因为is_admin() === true.

订单操作是订单页面下方的元框:

在此处输入图片说明

因此,第一次创建订单时,它会根据您的需要过滤电子邮件,但是如果管理员将电子邮件重新发送给客户,那么它将被破坏并向用户显示重新发送的电子邮件中的所有元字段。

修复这种情况的代码是这样的:

$is_resend = isset($_POST['wc_order_action']) ?  wc_clean( wp_unslash( $_POST['wc_order_action'] ) ) === 'send_order_details' : false;

if ( !$is_resend && (is_admin() || is_wc_endpoint_url() ) ) {
  return $formatted_meta;
}
Run Code Online (Sandbox Code Playgroud)

因此,如果您查看链接的代码段,那么您将看到元框将该字段添加到$_POST. 它也必须像这样清理,否则将不匹配。

集成到已接受解决方案答案中的完整示例是:

add_filter( 'woocommerce_order_item_get_formatted_meta_data', 'unset_specific_order_item_meta_data', 10, 2);

function unset_specific_order_item_meta_data($formatted_meta, $item){
    // Only on emails notifications
    $is_resend = isset($_POST['wc_order_action']) ?  wc_clean( wp_unslash( $_POST['wc_order_action'] ) ) === 'send_order_details' : false;

    if ( !$is_resend && (is_admin() || is_wc_endpoint_url() ) ) {
      return $formatted_meta;
    }

    foreach( $formatted_meta as $key => $meta ){
        if( in_array( $meta->key, array('Qty Selector', 'Qty', 'Total') ) )
            unset($formatted_meta[$key]);
    }
    return $formatted_meta;
}
Run Code Online (Sandbox Code Playgroud)