Как собрать и сохранить UTM-метки в интернет-магазине на WooCommerce

Недавно потребовалось решить задачку – как собрать и сохранить UTM-метки в WooCommerce – популярном плагине магазина для WordPress, при переходе на страницу товара или сразу в корзину для их дальнейшей передачи в облачную CRM, но лишь после того, как проходит оплата товара. Передачу в CRM здесь рассматривать не будем, это отдельная история, ограничимся лишь сохранением UTM-меток к заказе.

Как известно, страницу товара от страницы просмотра созданного заказа отделяют еще несколько страниц как минимум: это страницы корзины и оформления заказа. На время их прохождения метки нужно где-то сохранять. Для этих целей отлично подошел встроенный в WooCommerce механизм работы с сессиями, который, к слову сказать, сохраняет информацию в JSON-формате в базе данные, где ее легко при желании можно посмотреть. В итоге родилась следующая функция для сбора UTM-меток и сохранения их в сессии WooCommerce, вместе с данными корзины и заказа:

function my_wc_collect_utm_codes() {
    $utms = [];
    // Определяем массив возможных меток
    $utm_keys = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term'];
    // Собираем переданные метки в массив, если они есть
    foreach($utm_keys as $key) {
        if ( isset($_GET[$key]) && !empty($_GET[$key]) ) {
            $utms[$key] = strip_tags( (string) wp_unslash($_GET[$key]) );
        }
    }
    // Обнаружили utm-метки в url? Сохраняем в сессию
    if (sizeof($utms) > 0) {
        WC()->session->set('utm_params', $utms);
    }
}

Эту функцию и весь последующий код можно добавить в файл functions.php активной темы или сделать на их основе собственный плагин – кому как удобнее.

На следующем шаге нам нужно вызвать эту функцию при открытии страницы с описанием товара/продукта, если мы хотим собирать метки именно там. В качестве триггера этого события хорошо подошел один из хуков WooCommerce, вызываемый при открытии страницы с описанием продукта/товара:

// Cобираем UTM-метки при открытии страницы товара
add_action( 'woocommerce_before_single_product', 'my_wc_collect_utm_codes', 10 );

Остается самое интересное – после прохождения всех стадий формирования заказа извлечь UTM-метки из сессии и добавить их в виде метаданных в наш заказ. С этой задачей справилась другая функция, подключенная к хуку woocommerce_checkout_order_processed:

/**
 * Сохраняем utm-метки в метаданных заказа в момент его обработки, после извлечения их из сессии, в которую уже не будет доступа 
 * при изменении статуса заказа извне.
 */
add_action('woocommerce_checkout_order_processed', 'utm_codes_checkout_order_processed', 10, 3);
function utm_codes_checkout_order_processed( $order_id, $posted_data, $order ) {
    $order = wc_get_order( $order_id );

    if ( isset(WC()->session) ) {
        $utm_session = WC()->session->get('utm_params');
        $order->add_meta_data('utm_codes', json_encode($utm_session));
        $order->save_meta_data();
    }
}

UTM-метки сохраняются в заказе в одном из т.н. «произвольных» полей в JSON-формате и выглядят приблизительно так:

JSON-формат хорошо читаем, понятен, а также удобен для последующей программной обработки, если таковая потребуется.

Еще следует добавить, что для безопасности использования функций WooCommerce и объекта WC(), следует соответствующий код обернуть в проверку активности плагина магазина на сайте:

 // Включен ли плагин WooCommerce?
if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
	// Здесь используются функции и объекты WooCommerce...
        // ...
}

Также для удобства и большей безопасности использования данного кода в других местах сайта, я создал свой экшн, вызывающий функцию сбора и сохранения меток:

// My action to collect umt-codes
add_action('woocommerce_collect_utm_codes', 'my_wc_collect_utm_codes');

Вот собственно и все.

Понравилась статья? Поделитесь ссылкой в соцсетях: