通过id或sku扩展产品项目的后端订单列表中的搜索

时间:2016-06-11 10:51:39

标签: php wordpress woocommerce product orders

我试图使用Search by order item SKU or ID in Woocommerce Orders Admin page中的以下代码来启用天空和id搜索woocommerce订单,sku对我来说是重要的部分。

   add_filter( 'woocommerce_shop_order_search_fields', function ($search_fields ) {
    $posts = get_posts(array('post_type' => 'shop_order'));

    foreach ($posts as $post) {
        $order_id = $post->ID;
        $order = new WC_Order($order_id);
        $items = $order->get_items();

        foreach($items as $item) {
            $product_id = $item['product_id'];
            $search_sku = get_post_meta($product_id, "_sku", true);
            add_post_meta($order_id, "_product_sku", $sku);
            add_post_meta($order_id, "_product_id", $product_id);
        }
    }

    return array_merge($search_fields, array('_product_sku', '_product_id'));
});

当我将它添加到我的functions.php时,我收到以下错误:

Array() expects parameter 1 to be a valid callback, function 'woocommerce_shop_order_search_order_total' not found or invalid function name in /var/sites/s/silverfx.co.uk/public_html/wp-includes/plugin.php on line 235

Warning: array_merge(): Argument #1 is not an array in /var/sites/s/silverfx.co.uk/public_html/wp-content/themes/SilverFx-Theme/functions.php on line 156

Warning: array_map(): Argument #2 should be an array in /var/sites/s/silverfx.co.uk/public_html/wp-content/plugins/woocommerce/includes/admin/class-wc-admin-post-types.php on line 1533

Warning: array_map(): Argument #2 should be an array in /var/sites/s/silverfx.co.uk/public_html/wp-content/plugins/woocommerce/includes/admin/class-wc-admin-post-types.php on line 1557

Warning: implode(): Invalid arguments passed in /var/sites/s/silverfx.co.uk/public_html/wp-content/plugins/woocommerce/includes/admin/class-wc-admin-post-types.php on line 1557

我假设由于这是大约1岁,而且woocommerce在那段时间经历了一些重大变化,这段代码需要更新,但是我没有足够的经验与woocommerce认识到什么是错的。

如果任何人只能确认我在正确的道路上或提供指导/建议我可能需要做什么就会很棒。

谢谢

2 个答案:

答案 0 :(得分:1)

  

已更新:与WooCommerce 3 +的兼容性

虽然woocommerce_shop_order_search_fields过滤器钩子扩展了后端订单列表中的搜索,但您需要为基于id或sku的订单项搜索添加一些post_meta字段。

作者在产品sku add_post_meta()犯了一个错误。您需要使用 $sku 替换未定义的 $search_sku 变量,我认为

更新:经过一些思考和一些搜索此代码片段中使用的wordpress函数后,我想我已经得到了解决方案。

以下是与to add_post_meta() function问题相关的更新代码:

add_filter( 'woocommerce_shop_order_search_fields', function ($search_fields ) {
    $orders = get_posts( array( 'post_type' => 'shop_order' ) );

    foreach ($orders as $order_post) {
        $order_id = $order_post->ID;
        $order = new WC_Order($order_id);
        $items = $order->get_items();

        foreach( $order->get_items() as $item_id => $item_values ) {
            if ( version_compare( WC_VERSION, '3.0', '<' ) ) {
                $product_id = $item_values['product_id'];
            } else {
                $product_id = $item_values->get_product_id();
            }
            $search_sku = get_post_meta($product_id, "_sku", true);
            add_post_meta($order_id, "_product_id", $product_id, true); //  <= ## Here ##
            add_post_meta($order_id, "_product_sku", $search_sku, true); // <= ## Here ##
        }
    }
    return array_merge($search_fields, array('_product_id', '_product_sku'));
} );

当设置为true时,缺少可选参数,指定不是数组。

现在应该可以了。

参考:

答案 1 :(得分:0)

您可以在搜索结果过滤器中进行附加查询。该代码还将搜索产品元数据,例如属性等。

Relation