WooCommerce管理订单详情 - 在订单详情页面显示自定义数据

14

我已经搜索和尝试了2天,但没有成功,请帮忙。

我想要过滤woocommerce订单,根据产品属性在订单详情页面添加额外的数据库详细信息,但是我找不到正确的woocommerce操作/筛选钩子来完成这个任务。这里假设变量$is_customized = false

如果$is_customized == true,那么我需要在订单详细页面中添加来自数据库的自定义数据。

注意:我不想添加额外的元框,而是想更改订单详细表格以:

  • 用数据库中存储的图像替换默认产品图像,并且,
  • 在产品名称下面添加包含自定义属性的div。

我已经将所有这些值保存在我的变量中,但是我无法弄清楚应该使用哪个操作钩子。

我已经附上了一张图片进行澄清。

进入图片描述

只需知道是否可以更改/筛选这些订单结果,以及如何实现?

感谢您的时间和帮助。 谢谢


与任何其他自定义文章类型一样,列通过manage $post type posts columnsmanage $post type posts custom column进行处理。在订单的情况下,文章类型为shop_order - helgatheviking
没关系,我刚刚仔细看了你的截图,发现它不是我想的那样。话虽如此,它确实是一个元框,所以最坏的情况下,你可以将其移除,并添加一个修改过的版本来替代它。 - helgatheviking
这是否意味着没有可用的操作/过滤器来过滤这些结果或自定义它,而不是重写整个模块? - Haider Saeed
1
manage_edit-shop_order_columns 和 manage_shop_order_posts_custom_column 这两个函数可以在订单表格中添加额外的列,但我想要在订单编辑页面中添加一个列,以便列出特定订单的详细信息。 - Haider Saeed
1
您可以在 html-order-items.phphtml-order-item.php 中看到可用的钩子。 - helgatheviking
好的,谢谢提供链接,我会看一下并在这里更新是否有效。谢谢。 - Haider Saeed
1个回答

21
以下是如何在 woocommerce_before_order_itemmeta 钩子上显示一些额外数据的起点:
add_action( 'woocommerce_before_order_itemmeta', 'so_32457241_before_order_itemmeta', 10, 3 );
function so_32457241_before_order_itemmeta( $item_id, $item, $_product ){
    echo '<p>bacon</p>';
}

我不知道您如何保存数据,因此我无法提供更精确的建议。请记住,在钩子之后立即显示任何保存为订单项目元数据的内容。

过滤图像更加困难。我已经找到了这个开始,但是它需要一些自定义条件逻辑,因为您不想在所有地方都过滤缩略图,而只想在订单中过滤。

编辑:目前我能够为筛选物品缩略图做出的最好努力:

add_filter( 'get_post_metadata', 'so_32457241_order_thumbnail', 10, 4 );
function so_32457241_order_thumbnail( $value, $post_id, $meta_key, $single ) {
    // We want to pass the actual _thumbnail_id into the filter, so requires recursion
    static $is_recursing = false;
    // Only filter if we're not recursing and if it is a post thumbnail ID
    if ( ! $is_recursing && $meta_key === '_thumbnail_id' ) {
        $is_recursing = true; // prevent this conditional when get_post_thumbnail_id() is called
        $value = get_post_thumbnail_id( $post_id );
        $is_recursing = false;
        $value = apply_filters( 'post_thumbnail_id', $value, $post_id ); // yay!
        if ( ! $single ) {
            $value = array( $value );
        }
    }
    return $value;
}


add_filter( 'post_thumbnail_id', 'so_custom_order_item_thumbnail', 10, 2 );
function so_custom_order_item_thumbnail( $id, $post_id ){
    if( is_admin() ){
        $screen = get_current_screen();
        if( $screen->base == 'post' && $screen->post_type == 'shop_order' ){
            // this gets you the shop_order $post object
            global $post; 

            // no really *good* way to check post item, but could possibly save 
            // some kind of array in the order meta
            $id = 68;
        } 
    }
    return $id;
}

非常感谢,这正是我正在寻找的东西。您能告诉我如何替换图像吗?我还需要在这里添加一个数量过滤器。也就是说,如果条件成立,我不想显示数量。 - Haider Saeed
我越看它,就越觉得过滤图像将会非常困难,可能需要在WooCommerce中添加一些过滤器。总体上来说,这很容易做到,但是“get_post_thumbnail_id()”函数纯粹依赖于“$post_id”,目前我无法看到任何发送“$order_item”的方法,而这是该特定订单中唯一的产品版本。 - helgatheviking
是的,让我解释一下。实际上,这是一个设计工具,每个客户都会设计自己的产品,显然每次产品的图片都会不同。我已经成功地将会话中的自定义数据和图片添加到购物车,然后再转为订单,但是我在这里卡住了。产品图片的名称存储在数据库中,我可以通过订单ID获取它,但是如何覆盖呢?这是关键点。 - Haider Saeed
我理解你的问题。几年前,我曾经构建过一个将WooCommerce与EZprints相结合的东西,这与你所描述的概念相同。我告诉你,就我所知,目前这是不可能实现的。我已经编辑了答案,显示出在不修改WooCommerce的情况下所能做到的最好效果。 - helgatheviking
1
FWI- 我向WC提出的过滤器已经合并到核心中,因此您可以采用这种方式,预计它最终将成为官方代码。 - helgatheviking
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接