2016-09-21 2 views
0

Я пытаюсь удалить класс с помощью кнопки в woocommerce, которая находится в файле wc_cart_functions.php. Существует строка в функции wc_add_to_cart_message, которая вставляет эту строку:Добавить фильтр для изменения определенной части функции

<a href="%s" class="button wc-forward">%s</a> %s

function wc_add_to_cart_message($products, $show_qty = false) { 
$titles = array(); 
$count = 0; 

if (! is_array($products)) { 
    $products = array($products); 
    $show_qty = false; 
} 

if (! $show_qty) { 
    $products = array_fill_keys(array_keys($products), 1); 
} 

foreach ($products as $product_id => $qty) { 
    $titles[] = ($qty > 1 ? absint($qty) . ' &times; ' : '') . sprintf(_x('&ldquo;%s&rdquo;', 'Item name in quotes', 'woocommerce'), strip_tags(get_the_title($product_id))); 
    $count += $qty; 
} 

$titles  = array_filter($titles); 
$added_text = sprintf(_n('%s has been added to your cart.', '%s have been added to your cart.', $count, 'woocommerce'), wc_format_list_of_items($titles)); 

// Output success messages 
if ('yes' === get_option('woocommerce_cart_redirect_after_add')) { 
    $return_to = apply_filters('woocommerce_continue_shopping_redirect', wc_get_raw_referer() ? wp_validate_redirect(wc_get_raw_referer(), false) : wc_get_page_permalink('shop')); 
    $message = sprintf('<a href="%s" class="button wc-forward">%s</a> %s', esc_url($return_to), esc_html__('Continue Shopping', 'woocommerce'), esc_html($added_text)); 
} else { 
    $message = sprintf('<a href="%s" class="button wc-forward">%s</a> %s', esc_url(wc_get_page_permalink('cart')), esc_html__('View Cart', 'woocommerce'), esc_html($added_text)); 
} 

wc_add_notice(apply_filters('wc_add_to_cart_message', $message, $product_id)); 
} 

Я пытался создать фильтр, который будет просто заменить эту конкретную строку, так как она появляется дважды, и в обоих случаях я хочу класс удален. Это не похоже на работу, хотя:

add_filter('wc_add_to_cart_message', 'add_to_cart_mod'); 
function add_to_cart_mod($message) { 
    $message = str_replace ('<a href="%s" class="button wc-forward">%s</a> %s' , '<a href="%s" class="button">%s</a> %s', $message); 
return $message; 
} 

С этим набором фильтров, как это, я все еще вижу кнопку с тем же неизменным классом. Есть предположения?

ответ

1

Ваш фильтр ожидает найти %s, но это было заменено предыдущим вызовом на sprintf: этих %s больше нет.

Вы можете попробовать с регулярным выражением:

$message = preg_replace ('/(<a [^>]+)class="button wc-forward"/', 
         '$1class="button"', $message);  

[^>]+ часть означает любую последовательность символов, которая не содержит > (конец a тега).

$1 означает: все, что было согласовано между круглыми скобками. Это может быть что-то вроде <a href="http://example.com".

+0

Благодаря @trincot. Это полностью удаляет свойство класса. Пара вопросов о вашем ответе; что (] +), а также то, что означает $ 1? – antonanton

+0

Я исправил это: теперь класс заменяется. Я также добавил объяснения. – trincot

+0

благодарим вас за объяснение! – antonanton

0

Вы можете попробовать это:

add_filter('wc_add_to_cart_message', 'add_to_cart_mod'); 

function add_to_cart_mod($message) { 
    // Output success messages 
    if ('yes' === get_option('woocommerce_cart_redirect_after_add')) { 
     $return_to = apply_filters('woocommerce_continue_shopping_redirect', wc_get_raw_referer() ? wp_validate_redirect(wc_get_raw_referer(), false) : wc_get_page_permalink('shop')); 
     $message = sprintf('<a href="%s" class="button">%s</a> %s', esc_url($return_to), esc_html__('Continue Shopping', 'woocommerce'), esc_html($added_text)); 
    } else { 
     $message = sprintf('<a href="%s" class="button">%s</a> %s', esc_url(wc_get_page_permalink('cart')), esc_html__('View Cart', 'woocommerce'), esc_html($added_text)); 
    } 

    return $message; 
} 
+0

Эй, Энди, который удаляет часть $ added_text кода, в результате чего появляется только кнопка и текст отсутствует. Но класс кнопки работает – antonanton

Смежные вопросы