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

时间:2018-10-06 23:59:12

标签: php wordpress woocommerce metadata orders

在订单电子邮件模板(例如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;
    }
}

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

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

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

enter image description here

4 个答案:

答案 0 :(得分:3)

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

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;
}

代码包含在您的活动子主题(活动主题)的function.php文件中。经过测试,并且可以使用其他元数据。我希望它也对您有用。

  

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

答案 1 :(得分:3)

存在一个错误的答案,该错误以及我在互联网上发现的所有其他代码段,因此我在此处发布自己的答案,希望世界各地的商店都不会意外泄漏信息

问题在于,当您使用Order actions meta box重新发送电子邮件时,由于is_admin() === true,筛选器检查失败。

订单操作是“订单”页面下方的一个元框:

enter image description here

因此,第一次创建订单时,它会按您的意愿过滤电子邮件,但是如果管理员将电子邮件重新发送给客户,则它将被打乱并在页面中向用户显示所有元字段。重新发送电子邮件。

解决此问题的代码是这样的:

$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;
}

因此,如果您查看链接的代码段,那么您会看到meta框将该字段添加到$_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;
}

答案 2 :(得分:2)

我听说您想仅在管理员后端 中显示订购商品元数据。这实际上是一个棘手的问题。我已经玩了几个小时,但没有找到解决方案,请确保订单Itema元数据不会显示在发送给客户的电子邮件中。

问题是,触发这些电子邮件的方式有多种(例如,通过重新发送元框(@rtpHarry提到),或者通过在订单概览,单个订单视图或自动/以编程方式更改订单状态)。这提供了许多需要取消“订单项元数据”的情况-您需要查找所有情况(管理员后端除外)。

因此,我的建议是首先使用上述woocommerce_order_item_get_formatted_meta_data过滤器完全删除“订单项元数据”,然后使用woocommerce_before_order_itemmeta之类的操作再次添加它们,该操作仅在管理后端中触发。由于未设置“订单项元数据”,因此无法使用get_formatted_meta_data方法来获取数据。相反,您可以使用函数wc_get_order_item_meta

完整代码(经测试可正常运行):

//Hide 'Qty Selector', 'Qty' and 'Total' completely
add_filter( 'woocommerce_order_item_get_formatted_meta_data', 'unset_specific_order_item_meta_data');
function unset_specific_order_item_meta_data($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;
}

//Add 'Qty Selector', 'Qty' and 'Total' in the admin backend only
add_action('woocommerce_before_order_itemmeta', 'add_specific_order_item_meta_data_in_backend', 10, 2);
function add_specific_order_item_meta_data_in_backend( $item_id, $item ) {
    //Only applies for line items
    if( $item->get_type() !== 'line_item' ) return;
    
    $qty_sel_lines = wc_get_order_item_meta($item_id, 'Qty Selector', false);
    $qty_lines = wc_get_order_item_meta($item_id, 'Qty', false);
    $total_lines = wc_get_order_item_meta($item_id, 'Total', false);
    
    foreach ($qty_sel_lines as $qty_sel_line){
        echo $qty_sel_line . '<br>';
    }
    
    foreach ($qty_lines as $qty_line){
        echo $qty_line . '<br>';
    }
    
    foreach ($total_lines as $total_line){
        echo $total_line. '<br>';
    }
}

注意: 如果需要将订单项元数据添加到管理电子邮件中,则需要单独进行操作。我还没有检查选项。

答案 3 :(得分:1)

我有点同意@pstidsen的论点。因此,我在考虑如何解决此问题而不重新添加所有元数据,因为这有点让我感到困扰,无法以与之前添加的方式相同的方式来处理它。我还有其他过滤器可将CSS类等添加到元数据。因此,有必要照顾好自己。

因此,这是我的方法,可让您有机会将其用于电子邮件,自定义电子邮件,pdf发票或类似情况。我还使用后备功能过滤前端或任何我们未考虑的情况。 请牢记其他顺序。我最后检查了管理员过滤器,以确保之前触发了其他过滤器。例如,电子邮件的情况是:它是从管理界面发送的,因此管理过滤器为true,但电子邮件过滤器也是如此。 还提供了用于管理员电子邮件的其他过滤器的功能。

"%SystemRoot%\System32\where.exe" /R "C:\inetpub\vhosts" "??????????images.aspx"

我没有以“扁平化”格式对其进行测试。我在oop编码插件的不同类中使用了它,并对其进行了编辑以将其发布到此处。