403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/php_interface/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/php_interface/init.php
<?php
include_once($_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php');

include_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/php_interface/wbs24.lib/autoload.php");

include_once('lib/EmailFields.php');

// ВСЕ НОВЫЕ ОБРАБОТЧИКИ ДЛЯ БИБЛИОТЕК В wbs24.lib РАЗМЕЩАЕМ В ЭТОТ ФАИЛ
include_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/php_interface/wbs24.lib/events/listeners.php");

use Bitrix\Main\Loader;
use Bitrix\Highloadblock as HL;
use Bitrix\Main\Entity;

// обработчик с старого сайта
AddEventHandler("sale", "OnOrderNewSendEmail", "OnOrderNewSendEmailHandler");
function OnOrderNewSendEmailHandler($orderID, &$eventName, &$arFields)
{
	//toLogFile($orderID, 'orderID');
    
    $arFields['DISCOUNT'] = 0;
	$arCoupons = [];

	$arOrder = \Bitrix\Sale\Order::getList(['filter' => ["ID" => $orderID/*, "LID" => SITE_ID*/], 'select' => ["*"]])->Fetch();
	$orderPropsRes = CSaleOrderPropsValue::GetList([], ["ORDER_ID" => $orderID, 'LID' => $arOrder['LID']]);

	while ($arOrderPropsValues = $orderPropsRes->Fetch())
		$arOrder['PROPERTIES'][$arOrderPropsValues['CODE']] = $arOrderPropsValues;

	// Платежная система, тип доставки и скидка
	$arFields['PAY_TYPE'] = CSalePaySystem::GetByID($arOrder['PAY_SYSTEM_ID'])['NAME'];
    //$arFields['DELIVERY_TYPE'] = \Bitrix\Sale\Delivery\Services\Manager::getById($arOrder['DELIVERY_ID'])['NAME']; // прежний вариант
    $deliveryObj = Bitrix\Sale\Delivery\Services\Manager::getObjectById($arOrder['DELIVERY_ID']);
    $arFields['DELIVERY_TYPE'] = $deliveryObj->isProfile() ? $deliveryObj->getNameWithParent() : $deliveryObj->getName(); // название службы доставки и профиля, например: Л-Пост (до ПВЗ)
    //$arFields['DELIVERY_TYPE'] = $deliveryObj->getName(); // если нужно только имя профиля без названия родительской службы доставки, например "до ПВЗ"

	// Собираю скидки из таблицы описания применившихся скидок к конкретному товару
	$discountRulesDBres = \Bitrix\Sale\Internals\OrderRulesDescrTable::getList([
		'select' => ["*"],
		'filter' => ['=ORDER_ID' => $orderID]
	]);

	while ($discountRulesData = $discountRulesDBres->Fetch()) {
		foreach ($discountRulesData['DESCR'] as $arDiscountRuleData)
			$arFields['DISCOUNT'] += $arDiscountRuleData["RESULT_VALUE"];
	}

	// Купон
	$couponList = \Bitrix\Sale\Internals\OrderCouponsTable::getList(array(
		'select' => array('COUPON'),
		'filter' => array('=ORDER_ID' => $orderID)
	));	

	while ($couponData = $couponList->fetch())
	$arCoupons[] = $couponData['COUPON'];

	$arFields['COUPON'] = (count($arCoupons) > 0 ? implode(', ', $arCoupons) : '');

	$arFields['PHONE'] = $arOrder['PROPERTIES']['PHONE']['VALUE'] ? $arOrder['PROPERTIES']['PHONE']['VALUE'] : '';

	// Адрес
	$location = '';
	$address = $arOrder['PROPERTIES']['ADDRESS']['VALUE'] ? $arOrder['PROPERTIES']['ADDRESS']['VALUE'] : '';
	if ($arOrder['PROPERTIES']['LOCATION']['VALUE']) {
		$arLoc = CSaleLocation::GetByID($arOrder['PROPERTIES']['LOCATION']['VALUE']);
		$location = $arLoc['COUNTRY_NAME'].', '.$arLoc['REGION_NAME'].', '.$arLoc['CITY_NAME'].', ';
	}
	$fullAddr = $location.$address;
	//$arFields['ADDRESS'] = $fullAddr ? $fullAddr : '';
	$arFields['USER_DESCRIPTION'] = $arOrder["USER_DESCRIPTION"] ? $arOrder["USER_DESCRIPTION"] : '';

	// Свойства заказа // wbs24 r.r@
	if (!empty($arOrder['PROPERTIES'])) {
		foreach ($arOrder['PROPERTIES'] as $propCode => $propData) {
			$arFields['PROPERTIES_'.$propCode] = $propData['VALUE'];
		}
	}

	// Вариант доставки
	$variants = [
		'REGULAR_DELIVERY',
		'FAST_DELIVERY',
		'DELIVERY_ON_TIME_DELIVERY'
	];
	$currentDeliveryVariant = '';
	foreach ($variants as $variant) {
		if ($arFields['PROPERTIES_'.$variant] == 'Да') {
			$currentDeliveryVariant = $variant;
		}
	}
	
	// время доставки
	$deliveryTime = '';
	if (
		$currentDeliveryVariant == 'REGULAR_DELIVERY' 
		|| $currentDeliveryVariant == '' 
		&& $arFields['PROPERTIES_TIME_INTERVAL']
	) {
		$timeIntervalProp = CSaleOrderPropsVariant::GetByValue($arOrder['PROPERTIES']['TIME_INTERVAL']['ORDER_PROPS_ID'], $arFields['PROPERTIES_TIME_INTERVAL']);
		$deliveryTime = $timeIntervalProp['NAME'];
	} else if ($currentDeliveryVariant == 'DELIVERY_ON_TIME_DELIVERY') {
		$deliveryTime = $arFields['PROPERTIES_EXACT_DELIVERY_TIME'];
	}
	
	$arFields['DELIVERY_VARIANT_TIME'] = '';
	if ($deliveryTime) {
		$arFields['DELIVERY_VARIANT_TIME'] = $deliveryTime;
	}

	$arFields['DELIVERY_VARIANT_NAME'] = '';
	if ($currentDeliveryVariant) {
		$arFields['DELIVERY_VARIANT_NAME'] = $arOrder['PROPERTIES'][$currentDeliveryVariant]['NAME'];
	}

	if ($arFields['PROPERTIES_DELIVERY_DATE']) {
		$arFields['PROPERTIES_DELIVERY_DATE'] = $arFields['PROPERTIES_DELIVERY_DATE'];
	}

	if ($arFields['PROPERTIES_LOCALITY']) {
		$addresStr = $arFields['PROPERTIES_LOCALITY'];
		if ($arFields['PROPERTIES_HOME_NUMBER']) {
			$addresStr .= ' квартира ' . $arFields['PROPERTIES_HOME_NUMBER'];
		}
		$arFields['ADDRESS'] = $addresStr;
	}

	// Корзина // wbs24 r.r@
	if (class_exists('\\Wbs24\\EmailFields')) {
		$emailFields = new Wbs24\EmailFields();
		$arFields['ORDER_TABLE_ITEMS'] = $emailFields->getHtmlOrderList($orderID);
	}
    
    //toLogFile(print_r($arFields, 1), 'arFields3');
}

function toLogFile($content, $name = false, $filename = false, $mode="a"){

    if(!$filename)
        $filename = $_SERVER['DOCUMENT_ROOT'].'/logfile.txt';
    $file = fopen($filename, $mode);

    if($name)
        fwrite($file, "\n".date('d.m.Y H:i:s').' '.$name."\n");
    
    fwrite($file, $content);
    fclose($file);
}

// Скрипт по начислению бонусов
AddEventHandler("sale", "OnSaleStatusOrder", "OrderComplete");
function OrderComplete($orderID, &$arFields)
{
    Loader::includeModule("sale");
    Loader::includeModule("highloadblock");

	
    if ($arFields == 'F') { 
        $order = \Bitrix\Sale\Order::load($orderID);
		$siteId = $order->getSiteId();

		if ($siteId == 's2') {
			$platformId = getPlatform($order);
			if (!$platformId) {
				$orderUser = $order->getUserId();
				$orderSumm = $order->getPrice();
				$orderDeliveryPrice = $order->getDeliveryPrice();

				$wholesaleBuyerId = 9; // Id группы оптовиков
				$arrUser = \CUser::GetUserGroup($orderUser);

				if (!in_array($wholesaleBuyerId, $arrUser)) {
					$orderPayments = \Bitrix\Sale\PaymentCollection::getList([
						'select' => ['SUM'],
						'filter' => [
							'=ORDER_ID' => $orderID,
							'=PAY_SYSTEM_ID' => 7,
							'=PAID' => 'Y']
					]);
					while ($orderPayment = $orderPayments->fetch()) {
						$orderPayid = $orderPayment['SUM'];
					}
					if (empty($orderPayid)) {
						$orderPriceBonus = $orderSumm - $orderDeliveryPrice;
					} else {
						$orderPriceBonus = $orderSumm - $orderDeliveryPrice - $orderPayid;
					}
		
					$hlblockDatas = HL\HighloadBlockTable::getById(8)->fetch();
					$entityHlBonus = HL\HighloadBlockTable::compileEntity($hlblockDatas);
					$entityDataClassBonus = $entityHlBonus->getDataClass();
					$bonusData = $entityDataClassBonus::getList(array(
						'select' => array('UF_BONUS_FROM', 'UF_BONUS_TO', 'UF_BONUS_PRICE'),
					));
					while ($arBonusData = $bonusData->Fetch()) {
						$priceFrom = intval($arBonusData['UF_BONUS_FROM']);
						$priceTo = intval($arBonusData['UF_BONUS_TO']);
						if (($orderPriceBonus > $priceFrom) && ($orderPriceBonus < $priceTo)) {
							$priceBonus = intval($arBonusData['UF_BONUS_PRICE']);
							$summToAddBonus = $orderPriceBonus * $priceBonus / 100;
		
							if ($orderUser) {
								CSaleUserAccount::UpdateAccount(
									$orderUser,
									$summToAddBonus,
									"RUB",
									false,
									$orderID,
									false
								);
							}
						}
					}
				}
			}
		}
    }
}

function getPlatform($order) {
	$tradeBindingCollection = $order->getTradeBindingCollection();

	foreach ($tradeBindingCollection as $item) {
		$platformId = $item->getField('TRADING_PLATFORM_ID');
	}

	return $platformId ? $platformId : false ;
}

// wbs24 - wholesale
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'sale',
    'OnBeforeBasketAdd',
    [
        '\\Wbs24\\Lib\\Stocks\\Handlers',
        'OnBeforeBasketAddHandler',
    ]
);

/* // wbs24 - wholesale
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'main',
    'OnBeforeResizeImage',
    [
        '\\Wbs24\\Lib\\Watermark\\WatermarkHandlers',
        'OnBeforeResizeImageHandler',
    ]
);
 */

// wbs24 - subscribe
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'catalog',
    '\Bitrix\Catalog\Subscribe::onAdd',
    [
        '\\Wbs24\\Lib\\Subscribe\\Handlers',
        'onAddHandler',
    ]
);

// wbs24 - seopagen
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'main',
    'OnEpilog',
    [
        '\\Wbs24\\Lib\\Seopagen\\Handlers',
        'OnEpilogHandler',
    ]
);

// wbs24 - stopSPAM

\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    "form",
    "onBeforeResultAdd",
    function ($id, &$arFields, &$arFieldsMail)
    {

		global $APPLICATION;

		$checkList = [
		'info@hifinance.ru'
		];

		if(in_array($arFieldsMail['form_email_14'], $checkList)) {
			$APPLICATION->ThrowException('');
		}
    }
);

// wbs24 - letterlink
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'main',
    'OnBeforeEventAdd',
    [
        '\\Wbs24\\Lib\\LetterLink\\Handlers',
        'OnBeforeEventAddHandler',
    ]
);

/* \Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'sale',
    'OnSaleComponentOrderJsData',
    [
        '\\Wbs24\\Lib\\Order\\ProccessOrder',
        'OnSaleComponentOrderJsDataHandler',
    ]
);
 */

 // wbs24 - PropertyConverter
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'iblock',
    'OnAfterIBlockElementUpdate',
    [
        '\\Wbs24\\Lib\\UserProperties\\PropertyConverter',
        'convertCaliberToDiameter',
    ]
);

\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'iblock',
    'OnAfterIBlockElementAdd',
    [
        '\\Wbs24\\Lib\\UserProperties\\PropertyConverter',
        'convertCaliberToDiameter',
    ]
);

\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'main',
    'OnPageStart',
    'OnPageStartHandler'
);

function OnPageStartHandler()
{
	if ($_SERVER['REQUEST_URI'] === '/?') {
		header("Location: https://ilovecveti.ru", true, 301);
	}
}

\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'main',
    'OnEpilog',
    'OnBeforeIBlockElementUpdateHandler'
);

function OnBeforeIBlockElementUpdateHandler()
{
	global $USER;
    if (!$USER->IsAdmin()) {
        return; 
    }
	
	if (defined("ADMIN_SECTION") && strpos($_SERVER['REQUEST_URI'], 'esol') === false && strpos($_SERVER['REQUEST_URI'], 'form_edit') === false) {
		$script = '
			<script>
				if (!window.myFunctionExecuted) {
					let firstRowTdContent = document.querySelector("#tr_PROPERTY_1922 td.adm-detail-content-cell-r");
					let secondRowTdValignTop = document.querySelector("#tr_PROPERTY_1922 td.adm-detail-valign-top");
					let tableToMove = document.querySelector("#tr_PROPERTY_301 td.adm-detail-content-cell-r table");
					let rowToMove = document.querySelectorAll("#tr_PROPERTY_301 td.adm-detail-content-cell-r");
				
					if (firstRowTdContent && secondRowTdValignTop && tableToMove && rowToMove.length > 0) {
						let newRow = document.createElement("tr");
						newRow.appendChild(tableToMove.cloneNode(true));
						newRow.appendChild(secondRowTdValignTop.cloneNode(true));
				
						// Переносим содержимое внутри firstRowTdContent в новосозданную строку
						while (firstRowTdContent.childNodes.length > 0) {
							newRow.appendChild(firstRowTdContent.childNodes[0]);
						}
				
						rowToMove[0].after(newRow);
				
						document.querySelector("#tr_PROPERTY_301 td.adm-detail-content-cell-r").appendChild(newRow);
						newRow.querySelector("td.adm-detail-valign-top.adm-detail-content-cell-l").setAttribute("width", "30%");
						newRow.querySelector("td.adm-detail-valign-top.adm-detail-content-cell-l").style.paddingTop = "5px";
						
				
						// Скрываем первую строку внутри ячейки #tr_PROPERTY_301
						let firstRowInCell = document.querySelector("#tr_PROPERTY_301 td.adm-detail-content-cell-r table:nth-child(1)");
						if (firstRowInCell) {
							firstRowInCell.style.display = "none";
						}

						startFirstRow = document.querySelector("#tr_PROPERTY_1922");
						if (startFirstRow) startFirstRow.style.display = "none";
				
						window.myFunctionExecuted = true;
					} else {
						console.error("One or more elements not found.");
					}

					firstRowTdContent = document.querySelector("#tr_PROPERTY_1924 td.adm-detail-content-cell-r");
					secondRowTdValignTop = document.querySelector("#tr_PROPERTY_1924 td.adm-detail-valign-top");
					tableToMove = document.querySelector("#tr_PROPERTY_1890 td.adm-detail-content-cell-r table");
					rowToMove = document.querySelectorAll("#tr_PROPERTY_1890 td.adm-detail-content-cell-r");

					if (firstRowTdContent && secondRowTdValignTop && tableToMove && rowToMove.length > 0) {
						let newRow = document.createElement("tr");
						newRow.appendChild(tableToMove.cloneNode(true));
						newRow.appendChild(secondRowTdValignTop.cloneNode(true));
				
						// Переносим содержимое внутри firstRowTdContent в новосозданную строку
						while (firstRowTdContent.childNodes.length > 0) {
							newRow.appendChild(firstRowTdContent.childNodes[0]);
						}
				
						rowToMove[0].after(newRow);
				
						document.querySelector("#tr_PROPERTY_1890 td.adm-detail-content-cell-r").appendChild(newRow);
						newRow.querySelector("td.adm-detail-valign-top.adm-detail-content-cell-l").setAttribute("width", "30%");
						newRow.querySelector("td.adm-detail-valign-top.adm-detail-content-cell-l").style.paddingTop = "5px";
						
				
						// Скрываем первую строку внутри ячейки #tr_PROPERTY_1890
						let firstRowInCell = document.querySelector("#tr_PROPERTY_1890 td.adm-detail-content-cell-r table:nth-child(1)");
						if (firstRowInCell) {
							firstRowInCell.style.display = "none";
						}

						startFirstRow = document.querySelector("#tr_PROPERTY_1924");
						if (startFirstRow) startFirstRow.style.display = "none";

						window.myFunctionExecuted = true;
					} else {
						console.error("One or more elements not found.");
					}
				}	
			</script>
		';
		
		echo $script;
	}
}

AddEventHandler('main', 'OnBeforeEventAdd', Array("RegionInfo", "addRegionInfo"));
class RegionInfo
{
	public static function addRegionInfo($event, $lid, &$arFields)
	{
	   if (
		$event == "NEW_ONE_CLICK_BUY"
		|| $event == "SALE_NEW_ORDER"
		) {
			\Bitrix\Main\Loader::includeModule('aspro.next');
			$region = new \CNextRegionality();
			$regionInfo = $region->getCurrentRegion();
	
			$sitePhone = $regionInfo['PHONES'][0];
			$replacements = array("+", "(", ")", "-", " ");
			$sitePhoneFormated = str_replace($replacements, "", $sitePhone);
			$arFields['SITE_PHONE'] = $sitePhone; 
			$arFields['SITE_PHONE_FORMATED'] = $sitePhoneFormated; 
			$arFields['SITE_EMAIL'] = $regionInfo['PROPERTY_EMAIL_VALUE'][0];
	   }

	   	if ($event == "NEW_ONE_CLICK_BUY") {
			// Подключаем модули интернет-магазина и инфоблоков
			if (!CModule::IncludeModule("sale") || !CModule::IncludeModule("iblock")) {
				die("Не удалось подключить модули");
			}

			$orderId = $arFields['RS_ORDER_ID'];

			$order = CSaleOrder::GetByID($orderId);
			if (!$order) {
				return "Заказ не найден";
			}
		
			// Получаем элементы заказа (товары)
			$basketItems = CSaleBasket::GetList(
				array(),
				array("ORDER_ID" => $orderId),
				false,
				false,
				array("PRODUCT_ID")
			);
		
			$productImages = array();
			if ($item = $basketItems->Fetch()) {
				$productId = $item['PRODUCT_ID'];
				
				// Получаем данные товара
				$product = CIBlockElement::GetByID($productId)->GetNext();
				if ($product && $product['PREVIEW_PICTURE']) {
					$image = CFile::GetPath($product['PREVIEW_PICTURE']);
					$productImages = array(
						"PRODUCT_ID" => $productId,
						"PREVIEW_PICTURE" => $image
					);
				}
			}

			$arFields['PREVIEW_PICTURE'] = $productImages['PREVIEW_PICTURE'];
   		}
	}
}

AddEventHandler("main", "OnEndBufferContent", "ModifyGoogleFontsLinkTags");

function ModifyGoogleFontsLinkTags(&$content)
{
	$request = \Bitrix\Main\Context::getCurrent()->getRequest();

	if(!$request->isAdminSection())
	{
		// Регулярное выражение для поиска <link> тегов с href, содержащими 'fonts.googleapis.com'
		$pattern = '/<link\b[^>]*?\bhref=["\']([^"\']*fonts\.googleapis\.com[^"\']*)["\'][^>]*>/i';

		// Callback-функция для добавления атрибутов media и onload
		$callback = function ($matches) {
			$linkTag = $matches[0];

			// Проверяем, содержит ли тег уже атрибут media или onload
			$hasMedia = strpos($linkTag, 'media=') !== false;
			$hasOnload = strpos($linkTag, 'onload=') !== false;

			// Добавляем атрибуты media и onload, если их нет
			if (!$hasMedia) {
				$linkTag = preg_replace('/>$/', ' media="print">', $linkTag);
			}

			if (!$hasOnload) {
				$linkTag = preg_replace('/>$/', ' onload="this.media=\'all\'">', $linkTag);
			}

			// Обновляем закрытие тега на />
			$linkTag = preg_replace('/>$/', ' />', $linkTag);

			return $linkTag;
		};

		// Заменяем в контенте страницы теги <link> с добавлением атрибутов media и onload
		$content = preg_replace_callback($pattern, $callback, $content);
	}
}

AddEventHandler("main", "OnEndBufferContent", "ModifyLinkTags_template_css");

function ModifyLinkTags_template_css(&$content)
{
    $request = \Bitrix\Main\Context::getCurrent()->getRequest();

    if(!$request->isAdminSection())
    {
        $request = \Bitrix\Main\Context::getCurrent()->getRequest();
        if(!$request->isAdminSection())
        {
            $arPatternsToReplace = Array(
				'/<link\b([^>]*)\bhref=([\'"])(\/bitrix\/cache\/css\/s2\/aspro_next_rospiro\/template_[^\'"\s]*)\2([^>]*)>/i',
            );
            $content = preg_replace(
                $arPatternsToReplace, 
                '<link rel="preload" href="$3" as="style"><link rel="stylesheet" href="$3">', 
                $content
            );
        }
    }

}

//AddEventHandler("main", "OnEndBufferContent", "addContentToHead");

function addContentToHead(&$content)
{
    // Ищем div с классом wbs24-to-head
    $pattern = '/<div class="wbs24-to-head">(.*?)<\/div>/is';
    
    if (preg_match($pattern, $content, $matches)) {
        // Получаем содержимое div
        $divContent = $matches[1];
        
        // Ищем начало тега <head> и вставляем сразу после него содержимое div
        $content = preg_replace('/<head>/i', '<head>' . $divContent, $content);
        
        // Удаляем div с классом wbs24-to-head из DOM
        $content = preg_replace($pattern, '', $content);
    }
}

AddEventHandler("main", "OnEndBufferContent", "MoveCssLinksToEnd");

function MoveCssLinksToEnd(&$content)
{
    $request = \Bitrix\Main\Context::getCurrent()->getRequest();

    if (!$request->isAdminSection())
    {
        // Список путей, которые мы ищем в атрибутах href
        $paths = [
			"/bitrix/js/ui/fonts/opensans/ui.font.opensans.min.css",
            "/bitrix/cache/css/s2/aspro_next_rospiro/page_",
            "/bitrix/cache/css/s2/aspro_next_rospiro/default_",
            "/bitrix/js/ui/design-tokens/dist/ui.design-tokens.min.css",
            "/bitrix/js/main/popup/dist/main.popup.bundle.min.css",
            "/bitrix/js/main/phonenumber/css/phonenumber.min.css",
            "/bitrix/css/skyweb24.popuppro/animation.min.css",
            "/bitrix/js/main/core/css/core_popup.min.css",
            "/bitrix/css/main/font-awesome.min.css",
            "/bitrix/panel/main/popup.min.css",
        ];

        // Регулярное выражение для поиска <link> тегов с href, содержащими нужные пути
        $pattern = '/<link\s+[^>]*href=["\']([^"\']+)["\'][^>]*>/i';
        preg_match_all($pattern, $content, $matches);

        $linksToMove = [];

        foreach ($matches[1] as $key => $href) {
            // Проверяем, содержит ли href один из наших путей
            foreach ($paths as $path) {
                if (strpos($href, $path) !== false) {
                    // Добавляем атрибут async к найденному тегу <link>
                    $linkWithAsync = str_replace('<link', '<link async', $matches[0][$key]);

                    // Сохраняем измененный тег <link> с async
                    $linksToMove[] = $linkWithAsync;

                    // Удаляем исходный тег из контента
                    $content = str_replace($matches[0][$key], '', $content);
                    break;
                }
            }
        }

        // Если найдены теги для перемещения, добавляем их перед закрытием </body>
        if (!empty($linksToMove)) {
            $content = str_replace('</body>', implode("\n", $linksToMove) . "\n</body>", $content);
        }
    }
}

Youez - 2016 - github.com/yon3zu
LinuXploit