Попытка снять метки и значение фильтра в Woocommerce, но не может управлять o получить его в правильном формате. Что-то рыбное.
Использую WC()->cart->get_cart_subtotal();
для получения значения. В этом примере мое значение равно 2429kr, а необработанное возвращаемое значение <span class="amount">2,429kr</span>
$cart_total = WC()->cart->get_cart_subtotal(); $cart_total_format = strip_tags($cart_total); $cart_value = preg_filter("/[^0-9,.]/", "", $cart_total_format); echo $cart_value;
Результат = 2,429107114
Ожидаемый = 2,429
Я не мастер PHP, поэтому я думал, что делаю что-то не так, и попробовал несколько различных подходов и методов, не получив правильного результата.
Затем я попытался запустить исходный вывод из WC()->cart->get_cart_subtotal();
как $ string
$string_total = '<span class="amount">2,429kr</span>'; $string_total_format = strip_tags($string_total); $string_value = preg_filter("/[^0-9,.]/", "", $string_total_format); echo $string_value;
Результат = 2,429
Ожидаемый = 2,429
Зачем? 🙁
Обновить
Нашел это, когда копал в Woocommerce @Github
case 'SEK' : $currency_symbol = 'kr'; break;
Таким образом, реальная ценность:
<span class="amount">2,429kr</span>
Вопрос в том, что лучший способ отфильтровать это? Мой быстрый подход заключается в том, что это не красиво, но исправить проблему.
$cart_total = WC()->cart->get_cart_subtotal(); $cart_total_format = strip_tags($cart_total); $cart_value = preg_filter("/[^0-9,.]/","", $cart_total_format); $cart_value_new = preg_filter("/107114/",".", $cart_value); echo $cart_value_new;
Результат = 2,429
Ожидаемый = 2,429
Хорошо, так это то, что происходит. get_cart_subtotal()
возвращает строку, закодированную в HTML. Поскольку вы не смотрите на фактический источник, а скорее на var_dump
и просматриваете HTML-код, вы видите <span class="amount">2,429kr</span>
, когда на самом деле "k" и "r" закодированы в их эквивалентные объекты HTML (на основе их кодов ASCII ), k
и r
.
Вот почему var_dump
показывает string(45) "2,429kr"
когда она должна фактически вернуть string(7) "2,429kr"
если валюта не была закодирована (а теги <span>
не были интерпретированы браузером) ,
Затем, когда вы применяете preg_filter
, он также включает числа из объектов HTML, конечно, потому что они соответствуют регулярному выражению.
Таким образом, самым простым решением является декодирование всех объектов HTML перед фильтрацией:
$cart_total = html_entity_decode($cart_total, ENT_QUOTES, 'UTF-8');
поэтому ваш код будет:
$cart_total = WC()->cart->get_cart_subtotal(); $cart_total = html_entity_decode($cart_total, ENT_QUOTES, 'UTF-8'); // rest of your code
Просто догадка:
Возможно, WC()->cart->get_cart_subtotal()
return '<span class="amount">2,429107114kr</span>'
, но при его отображении вы видите <span class="amount">2,429kr</span>
из-за некоторого javascript, который вокруг него.