В моем магазине woocommerce разные способы доставки. Поэтому я хочу отправлять индивидуальные электронные письма «Заказ выполнен». Один из способов доставки: Bezorgen
Я пытаюсь заставить этот код работать, но пока не получается:
function llv_delivery_notes(){
$order_id = get_the_id();
global $wpdb;
$result = $wpdb->get_results ( "SELECT * FROM llv_woocommerce_order_items
WHERE order_id = $order_id;" );
?>
<pre>
<?php print_r($result);?>
</pre>
<?php
if (in_array("Bezorgen", $result)){
echo "This looks good";
} else {
echo "There is still something wrong here";
}
}
Что бы я ни попробовал, эта функция возвращает false. Как вы можете видеть ниже, значение Bezorgen действительно существует в массиве. Что здесь не так ....
Array
(
[0] => stdClass Object
(
[order_item_id] => 160
[order_item_name] => Test pakket met koteletten en rollade
[order_item_type] => line_item
[order_id] => 448
)
[1] => stdClass Object
(
[order_item_id] => 161
[order_item_name] => Lekker sappig koteletje geweldig op de barbeque (4 stuks)
[order_item_type] => line_item
[order_id] => 448
)
[2] => stdClass Object
(
[order_item_id] => 162
[order_item_name] => Rollade
[order_item_type] => line_item
[order_id] => 448
)
[3] => stdClass Object
(
[order_item_id] => 163
[order_item_name] => Bezorgen
[order_item_type] => shipping
[order_id] => 448
)
[4] => stdClass Object
(
[order_item_id] => 164
[order_item_name] => NL-BTW 6%-1
[order_item_type] => tax
[order_id] => 448
)
[5] => stdClass Object
(
[order_item_id] => 165
[order_item_name] => wc_points_redemption_2_2018_03_19_12_33
[order_item_type] => coupon
[order_id] => 448
)
)
Сам массив его не содержит. Он содержит объект, имеющий это как свойство. Вам нужно пройти через массив, чтобы проверить, имеет ли объект свойство order_item_name, установленное на Bezorgen.






in_array работает только с одномерным массивом, например:
$array = ["cars", "planes", "trains"]; // in_array("cars", $array) -- true
Чтобы проверить, существует ли значение в многомерном массиве, вы должны сделать это так:
foreach($result as $value)
{
if (in_array("bezorgen", $value))
{
echo "Bezorgen exists";
}
}
Или создайте свой собственная функция:
function in_array_recursive($needle, $haystack, $strict = false) {
foreach ($haystack as $item) {
if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
return true;
}
}
return false;
}
И используйте это так:
in_array_recursive("bezorgen", $result);
$result - это массив объектов, а не массив string.
foreach($result as $order_item) {
if ($order_item->order_item_name === "Bezorgen") {
echo "This looks good";
}
}
in_array () ищет массив ключ. Например:
$people = array("Peter", "Joe", "Glenn", "Cleveland");
а потом:
in_array("Peter", $peolple);
Значение, которое вы ищете, не является ключом (это свойство объекта внутри массива).
Думаю, вы можете попробовать что-то вроде этого:
$founded = false;
foreach($result as $value){
if ($value->order_item_name == 'Bezorgen') $founded = true;
}
if ($founded){
echo "This looks good";
} else {
echo "There is still something wrong here";
}
Ваш запрос возвращает массив объектов в качестве результата. Вам нужно выполнить цикл по каждому объекту, чтобы проверить, существует ли ваше значение.
Вы можете попробовать, как показано ниже:
$looksGood = false;
foreach($result as $key => $obj) {
if (isset($obj->order_item_name) && ($obj->order_item_name === "Bezorgen") {
$looksGood = true;
}
}
echo ($looksGood) ? "This looks good" : "There is still something wrong here";
Надеюсь, что смогу помочь :)
Вы можете использовать array_column() для извлечения данных только для столбца order_item_name ...
if (in_array("Bezorgen", array_column($result, 'order_item_name'))){
echo "This looks good";
} else {
echo "There is still something wrong here";
}
Это отлично работает! Спасибо! Его также легко расширить с помощью других моих способов доставки!
Это не массивы, это объекты. У вас есть массив объектов. Без клавиш (числовых).