Рассказываю, как вывести в одной таблице полную информацию о заказе: Откуда пришел пользователь, С какого устройства он пришел, суума заказа, ф.и.о. пользователя, и.т.д.
Для людей у которых есть интернет-магазин очень важно получать статистику по всем посетителям сайта и конкретно по тем, что делают заказы в этом интернет-магазине. Для решения этой проблемы есть яндекс-метрика и в частности там можно настроить e-commerce (электронную коммерцию), в документации у яндекса подробно рассказано о том, как это сделать. Если говорить простым языком, то e-commerce позволяет собирать данные по тем пользователям, что делают какие-то заказы на вашем сайте.
После того как вы настроите e-commerce, вы можете столкнуться с тем, что в метрике вы получаете не совсем полную статистику, к примеру у вас есть данные о заказе, но вы не видете данные об этом посителе (имя, телефон, почта, и.т.д.), который сделал заказ. Вы их не видите, т.к. просто не передаете яндекс-метрике. И вот для решения подобных проблем, существует api яндекс-метрики, благодоря, которой вы можете получить полную информацию о заказе.
Для взаимодействия с таким api, я написал следующий код:
<? //Метрика function getCodeYa($clientId){ Header("Location: https://oauth.yandex.ru/authorize?response_type=code&client_id=".$clientId); die(); } function getTokenYa($url,$peremen,$headers) { $post_arr=array(); foreach ($peremen as $key=>$value) { $post_arr[]=$key."=".$value; } $data=implode('&',$post_arr); $ch=curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $code=curl_getinfo($ch, CURLINFO_HTTP_CODE); $response = array(); $response['html'] = curl_exec($ch); $response['err'] = curl_errno($ch); $response['errmsg'] = curl_error($ch); $response['header'] = curl_getinfo($ch); return ["code"=>$code,"response"=>$response]; } function getInfoYa($url,$peremen,$token){ foreach ($peremen as $key=>$value) { $post_arr[]=$key."=".$value; } $data=implode('&',$post_arr); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url . '?' . $data); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Host:api-metrika.yandex.net','Authorization: OAuth '.$token,'Content-Type:application/x-yametrika+json')); curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $code=curl_getinfo($ch, CURLINFO_HTTP_CODE); $response = array(); $response['html'] = curl_exec($ch); $response['err'] = curl_errno($ch); $response['errmsg'] = curl_error($ch); $response['header'] = curl_getinfo($ch); curl_close($ch); return ["code"=>$code,"response"=>$response]; } $clientId = "ваш id клиента"; if($_GET["code"]){ $header = "Content-type: application/x-www-form-urlencoded"; $ParamForEnter['grant_type'] = 'authorization_code'; $ParamForEnter['code'] = $_GET["code"]; $ParamForEnter['client_id'] = "ваш id клиента"; $ParamForEnter['client_secret'] = "ваш секретный ключ"; $yaInfo = getTokenYa("https://oauth.yandex.ru/token",$ParamForEnter,$header); $yaInfo = json_decode($yaInfo["response"]["html"],true); $ParamForInfo["ids"] = "ваш ids"; $ParamForInfo["preset"] = "sources_summary"; $ParamForInfo["group"] = "day"; $ParamForInfo["dimensions"] = "ym:s:purchaseID,ym:s:trafficSource,ym:s:searchEngine,ym:s:SocialNetwork,ym:s:deviceCategory,ym:s: AdvEngine,ym:s: DirectBannerGroup,ym:s: SearchPhrase,ym:s: DirectClickBanner"; $ParamForInfo["metrics"] = "ym:s:users,ym:s:visits,ym:s:pageviews"; $ParamForInfo["attribution"] = "lastsign"; $ParamForInfo["limit"] = "10000"; $ParamForInfo["offset"] = "1"; $ParamForInfo["pretty"] = "true"; $ParamForInfo["date1"] = "2019-01-01"; $ParamForInfo["date2"] = "2019-05-07"; //YYYY-MM-DD $token = $yaInfo["access_token"]; $url = "https://api-metrika.yandex.net/stat/v1/data"; $yaInfo = getInfoYa($url,$ParamForInfo,$token); $yaInfo = json_decode($yaInfo["response"]["html"],true); }else{ getCodeYa($clientId); } foreach($yaInfo["data"] as $arItem){ $dimensions = $arItem["dimensions"]; // $dimensions[0]["name"] - номер заказа // $dimensions[1]["name"] - Источник // $dimensions[2]["name"] - Поисковая система // $dimensions[3]["name"] - Соц. сети // $dimensions[4]["name"] - Устройство // $dimensions[5]["name"] - Рекламная система // $dimensions[6]["name"] - Группа объявлений в директе // $dimensions[7]["name"] - Поисковая фраза $InfoMetrika[$dimensions[0]["name"]]["source"] = $dimensions[1]["name"]; $InfoMetrika[$dimensions[0]["name"]]["search_system"] = $dimensions[2]["name"]; $InfoMetrika[$dimensions[0]["name"]]["social"] = $dimensions[3]["name"]; $InfoMetrika[$dimensions[0]["name"]]["device"] = $dimensions[4]["name"]; $InfoMetrika[$dimensions[0]["name"]]["adv"] = $dimensions[5]["name"]; $InfoMetrika[$dimensions[0]["name"]]["group_direct"] = $dimensions[6]["name"]; $InfoMetrika[$dimensions[0]["name"]]["search_phrase"] = $dimensions[7]["name"]; $InfoMetrika[$dimensions[0]["name"]]["header_direct"] = $dimensions[8]["name"]; } //Массив с норм названиями $arName["search"]["Search engine traffic"] = "Поисковые системы"; $arName["search"]["Social network traffic"] = "Соц. сети"; ?> <table> <tr> <td>Дата заказа</td> <td>Номер заказа</td> <td>Отказ</td> <td>Комментарий</td> <td>Сумма заказа</td> <td>Источник</td> <td>Тип источника</td> <td>Поисковая фраза</td> <td>Устройство пользователя</td> <td>Рекламная система</td> <td>Группа объявлений директ</td> <td>Заголовок объявления в директе</td> </tr> <? $db_sales = CSaleOrder::GetList(array("DATE_INSERT" => "ASC"), $arFilter); while ($ar_sales = $db_sales->Fetch()) { ?> <tr <?if($ar_sales["CANCELED"] == "Y"){echo "style='background:red;'";}?>> <td><?=$ar_sales["DATE_INSERT"]?></td> <td><?=$ar_sales["ID"]?></td> <?if($ar_sales["CANCELED"] == "Y"){?> <td>Да</td> <?}else{?> <td></td> <?}?> <td><?=$ar_sales["COMMENTS"]?></td> <td><?=$ar_sales["PRICE"];?></td> <? if($arName["search"][$InfoMetrika[$ar_sales["ID"]]["source"]]){ echo "<td>".$arName["search"][$InfoMetrika[$ar_sales["ID"]]["source"]]."</td>"; }else{ echo "<td>".$InfoMetrika[$ar_sales["ID"]]["source"]."</td>"; } if($InfoMetrika[$ar_sales["ID"]]["search_system"]){ echo "<td>".$InfoMetrika[$ar_sales["ID"]]["search_system"]."</td>"; }else{ echo "<td>".$InfoMetrika[$ar_sales["ID"]]["social"]."</td>"; } echo "<td>".$InfoMetrika[$ar_sales["ID"]]["device"]."</td>"; echo "<td>".$InfoMetrika[$ar_sales["ID"]]["search_phrase"]."</td>"; echo "<td>".$InfoMetrika[$ar_sales["ID"]]["adv"]."</td>"; echo "<td>".$InfoMetrika[$ar_sales["ID"]]["group_direct"]."</td>"; echo "<td>".$InfoMetrika[$ar_sales["ID"]]["header_direct"]."</td>"; ?> </tr> <? } ?> </table>
Прежде всего вам необходимо зарегистрироваться в яндекс OAuth-авторизация, вы должны будете получить данные необходимые для работы с яндекс api и там же можете ознакомиться с документацией.
Теперь непосредственно код, который я написал, функция getCodeYa() получит специальный код от яндекса, тут важно упомянуть, что если вы делаете по моему примеру, то при настройки OAuth-авторизации вам надо указать ссылку на страницу с этим кодом.
Функция getTokenYa() получит специальный токен, для этого вам надо будет указать ваши данные от OAuth-авторизации.
И наконец функция getInfoYa() получит информацию о вашей метрике. Обратите внимание на парамметры, которые мы передаем при запросе к яндексу, я затрону лишь тот парамметр, в котором мы передаем информацию о группировках и метриках, по остальным парамметрам вы можете найти информацию в документации у яндекса.
dimensions - указываем по каким парамметрам и группировкам нам формировать отчет. К примеру ym:s:
После того, как я получил ответ от яндекса по моему запросу, я записываю этот ответ в массив $InfoMetrika. После чего я вывожу информацию о всех о заказах из бд сайта, плюс добавляю информацию, которую я получил от яндекса.
У меня за вывод информации с сайта отвечают строчки $db_sales = CSaleOrder::GetList(array("DATE_INSERT" => "ASC"), $arFilter); и цикл while ($ar_sales = $db_sales->Fetch()), потому что данный пример я делал на битриксе, если у вас не битрикс, то вам надо просто написать запрос к бд с заказами и в цикле вывести информацию по ним, добавив инфу из массива $InfoMetrika
Данный код, точно не является универсальным и скорее всего вам надо будет изменить его под ваши цели. В любом случае, я надеюсь, что данная статья натолкнет вас на правильную мысль в решении вашей задачи.