【问题标题】:Add a Custom Field to WooCommerce Order Items向 WooCommerce 订单项目添加自定义字段
【发布时间】:2013-12-25 19:21:09
【问题描述】:

目前,订单中的 WooCommerce 订单项目具有以下列:

  • 项目
  • 税类
  • 数量
  • 总数
  • 税收

See screenshot

我的目标是添加一个额外的列(或元),其中包含产品状态的下拉字段。

有人对我如何实现这一点有任何想法吗?

【问题讨论】:

    标签: php wordpress woocommerce


    【解决方案1】:

    万一其他人偶然发现了这一点,我需要在编辑订单屏幕上的订单项目元框中添加一些自定义订单元数据。在 2017 年,我就是这样解决了这个难题。

    includes/admin/meta-boxes 下的文件 class-wc-meta-box-order-items.php 自 2014 年以来略有变化,但它确实包含模板文件 html-order-items.php

    在最后一个文件中,您会找到两个未记录的钩子,woocommerce_admin_order_item_headers,您可以使用它们添加自定义列标题文本,并可以访问 $order 对象和 woocommerce_admin_order_item_values,将您的自定义内容放在 Cost 列之前,并可以访问 $product、$item 和 $item_id。

    所以要添加一个自定义列,它看起来像这样。

    add_action( 'woocommerce_admin_order_item_headers', 'pd_admin_order_items_headers' );
    function pd_admin_order_items_headers($order){
      ?>
      <th class="line_customtitle sortable" data-sort="your-sort-option">
        Custom Title
      </th>
      <?php
    }
    

    你的排序选项取决于你想要排序的数据。我在我的情况下使用了字符串。

    比您拥有的每个订单项中的内容还要多。

    add_action( 'woocommerce_admin_order_item_values', 'pd_admin_order_item_values' );
    function pd_admin_order_item_values( $product, $item, $item_id ) {
      //Get what you need from $product, $item or $item_id
      ?>
      <td class="line_customtitle">
        <?php //your content here ?>
      </td>
      <?php
    }
    

    如果您需要该元框中不同位置的内容,该模板文件中还有一些其他挂钩和过滤器绝对值得一看。

    【讨论】:

    • Paul Dowlin-非常有帮助!只是想指出第一个 add_action 参数应该是“woocommerce_admin_order_item_headers”(不是项目)。
    • @DougP 好收获!更新了我的答案。
    • 您应该确保add_action 设置了正确的参数。为了使它正常工作,它应该是:add_action( 'woocommerce_admin_order_item_values', 'pd_admin_order_item_values', 10, 3 );
    【解决方案2】:

    我也在对这张表进行一些重大调整,我还没有弄清楚,但如果你查看 class-wc-meta-box-,我知道很多在插件目录下order-items.php,你会发现这个sn-p的代码:

    // List order items
    $order_items = $order->get_items( apply_filters( 'woocommerce_admin_order_item_types',  array( 'line_item', 'fee' ) ) );
    
    foreach ( $order_items as $item_id => $item ) {
    
    switch ( $item['type'] ) {
        case 'line_item' :
            $_product   = $order->get_product_from_item( $item );
            $item_meta  = $order->get_item_meta( $item_id );
    
            include( 'views/html-order-item.php' );
        break;
        case 'fee' :
            include( 'views/html-order-fee.php' );
        break;
    }
    
    do_action( 'woocommerce_order_item_' . $item['type'] . '_html', $item_id, $item );
    }
    

    请勿编辑此片段!!!

    从这里您可以开始了解该表的组成部分。我相信(据我目前对 WooCommerce 的了解)您可以创建一个挂接到那里的过滤器的函数:woocommerce_admin_order_item_types();

    这就是我会做这样的事情:

    # Admin Panel Updates
    add_filter( 'woocommerce_add_order_item_meta', array( $this, 'display_order_item_meta' ), 10, 2 );
    public function display_order_item_meta( $order_items ) {
        array_push($order_items,'event'); //Not sure how to manipulate this yet
        return $order_items;
    }
    

    另外,看起来我们需要对动作挂钩 (woocommerce_order_item_' . $item['type'] . '_html', $item_id, $item) 做一些事情,也许是这样的:

    add_filter( 'woocommerce_order_item_event_html', array( $this, 'display_event_item_meta' ), 10, 2 );
    
    public function display_event_item_meta( $item_id, $item) {
        switch ( $item['type'] ) {
            case 'event' :
            include( 'views/html-order-event-item.php' );
                break;
        }
    }
    

    到目前为止,这是我最好的猜测,但我很肯定这是要剖析的正确 sn-p 代码。

    【讨论】:

      猜你喜欢
      • 2020-12-30
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 2018-05-31
      • 2017-07-09
      • 2019-06-21
      • 2021-05-07
      • 2017-09-17
      相关资源
      最近更新 更多