Я езжу по кругу с этой проблемой уже несколько дней, и она начинает меня немного бесить. Я знаю, что у меня есть все части, но я просто не могу собрать их вместе.
У меня есть шаблон печати для заказов Woocommerce, в котором перечислены продукты обычным способом, порядок, в котором они хранятся в массиве, который, в свою очередь, является порядком, в котором они были помещены в корзину и т. Д. Однако мы хотим, чтобы они были сгруппированы по категориям (срокам) . Таким образом, это будет означать, что сначала будут перечислены все элементы под term_id 17, затем все term_id 18 и т. Д.
В идеале это был бы автоматический процесс, при котором код считывает все используемые Условия, затем проходит их по одному и выводит все продукты для этого Срока, которые находятся в корзине. Но я еще не приблизился к этому этапу.
До сих пор у меня был частичный успех с этим кодом:
foreach ($order->get_items() as $item) {
$product_id = $item['product_id'];
$meta = $item['item_meta'];
$meta = array_filter($meta, function ($key) {
return !in_array($key, Order::getHiddenKeys());
}, ARRAY_FILTER_USE_KEY);
$terms = get_the_terms ( $product_id, 'product_cat' );
foreach ( $terms as $term ) {
$cat_id = $term->term_id;
if($cat_id === 18) {
var_dump($item['name']);
}
}
Это приведет к успешному сбросу элементов заказа, отнесенных к категории term_id 18. Однако, если я изменю оператор IF следующим образом:
if($cat_id === 18) {
var_dump($item['name']);
} elseif($cat_id === 17) {
var_dump($item['name']);
}
Я ожидал, что он выведет элементы term_id 18, а затем элементы term_id 17 ПОСЛЕ. К сожалению, он просто показывает массив в порядке по умолчанию: 17, затем 18, несмотря на то, что код построен таким образом.
Я подумал, что, возможно, он выводится таким образом, потому что он не изменяет исходный массив, а просто маскирует его части в разных точках. Итак, я экспериментировал с функцией array_filter, но не могу понять логику правильно. Мне довольно неловко публиковать эту попытку, потому что я знаю, что это ужасно, но это все, что мне удалось поэкспериментировать с array_filter:
function test ($var) {
foreach ( $terms as $term ) {
$cat_id = $term->term_id;
if($cat_id === 18) {
print_r($item['name']);
}
}
return $var;
}
foreach ($order->get_items() as $item) {
$product_id = $item['product_id'];
$meta = $item['item_meta'];
$meta = array_filter($meta, function ($key) {
return !in_array($key, Order::getHiddenKeys());
}, ARRAY_FILTER_USE_KEY);
$terms = get_the_terms ( $product_id, 'product_cat' );
print_r(array_filter($terms, "test"));
Я знаю, что это в значительной степени неправильно, но я просто не могу понять это. Я нормально отношусь к базовому использованию PHP и Wordpress PHP, но Woocommerce намного сложнее! Буду очень признателен за любую помощь с этим, пожалуйста.
Напомню, что я хочу, чтобы продукты были напечатаны / отображены эхом / и т. Д. В порядке категорий (автоматически, если кто-то чувствует себя очень щедрым, лол). Я действительно не возражаю, как это достигается, если это, очевидно, безопасно и надежно.
Приносим извинения за длинный пост и огромное спасибо заранее.