$query = $modx->newQuery('msProduct');
$query->limit(10000);
$query->where(array(
    'parent' => 4, // тут ID категории
));
$docs = $modx->getCollection('msProduct',$query);
foreach($docs as $doc){
    $oldPrice = $doc->get('price');
    $doc->set('price', $oldPrice  + $oldPrice*0.08);
    $doc->save();
}Видел на SO предложение использовать file_put_contents и file_get_contents, но не понимаю как написать решение для неизвестного количества?
$merged = '';
$audioArray = json_decode($_POST['data']); //тут укажите свой ключ
foreach ($audioArray as $audio) {
  $merged= $merged.file_get_contents($audio);
}
return file_put_contents('merged.mp3', $merged); 
  
  Может ли материнка убить аккумулятор?
SELECT concat(
    JSON_UNQUOTE(json_extract(additional,'$.surname')),
    JSON_UNQUOTE(json_extract(additional,'$.firsname')),
    JSON_UNQUOTE(json_extract(additional,'$.lastname'))
) fullname
FROM `user_attributes`
; 
  
  $data = [
    "orderNumber" => "".$orderNum."",         
    "orderLines" => [],
];
    
foreach ($products as $item) {
    $data['orderLines'][] = [
        "articleNumber" => $item['article'],
        "name" => $item['name'],
        "sellingPrice" => $item['price'],
        "estimatedPrice" => $item['price'],
        "quantity" => $item['count'],
        "vat" => [
            "rate" => 0,
            "sum" => 0
        ],
        "attributes" => [
            "isDangerous" => false
        ],
        "resideInPackages" => [
            "1" 
        ],
        "supplierTin" => null,
        "cis" => [
            "0"
        ],
    ];
}Object.keys(jsonKey).each(key => {
  const value = jsonKey[key];
  $(`.${key}`).html(value);
}) 
  
  $.each($.parseJSON(response), (k, v) => $(`.${k}`).text(v));for (const [ k, v ] of Object.entries(JSON.parse(response))) {
  document.querySelector(`.${k}`).innerText = v;
}<?php
// Указываем тип документа и кодировку:
header('Content-Type: text/html; charset=utf-8');
// Включаем отображение ошибок:
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
// Адрес для парсинга:
$url = 'https://w8shipping.com/tracking/?vin=3GNAXJEV5JS538785&searchAuto=Search';
// Создаём новый сеанс:
$curl = curl_init();
// Указываем адрес целевой страницы:
curl_setopt($curl, CURLOPT_URL, $url);
// О отключаем проверку SSL сертификата:
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
// Устанавливаем заголовки для имитации браузера:
$headers = [
	'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
	'Accept-Encoding: gzip, deflate, br',
	'Accept-Language: ru-RU,ru;q=0.9',
	'Connection: keep-alive',
	'DNT: 1',
	'Host: ' . parse_url($url)['host'],
	'sec-ch-ua: "Chromium";v="94", ";Not A Brand";v="99"',
	'sec-ch-ua-mobile: ?0',
	'sec-ch-ua-platform: "Windows"',
	'Sec-Fetch-Dest: document',
	'Sec-Fetch-Mode: navigate',
	'Sec-Fetch-Site: none',
	'Sec-Fetch-User: ?1',
	'Upgrade-Insecure-Requests: 1',
	'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.114 Safari/537.36'
];
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
// Разрешаем переадресацию:
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
// Запрещаем прямой вывод результата запроса:
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
// Делаем сам запрос:
$result = curl_exec($curl);
// Завершаем сеанс:
curl_close($curl);
// Смотрим результат:
echo $result;SELECT `o`.`num`, `o`.`createdon`, `o`.`cost`, `o`.`status`, `p`.`products`
  FROM `modx_ms2_orders` AS `o`
  LEFT JOIN (
    SELECT `order_id`,
           JSON_ARRAYAGG(
             JSON_OBJECT('name', `name`, 'price', `price`, 'count', `count`)
           ) AS `products`
      FROM `modx_ms2_order_products` 
      GROUP BY `order_id`
  ) AS `p` ON `p`.`order_id` = `o`.`id`
  WHERE `o`.`user_id` = 106