Joh*_*ith 2 php wordpress orders woocommerce taxonomy-terms
我有一家商店,里面有很多不同的产品。所有订单都是专门为客户定制的。这意味着当我们在仓库收到产品时,我们需要找到特定产品的订单。现在我们只需手动检查大多数订单即可。
我们想要做的事情是通过自定义属性术语搜索订单,这将为我们节省宝贵的时间。例如:我们对定制订单使用属性“尺寸”。我们有24个“尺寸”术语(例如“12cm”,:16cm”等)。我们想根据尺寸术语查找订单。例如:查找所有尺寸为“48cm”的订单。
基于按 id 或 sku 在后端订单列表中扩展产品项目的搜索,这是我的代码尝试:
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();
}
$attribute = $item_values->get_data();
// attribute value
$value = $attribute['value'];
// attribute slug
$slug = $attribute['size'];
add_post_meta($order_id, $slug, $value, true); //
}
}
return array_merge($search_fields, array($slug));
});
Run Code Online (Sandbox Code Playgroud)
但这没有用。任何帮助表示赞赏。
您尝试做的事情在您的情况下并不能真正起作用,并且这是一个非常繁重的过程,可能会导致管理崩溃或降低整个网站的速度。
\n您可以做的不是显示所有现有尺寸值的下拉列表,以过滤您的订单:
\n\n请注意,每个产品属性分类法都以pa_+ 产品属性的 slug 开头。我已在代码中将“尺寸”的产品属性分类设置为pa_size.
有关信息,下面的代码使用非常轻的 SQL 自定义查询。
\n// Custom function where metakeys / labels pairs are defined\nfunction get_product_attribute_size_terms(){\n $taxonomy = \'pa_size\';\n $options = array();\n\n foreach ( get_terms( array(\'taxonomy\' => \'pa_size\' ) ) as $term ) {\n $options[$term->slug] = $term->name;\n }\n return $options;\n}\n\n// Add a dropdown to filter orders by variations size\nadd_action( \'restrict_manage_posts\', \'display_admin_shop_order_by_meta_filter\' );\nfunction display_admin_shop_order_by_meta_filter(){\n global $pagenow, $typenow;\n\n if( \'shop_order\' === $typenow && \'edit.php\' === $pagenow ) {\n $domain = \'woocommerce\';\n $filter_id = \'by_size\';\n $current = isset($_GET[$filter_id])? $_GET[$filter_id] : \'\';\n\n echo \'<select name="\'.$filter_id.\'">\n <option value="">\' . __(\'Filter by Size\xe2\x80\xa6\', $domain) . \'</option>\';\n\n $options = get_product_attribute_size_terms();\n\n foreach ( $options as $key => $label ) {\n printf( \'<option value="%s"%s>%s</option>\', $key,\n $key === $current ? \'" selected="selected"\' : \'\', $label );\n }\n echo \'</select>\';\n }\n}\n\nadd_action( \'pre_get_posts\', \'process_admin_shop_order_product_type_filter\' );\nfunction process_admin_shop_order_product_type_filter( $query ) {\n global $pagenow, $post_type, $wpdb;\n\n $filter_id = \'by_size\';\n $taxonomy = \'pa_size\';\n\n if ( $query->is_admin && \'edit.php\' === $pagenow && \'shop_order\' === $post_type\n && isset( $_GET[$filter_id] ) && $_GET[$filter_id] != \'\' ) {\n\n $attribute_taxonomy = \'attribute_\'.$taxonomy;\n\n $order_ids = $wpdb->get_col( $wpdb->prepare("\n SELECT DISTINCT opl.order_id\n FROM {$wpdb->prefix}wc_order_product_lookup opl\n INNER JOIN {$wpdb->prefix}postmeta pm\n ON opl.variation_id = pm.post_id\n WHERE pm.meta_key = %s\n AND pm.meta_value = \'%s\'\n ", $attribute_taxonomy, esc_attr($_GET[$filter_id]) ) );\n\n $query->set( \'post__in\', count($order_ids) > 1 ? $order_ids : array(0) ); // Set queried order ids\n\n $query->set( \'posts_per_page\', 25 ); // Set "posts per page"\n\n $query->set( \'paged\', ( get_query_var(\'paged\') ? get_query_var(\'paged\') : 1 ) ); // Set "paged"\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n代码位于活动子主题(或活动主题)的functions.php 文件中。经过测试并有效。
\n相关:在 WooCommerce 管理订单列表页面中按产品帖子类型过滤订单
\n| 归档时间: |
|
| 查看次数: |
1826 次 |
| 最近记录: |