- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 WooCommerce 中,我使用一个代码来显示牛排重量选择表单,保存选择数据并在购物车、结帐页面、编辑订单时和电子邮件通知中显示此数据。
我的代码还结合了一个代码,在将任何产品添加到购物车时自动添加包装。添加包装发生在 SKU 上。
/**
* Display Custom Checkbox Field
*/
function steak_custom_field_add() {
global $post;
// Checkbox
woocommerce_wp_checkbox(
array(
'id' => '_steak_checkbox',
'label' => __('Steak Weight', 'woocommerce' ),
'description' => __( 'If necessary, enable steak weight selection', 'woocommerce' )
)
);
}
add_action('woocommerce_product_options_general_product_data', 'steak_custom_field_add', 10, 0 );
/**
* Save Custom Checkbox Field
*/
function steak_custom_field_save( $post_id ) {
$product = wc_get_product( $post_id );
// Custom Product Checkbox Field
$steak_checkbox = isset( $_POST['_steak_checkbox'] ) ? 'yes' : 'no';
// Update product meta
$product->update_meta_data( '_steak_checkbox', $steak_checkbox );
// Save
$product->save();
}
add_action('woocommerce_process_product_meta', 'steak_custom_field_save', 10, 1 );
/**
* Display Custom Select Box
*/
function display_steak_custom_field() {
global $post;
// Get product
$product = wc_get_product( $post->ID );
// If is single product page and have the "steak_checkbox" enabled we display the field
if ( $product->get_meta( '_steak_checkbox' ) === 'yes' ) {
echo '<div class="roast_select">';
$select = woocommerce_form_field( 'steak_custom_options', array(
'type' => 'select',
'class' => array('my-steak-select-box form-row-wide'),
'label' => __('Steak Weight'),
'required' => false,
'return' => false,
'options' => array(
'' => 'Please select...',
'300g' => '300g',
'400g' => '400g',
'500g' => '500g',
'600g' => '600g',
'700g' => '700g',
'800g' => '800g',
'900g' => '900g',
'1000g' => '1000g'
)
), '' );
echo $select;
echo '</div>';
?>
<script type="text/javascript">
jQuery(document).ready(function ($) {
console.log('it works 1');
var price = <?php echo $product->get_price(); ?>, currency = '<?php echo get_woocommerce_currency_symbol(); ?>';
$( '[name=steak_custom_options]' ).change(function(){
if (!(this.value < 1)) {
var dropdown_val = this.value;
var remove_g = dropdown_val.replace( 'g', '' );
var remove_double_zero = remove_g.replace( '00', '' );
var product_total = parseFloat( price * remove_double_zero );
// For single product page
$( '.entry-summary .woocommerce-Price-amount' ).html( currency + product_total.toFixed(2));
// quick-view-custom-price
$( '.quick-view-custom-price .woocommerce-Price-amount' ).html( currency + product_total.toFixed(2));
}
});
});
</script>
<?php
}
}
add_action( 'woocommerce_before_add_to_cart_button', 'display_steak_custom_field', 10, 0 );
/**
* Add as custom cart item data
*/
function add_custom_steak_cart_item_data( $cart_item_data, $product_id, $variation_id, $quantity ) {
// Get product
$product = wc_get_product( $product_id );
// Get product sku
$product_sku = $product->get_sku();
if ( !empty( $_POST['steak_custom_options'] ) && $product_sku != 'lunchbox' ) {
$cart_item_data['steak_option'] = $_POST['steak_custom_options'];
}
return $cart_item_data;
}
add_filter( 'woocommerce_add_cart_item_data', 'add_custom_steak_cart_item_data', 10, 4 );
/**
* Add custom fields values under cart item name in cart
*/
function steak_custom_field_add_cart( $item_name, $cart_item, $cart_item_key ) {
if( is_cart() ) {
if( isset( $cart_item['steak_option'] ) ) {
$item_name .= '<div class="my-steak-class"><strong>' . __("Steak Weight", "woocommerce") . ':</strong> ' . $cart_item['steak_option'] . '</div>';
}
}
return $item_name;
}
add_filter( 'woocommerce_cart_item_name', 'steak_custom_field_add_cart', 10, 3 );
/**
* Calculate the number of lunchboxes and package, based on the number of products in cart.
*/
function add_delivery_charge_to_cart( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
/********** SETTINGS **********/
$lunchbox_sku = 'lunchbox'; // "LunchBox SKU" to be added to cart
$pakket_sku = 'pakket'; // "Pakket SKU" to be added to cart
$exclude_categories = array( 'drink', 'bread' ); // Exclude these categories
/********** END SETTINGS **********/
// Get product ID by SKU
$lunchbox_id = wc_get_product_id_by_sku( $lunchbox_sku );
$pakket_id = wc_get_product_id_by_sku( $pakket_sku );
$category_qty_total = 0; // Total of category quantity items, Don't edit!!
/********** LOOP THROUGH CART ITEMS **********/
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
// Get product id
$product_id = $cart_item['data']->get_id();
// Get product quantity
$product_qty = $cart_item['quantity'];
// Check if "LunchBox" product is already in cart
if( $product_id == $lunchbox_id ) {
$lunchbox_key = $cart_item_key;
$lunchbox_qty = $product_qty;
}
// Check if "Pakket" product is already in cart
if( $product_id == $pakket_id ) {
$pakket_key = $cart_item_key;
$pakket_qty = $product_qty;
}
// Check if product belongs to a certain category
if( has_term( $exclude_categories, 'product_cat', $product_id ) ) {
$category_qty_total += $product_qty;
}
// Check if product, contains steak weight
if( isset( $cart_item['steak_option'] ) ) {
// Remove the last 2 zeros (100g becomes 1, 300g becomes 3, 1000g becomes 10, etc...)
// Remove 'g' from grams
// convert string to integer
$chosen_weight = (int) str_replace( '00', '', str_replace('g', '', $cart_item['steak_option']) );
// Get current price
$current_price = $cart_item['data']->get_price();
// Set new price, price is already known per 100g
$cart_item['data']->set_price( $current_price * $chosen_weight );
}
}
/********** CALCULATE THE TOTALS, SO "LUNCHBOX", "PAKKET" & CATEGORIES ARE NOT USED IN THE TOTALS **********/
// Get total items in cart, counts number of products & quantity per product
$total_items_in_cart = $cart->get_cart_contents_count();
// Total items in cart - category quantity total
$total_items_in_cart -= $category_qty_total;
// Lunchbox total = total_items_in_cart & pakket total = total_items_in_cart
$lunchbox_total = $total_items_in_cart;
$pakket_total = $total_items_in_cart;
// Isset lunchbox qty -> lunchbox total - lunchbox qty & pakket total - lunchbox qty
if ( isset($lunchbox_qty) ) {
$lunchbox_total -= $lunchbox_qty;
$pakket_total -= $lunchbox_qty;
}
// Isset pakket qty -> lunchbox total - pakket qty & pakket total - pakket qty
if ( isset($pakket_qty) ) {
$lunchbox_total -= $pakket_qty;
$pakket_total = $pakket_total - $pakket_qty;
}
/********** APPLY NEW TOTALS TO LUNCHBOX & PAKKET **********/
// If product "LunchBox" is in cart, we check the quantity to update it if needed
if ( isset($lunchbox_key) && $lunchbox_qty != $total_items_in_cart ) {
// Set quantity, lunchbox
$cart->set_quantity( $lunchbox_key, $lunchbox_total );
} elseif ( !isset($lunchbox_key) && $total_items_in_cart > 0 ) {
// Product "LunchBox" is not in cart, we add it
$cart->add_to_cart( $lunchbox_id, $total_items_in_cart );
}
// Total items in cart greater than or equal to 3
if ( $total_items_in_cart >= 3 ) {
// Pakket total = pakket_total / 3 = floor(result)
// Floor = round fractions down, rounding result down
$pakket_total = floor( $pakket_total / 3 );
// If product "Pakket" is in cart
if ( isset($pakket_key) ) {
// Set quantity, pakket
$cart->set_quantity( $pakket_key, $pakket_total );
} elseif ( !isset($pakket_key) ) {
// Product "Pakket" is not in cart, we add it
$cart->add_to_cart( $pakket_id, $pakket_total );
}
}
}
add_action( 'woocommerce_before_calculate_totals', 'add_delivery_charge_to_cart', 10, 1 );
/**
* Display custom fields values under item name in checkout
*/
function steak_custom_checkout_cart_item_name( $item_qty, $cart_item, $cart_item_key ) {
if( isset($cart_item['steak_option']) ) {
$item_qty .= '<div class="my-steak-class"><strong>' . __("Steak Weight", "woocommerce") . ':</strong> ' . $cart_item['steak_option'] . 'g</div>';
}
return $item_qty;
}
add_filter( 'woocommerce_checkout_cart_item_quantity', 'steak_custom_checkout_cart_item_name', 10, 3 );
/**
* Display custom fields values under item name in checkout
*/
function save_order_item_steak_field( $item, $cart_item_key, $values, $order ) {
if( isset($values['steak_option']) ) {
$key = __('Steak Weight', 'woocommerce');
$value = $values['steak_option'];
$item->update_meta_data( $key, $value ,$item->get_id());
}
}
add_action('woocommerce_checkout_create_order_line_item', 'save_order_item_steak_field', 10, 4 );
有一次,用户@7uc1f3r 帮助进行了自定义排序,使包装始终位于购物车中产品列表的最底部。
function sort_cart_specific_product_at_bottom( $cart ) {
// Product id's to to display at tbe bottom of the product list
$product_ids_last = array( 30, 815 );
// Set empty arrays
$products_in_cart = array();
$products_last = array();
$cart_contents = array();
// Loop through cart items
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
// Get product id
$product_id = $cart_item['data']->get_id();
// In_array — checks if a value exists in an array
if ( in_array( $product_id, $product_ids_last) ) {
// Add to products last array
$products_last[ $cart_item_key ] = $product_id;
} else {
// Add to products in cart array
$products_in_cart[ $cart_item_key ] = $product_id;
}
}
// Merges the elements together so that the values of one are appended to the end of the previous one.
$products_in_cart = array_merge( $products_in_cart, $products_last );
// Assign sorted items to cart
foreach ( $products_in_cart as $cart_item_key => $product_id ) {
$cart_contents[ $cart_item_key ] = $cart->cart_contents[ $cart_item_key ];
}
// Cart contents
$cart->cart_contents = $cart_contents;
}
add_action( 'woocommerce_cart_loaded_from_session', 'sort_cart_specific_product_at_bottom', 10, 1 );
但不幸的是,排序代码有点过时,因为现在包裹是按SKU添加的,而不是按ID添加的。因此,排序不起作用。
如果按 SKU 添加包装,如何更改排序代码?
我很乐意为您提供帮助!
最佳答案
以下代码将根据产品 sku 对产品进行最后排序
相关主题:
function sort_cart_specific_product_at_bottom( $cart ) {
// Product sku to to display at tbe bottom of the product list
$product_sku_last = array( 'lunchbox', 'pakket' );
// Set empty arrays
$products_in_cart = array();
$products_last = array();
$cart_contents = array();
// Loop through cart items
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
// Get product sku
$product_sku = $cart_item['data']->get_sku();
// Get product id
$product_id = $cart_item['data']->get_id();
// In_array — checks if a value exists in an array
if ( in_array( $product_sku, $product_sku_last ) ) {
// Add to products last array
$products_last[ $cart_item_key ] = $product_id;
} else {
// Add to products in cart array
$products_in_cart[ $cart_item_key ] = $product_id;
}
}
// Merges the elements together so that the values of one are appended to the end of the previous one.
$products_in_cart = array_merge( $products_in_cart, $products_last );
// Assign sorted items to cart
foreach ( $products_in_cart as $cart_item_key => $product_id ) {
$cart_contents[ $cart_item_key ] = $cart->cart_contents[ $cart_item_key ];
}
// Cart contents
$cart->cart_contents = $cart_contents;
}
add_action( 'woocommerce_cart_loaded_from_session', 'sort_cart_specific_product_at_bottom', 10, 1 );
并且此代码确保基于 sku 的商品不会从购物车中移除
function prevent_cart_item_remove_link( $link, $cart_item_key ) {
// Product sku that should not be removable
$product_sku_last = array( 'lunchbox', 'pakket' );
if( WC()->cart->find_product_in_cart( $cart_item_key ) ) {
$cart_item = WC()->cart->cart_contents[ $cart_item_key ];
// Get product sku
$product_sku = $cart_item['data']->get_sku();
// In_array — checks if a value exists in an array
if ( in_array( $product_sku, $product_sku_last ) ) {
$link = '';
}
}
return $link;
}
add_filter( 'woocommerce_cart_item_remove_link', 'prevent_cart_item_remove_link', 10, 2 );
关于php - 按 SKU 对购物车 WooCommerce 中产品列表底部的产品进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61240043/
我正在尝试对每个条目有多个值的关联数组进行排序。 例如 [0] => stdClass Object ( [type] => node [sid] => 158 [score] => 0.059600
我在 mysql 中有“日期”列以这种格式保存日期 2014 年 9 月 17 日(日-月-年) 我需要对它们进行升序排序,所以我使用了这个命令: SELECT * FROM table ORDER
我目前正在将 MySQL 存储过程重写为 MS SQL 存储过程,但遇到了问题。 在 MySQL 存储过程中,有一个游标,它根据最近的日期 (effdate) 选择一个值并将其放入变量 (thestt
我想要 gwt r.QuestionId- 排序。但是我得到未排序的 QuestionId 尽管我提到了 QuestionId ASC 的顺序。 SELECT r.QuestionId,
我有一个关于在 scandir 函数中排序的基本问题。到目前为止,我阅读了 POSIX readdir 的手册页,但没有找到有关订购保证的具体信息。 但是当我遍历大目录(无法更改,只读)时,我在多个系
基本上我必须从 SQL 数据库中构建项目列表,但是用户可以选择对 7 个过滤器的任意组合进行过滤,也可以选择要排序的列以及按方向排序。 正如您可以想象的那样,这会以大量不同的组合进行编码,并且数据集非
我有两张 table 。想象第一个是一个目录,包含很多文件(第二个表)。 第二个表(文件)包含修改日期。 现在,我想选择所有目录并按修改日期 ASC 对它们进行排序(因此,最新的修改最上面)。我不想显
我想先根据用户的状态然后根据用户名来排序我的 sql 请求。该状态由 user_type 列设置: 1=活跃,2=不活跃,3=创始人。 我会使用此请求来执行此操作,但它不起作用,因为我想在“活跃”成员
在 C++ 中,我必须实现一个“类似 Excel/Access”(引用)的查询生成器,以允许对数据集进行自定义排序。如果您在 Excel 中使用查询构建器或 SQL 中的“ORDER BY a, b,
我面临这样的挑战: 检索按字段 A 排序的文档 如果字段 B 存在/不为空 . 否则 按字段排序 C. 在 SQL 世界中,我会做两个查询并创建一个 UNION SELECT,但我不知道如何从 Mon
我想对源列表执行以下操作: map 列表 排序 折叠 排序 展开 列表 其中一些方法(例如map和toList)是可链接的,因为它们返回非空对象。但是,sort 方法返回 void,因为它对 List
我制作了一个用于分析 Windows 日志消息编号的脚本。 uniq -c 数字的输出很难预测,因为根据数字的大小会有不同的空白。此时,我手动删除了空白。 这是对消息进行排序和计数的命令: cat n
我有以下词典: mydict1 = {1: 11, 2: 4, 5: 1, 6: 1} mydict2 = {1: 1, 5: 1} 对于它们中的每一个,我想首先按值(降序)排序,然后按键(升序)排序
我刚刚开始使用泛型,目前在对多个字段进行排序时遇到问题。 案例: 我有一个 PeopleList 作为 TObjectList我希望能够通过一次选择一个排序字段,但尽可能保留以前的排序来制作类似 Ex
有没有办法在 sql 中组合 ORDER BY 和 IS NULL 以便我可以在列不为空时按列排序,但如果它为null,按另一列排序? 最佳答案 类似于: ORDER BY CASE WHEN
我有一个包含 2 列“id”和“name”的表。 id 是常规的自动增量索引,name 只是 varchar。 id name 1 john 2 mary 3 pop 4 mary 5 j
场景 网站页面有一个带有分页、过滤、排序功能的表格 View 。 表中的数据是从REST API服务器获取的,数据包含数百万条记录。 数据库 REST API 服务器 Web 服务器 浏览器 问
假设我有一本字典,其中的键(单词)和值(分数)如下: GOD 8 DONG 16 DOG 8 XI 21 我想创建一个字典键(单词)的 NSArray,首先按分数排序,然后按字
如何在 sphinx 上通过 sql 命令选择前 20 行按标题 WEIGHT 排序,接下来 20 行按标题 ASC 排序(总共 40 个结果),但不要给出重复的标题输出。 我尝试了这个 sql 命令
我有一个奇怪的问题,当从 SQLite 数据库中选择信息并根据日期排序时,返回的结果无效。 我的SQL语句是这样的: Select pk from usersDates order by dateti
我是一名优秀的程序员,十分优秀!