Попытка удалить теги и значение фильтра в Woocommerce, но не удается получить его в правильном формате. Что-то подозрительно ..
Использую WC()->cart->get_cart_subtotal();
чтобы получить значение. В этом примере мое значение 2,429kr, а необработанное возвращаемое значение <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_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()
вернуть '<span class="amount">2,429107114kr</span>'
, но когда вы показываете это, вы видите <span class="amount">2,429kr</span>
из-за некоторого JavaScript, который вокруг этого.