【问题标题】:Woocommerce Admin Order Details - Show custom data on order details pageWoocommerce 管理员订单详细信息 - 在订单详细信息页面上显示自定义数据
【发布时间】:2023-03-30 20:06:01
【问题描述】:

我搜索并尝试了2天没有成功,请帮助。

我想过滤 woocommerce 订单以根据产品属性将额外的详细信息从 db 添加到订单详细信息页面,但我找不到适合此任务的 woocommerce 操作/过滤器挂钩。 这里假设我有变量$is_customized = false;

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

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

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

我的变量中有所有这些值,但我不知道应该使用哪个动作挂钩。

我附上了一张图片以供澄清。

只需要知道我是否可以更改/过滤这些订单结果以及如何更改/过滤?

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

【问题讨论】:

  • 像任何其他自定义帖子类型列一样,通过manage $post type posts columnsmanage $post type posts custom column 处理。在订单的情况下,帖子类型是shop_order
  • 没关系,我只是仔细查看了您的屏幕截图,这不是我的想法。也就是说,它是一个元框,所以最坏的情况是你可以删除它,然后添加一个修改后的版本。
  • 意味着没有可用的操作/过滤器来过滤这些结果或自定义它而不是重写整个模块?
  • manage_edit-shop_order_columnsmanage_shop_order_posts_custom_column 这些都在订单表中添加了额外的列,但我想在订单编辑页面中添加列,其中的详细信息列出了具体的顺序。
  • 您可以在html-order-items.phphtml-order-item.php 中查看您可以使用的钩子

标签: php wordpress content-management-system woocommerce


【解决方案1】:

下面是如何在 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>';
}

我不知道您是如何保存数据的,所以我无法提出更准确的建议。请记住,在该挂钩之后,您保存为订单项元数据的任何内容都会自动显示。

过滤图像更加困难。我发现这个gist 作为开始,但它需要一些自定义条件逻辑,因为您不想在任何地方过滤缩略图,而只能按顺序过滤。

编辑:目前我能做的最好的过滤项目缩略图:

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

【讨论】:

  • 非常感谢,这正是我正在寻找的东西。你能告诉我如何替换图像吗?而且我在这里还需要一个数量过滤器。表示如果条件为真,我不想显示数量。
  • 越看越觉得过滤图片会非常困难,可能需要在 WooCommerce 中添加一些过滤器。一般来说,这很容易做到,但get_post_thumbnail_id() 函数完全依赖于$post_id,目前我无法发送$order_item,这是该特定产品的独特版本订购。
  • 是的,让我解释一下。实际上它是一种设计工具,每个客户都会设计自己的产品,显然每次的产品形象都会有所不同。我已经成功地将会话中的自定义数据和图像添加到购物车,然后下订单,但我只是被困在这里。产品图像的名称在数据库中,我可以通过订单 ID 获取它,但如何覆盖?这是重点。
  • 我理解你的问题。我几年前构建了一些东西,将 WooCommerce 与 EZprints 结合起来,这与您描述的概念相同。我告诉你,它(据我所知)目前是不可能的。我已经编辑了答案以显示在不修改 WooCommerce 的情况下我能做的最好的事情。
  • FWI- 我向 WC 提出的过滤器已被合并到核心中,因此您可以沿着这条路线走,期待它最终会成为官方代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
相关资源
最近更新 更多