向 WooCommerce 订单项添加自定义字段

Tho*_*Gee 3 php wordpress woocommerce

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

  • 物品
  • 税种
  • 数量
  • 总计

看截图

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

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

Pau*_*lin 8

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

class-wc-meta-box-order-items.php下找到的文件includes/admin/meta-boxes自 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
}
Run Code Online (Sandbox Code Playgroud)

您的排序选项在哪里取决于您要排序的数据。我在我的情况下使用了弦乐。

比您将拥有的每个订单项中的内容。

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
}
Run Code Online (Sandbox Code Playgroud)

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

  • 你应该确保 `add_action` 设置了正确的参数。为了使其正常工作,它应该是:`add_action('woocommerce_admin_order_item_values', 'pd_admin_order_item_values', 10, 3);` (3认同)

Xtr*_*ith 3

我也正在对该表进行一些重大调整,我还没有完全弄清楚,但我知道这么多,如果您查看其中的 class- wc -meta-box-order-items.php在插件目录中,您将找到以下代码片段:

// 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 );
}
Run Code Online (Sandbox Code Playgroud)

不要编辑此片段!

从这里您可以开始查看该表的组成部分。我相信(据我目前对 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;
}
Run Code Online (Sandbox Code Playgroud)

而且看起来我们需要对动作钩子(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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是迄今为止我最好的猜测,但我确信这是要剖析的正确代码片段。