필수 범주의 제품이 카트에 있는 경우에만 체크아웃 허용
저는 어떤 고객이라도 바구니에 특별한 상품 카테고리가 없다면 체크아웃을 진행하는 것을 중단하고 싶습니다.그들에게 특정 제품을 추가해야 한다는 오류 메시지도 전달하고 싶습니다.코드를 찾았는데 작동이 안 됩니다.워드프레스 설치에 코드 스니펫으로 추가했지만 디버깅 스위치를 켰는데도 작동하지 않고 오류 메시지도 없습니다.이것이 작동하기 위해 수정이 필요할 수 있는 Github에서 찾은 코드는 다음과 같습니다.
function sv_wc_prevent_checkout_for_category() {
// set the slug of the category for which we disallow checkout
$category = 'sibling';
// get the product category
$product_cat = get_term_by( 'slug', $category, 'product_cat' );
// sanity check to prevent fatals if the term doesn't exist
if ( is_wp_error( $product_cat ) ) {
return;
}
$category_name = '<a href="' . get_term_link( $category, 'product_cat' ) . '">' . $product_cat->name . '</a>';
// check if this category is the only thing in the cart
if ( sv_wc_is_category_alone_in_cart( $category ) ) {
// render a notice to explain why checkout is blocked
wc_add_notice( sprintf( 'Hi there! Looks like your cart only contains products from the %1$s category – you must purchase a product from another category to check out.', $category_name ), 'error' );
}
}
add_action( 'woocommerce_check_cart_items', 'sv_wc_prevent_checkout_for_category' );
/**
* Checks if a cart contains exclusively products in a given category
*
* @param string $category the slug of the product category
* @return bool - true if the cart only contains the given category
*/
function sv_wc_is_category_alone_in_cart( $category ) {
// check each cart item for our category
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
// if a product is not in our category, bail out since we know the category is not alone
if ( ! has_term( $category, 'product_cat', $cart_item['data']->id ) ) {
return false;
}
}
// if we're here, all items in the cart are in our category
return true;
}
그래서 카트에 'sibling' 카테고리만 있으면 체크아웃(오류 메시지와 함께)을 중지하려고 합니다.고객이 체크아웃하기 전에 바구니에 담아야 하는 '표준' 카테고리가 있습니다.이게 말이 되기를 바랍니다.
여기에 요령을 터득할 수 있는 해결책이 방법이 있습니다.특히 두 가지 주요 기능(마지막 기능)이 있습니다.
- 첫 번째 기능(N°3)은 카트에 필수 제품 범주가 아닌 무언가가 있을 때 카트 페이지에 메시지를 표시합니다.필수 제품 보관 페이지에 메시지도 표시합니다(고객이 체크아웃에서 리디렉션될 때 유용함, 아래 참조).
- 두 번째 기능(N°4)은 고객이 체크아웃을 시도할 때 제품 필수 카테고리 보관 페이지로 리디렉션하며 카트에 필수 제품 카테고리가 누락되어 있지 않습니다.
필수 범주 슬러그가 기능하기 전에 정의합니다.
코드는 다음과 같습니다.
// Function that define the mandatory product category
function your_mandatory_category_slug(){
// DEFINE HERE the SLUG of the needed product category
$category = 'clothing';
return $category;
}
// Conditional function that returns true if the mandatory product category is in cart
function has_mandatory_category(){
$category_needed = your_mandatory_category_slug();
$has_cat = false;
// Iterrating each item in cart and detecting…
foreach ( WC()->cart->get_cart() as $item ) {
// Detects if the needed product category is in cart items
if ( has_term($category_needed, 'product_cat', $item['product_id'] ) ) {
$has_cat = true;
break;
}
}
return $has_cat;
}
// Function that display a message if there is not in cart a mandatory product category
function mandatory_category_display_message() {
$category_needed = your_mandatory_category_slug();
// check that cart is not empty (for cart and product category archives)
if( !WC()->cart->is_empty() && ( is_cart() || is_product_category( $category_needed ) ) ){
$category_obj = get_term_by( 'slug', $category_needed, 'product_cat' );
if ( is_wp_error( $category_obj ) ) return;
// Display message when product category is not in cart items
if ( !has_mandatory_category() ) {
$category_name = $category_obj->name;
$category_url = get_term_link( $category_needed, 'product_cat' );
// render a notice to explain why checkout is blocked
wc_add_notice( sprintf( __( '<strong>Reminder:</strong> You have to add in your cart, a product from "%1$s" category, to be allowed to check out. Please return <a href="%2$s"> here to "%1$s" product page</a>', 'your_theme_domain'), $category_name, $category_url ), 'error' );
}
}
}
add_action( 'woocommerce_before_main_content', 'mandatory_category_display_message', 30 ); // for product mandatory category archives pages
add_action( 'woocommerce_check_cart_items', 'mandatory_category_display_message' ); // for cat page
// Function that redirect from checkout to mandatory product category archives pages
function mandatory_category_checkout_redirect() {
// If cart is not empty on checkout page
if( !WC()->cart->is_empty() && is_checkout() ){
$category_needed = your_mandatory_category_slug();
// If missing product category => redirect to the products category page
if ( !has_mandatory_category() )
wp_redirect( get_term_link( $category_needed, 'product_cat' ) );
}
}
add_action('template_redirect', 'mandatory_category_checkout_redirect');
이것은 제 기능을 합니다.활성 하위 테마(또는 테마)의 php 파일 또는 플러그인 파일에 있습니다.
이 코드는 테스트되었으며 완전히 작동합니다.
Loic The Aztec의 답변을 두 가지 카테고리로 작업하도록 각색했습니다.효과가 있는 것 같습니다.텍스트를 수정하지 않았습니다.has_mandatory_categorytext
function, . 만약 당신이 코드를 따를 수 있다면 당신은 diy를 할 수 있지만, 나는 단지 기능에 집중하고 있었습니다.여기 또 다른 답변이 있는데 저는 이 답변이 더 마음에 들고 다른 답변은 제게 맞지 않았습니다.
// Function that define the 2 mandatory product categories cat1 & cat2
function your_mandatory_category_slug(){ $category = 'cat1'; return $category; }
function your_mandatory_category_slug2(){ $category = 'cat2'; return $category; }
// Conditional function that returns true if the mandatory product category is in cart
function has_mandatory_category1(){
$category_needed = your_mandatory_category_slug();
$has_cat = false;
foreach ( WC()->cart->get_cart() as $item ) {
if ( has_term($category_needed, 'product_cat', $item['product_id'] ) ) {
$has_cat = true;
break;
}
}
return $has_cat;
}
// Conditional function that returns true if the mandatory product category is in cart
function has_mandatory_category2(){
$category_needed = your_mandatory_category_slug2();
$has_cat = false;
foreach ( WC()->cart->get_cart() as $item ) {
if ( has_term($category_needed, 'product_cat', $item['product_id'] ) ) {
$has_cat = true;
break;
}
}
return $has_cat;
}
// Function that redirect from checkout to mandatory product category archives pages
function mandatory_category_checkout_redirect() {
// If cart is not empty on checkout page
if( !WC()->cart->is_empty() && is_checkout() ){
$category_needed = your_mandatory_category_slug();
$category_needed2 = your_mandatory_category_slug2();
if ( !has_mandatory_category1() )
wp_redirect( get_term_link( $category_needed, 'product_cat' ) );
if ( !has_mandatory_category2() )
wp_redirect( get_term_link( $category_needed2, 'product_cat' ) );
}
}
add_action('template_redirect', 'mandatory_category_checkout_redirect');
Woocommerce v2.6.12로 Wordpress 설치에 매력적으로 작용합니다.
앞으로 3개나 4개 정도의 필수 제품 카테고리를 두 개 추가하고 싶습니다.변경을 시도했습니다.
$category = 'slug1';
로.
$category = 'slug1', 'slug2';
그리고.
$category = array('slug1','slug2');
성공하지 못했습니다.이 코드를 여러 개의 슬러그와 함께 작동시키는 방법이 있습니까?
언급URL : https://stackoverflow.com/questions/39644645/allow-checkout-only-when-a-product-of-a-mandatory-category-is-in-cart
'programing' 카테고리의 다른 글
0과 1사이의 신속한 무작위 유동 (0) | 2023.10.30 |
---|---|
도커 디버깅은 mariadb 상태 점검을 구성합니다. (0) | 2023.10.30 |
*ngIf에 대해 Angular 8 HTML 템플릿에서 Enum 사용 (0) | 2023.10.30 |
HTML 캔버스에서 텍스트의 높이를 어떻게 찾을 수 있습니까? (0) | 2023.10.30 |
Postgre와 동등한 오라클SQL INSERT...돌아오는 *; (0) | 2023.10.30 |