WooCommerce - 在购物车页面上取消“<产品>已删除通知…”

4

动作和筛选器。在我的WooCommerce网站上,当我从购物车中删除一个产品时,会收到以下消息:

"<product name>" removed. Undo?

我在查看WooCommerce源代码时,在class-wc-form-header.php中的update_cart_action()函数中发现了一个条件语句:

$removed_notice .= ' <a href="' . esc_url( WC()->cart->get_undo_url( $cart_item_key ) ) . '">' . __( 'Undo?', 'woocommerce' ) . '</a>';

但是我找不到使用它来消除这个通知的方法。我尝试了css解决方案,但它没有起作用:

enter image description here

PS:可能不是困扰我的代码片段,但这是我发现的唯一一个似乎有意义的。

如何删除这个烦人的通知?

谢谢。

5个回答

4

您可以通过以下不同的方式实现:

1. 覆盖notices.php模板:
如果尚未完成,请首先将woocommerce templates文件夹复制到您的活动子主题或主题中,然后将其重命名为woocommerce。然后打开/编辑notices/notices.php并尝试替换代码:

<?php
/**
 * Show messages
 * ... Blabla ... / ... blabla ...
 * @version     1.6.4
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit; // Exit if accessed directly
}

if ( ! $messages ){
    return;
}

?>

<?php foreach ( $messages as $message ) : // Change your template code from here
    if ( strpos( $message, 'removed' ) === false ) : ?>
    <div class="woocommerce-info"><?php echo wp_kses_post( $message ); ?></div>
<?php endif;
endforeach; ?>

2. 使用Hooks:

function remove_added_to_cart_notice()
{
    $notices = WC()->session->get('wc_notices', array());

    foreach( $notices['notices'] as $key => &$notice){
        if( strpos( $notice, 'removed' ) !== false){
            $added_to_cart_key = $key;
            break;
        }
    }
    unset( $notices['notices'][$added_to_cart_key] );

    WC()->session->set('wc_notices', $notices);
}
add_action('woocommerce_before_single_product','remove_added_to_cart_notice',1);
add_action('woocommerce_shortcode_before_product_cat_loop','remove_added_to_cart_notice',1);
add_action('woocommerce_before_shop_loop','remove_added_to_cart_notice',1);

3. 使用CSS(例如以下内容):

.woocommerce-cart .woocommerce-message {
    display: none !important;
}

参考资料:


它们完美地工作了!非常感谢您,也感谢您引用了通过将目录添加到子主题的正确方式来编辑notices.php文件。 - Daniel Gamboa
注意:自WooCommerce 3.3版本以来,通知数组的结构已更改,请查看下面Robin B的答案获取新的语法。 - Abdul Rehman

1

我不得不改变这个才能使其工作。具体来说,数组字段现在是单数的注意事项

$notices = WC()->session->get('wc_notices', array());
foreach( $notices['notice'] as $key => &$notice){
    if( strpos( $notice, 'whilst' ) !== false){ 
        $BadNotice_key = $key;
        unset( $notices['notice'][$BadNotice_key] );
        WC()->session->set('wc_notices', $notices);
        break;
    }
}

0
这个问题有一个非常简单的答案,因为有一个可以插入的钩子。
// This line is to be added in the functions.php
add_filter('woocommerce_cart_item_removed_notice_type', '__return_null');

0

关于覆盖 notices.php 模板的更新:

<?php foreach ( $notices as $notice ) :
        if ( strpos( $notice['notice'], 'removed' ) === false ) : ?>
        <div class="woocommerce-message"<?php echo wc_get_notice_data_attr( $notice ); ?> role="alert">
            <?php echo wc_kses_notice( $notice['notice'] ); ?>
        </div>
        <?php endif;
    endforeach; ?>

必须在strpos方法中添加“notice”数组键,否则它无法在通知消息中找到“removed”字符串。希望这能帮助其他人解决尝试使用此模板覆盖方法时遇到的问题。


-3

1. 简单的方法:在 wp-content/plugins/woocommerce/includes/class-wc-form-handler.php

2. 移除/禁用这一行:wc_add_notice( $removed_notice );(第523行)像这样

            if ( $product && $product->is_in_stock() && $product->has_enough_stock( $cart_item['quantity'] ) ) {
                $removed_notice  = sprintf( __( '%s removed.', 'woocommerce' ), $item_removed_title );
                $removed_notice .= ' <a href="' . esc_url( wc_get_cart_undo_url( $cart_item_key ) ) . '" class="restore-item">' . __( 'Undo?', 'woocommerce' ) . '</a>';
            } else {
                 $removed_notice = sprintf( __( '%s removed.', 'woocommerce' ), $item_removed_title );
            }
             // wc_add_notice( $removed_notice );
        }

1
如果更新插件,则不应编辑核心插件,否则您的更改将会丢失。 - ianbarker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接