'edd_after_checkout_cart', 'classname' => __CLASS__, 'inject_function' => 'injectInitiateCheckoutEvent', ) ); add_action( 'edd_payment_receipt_after', array( __CLASS__, 'trackPurchaseEvent' ), 10, 2 ); add_action( 'edd_after_download_content', array( __CLASS__, 'injectViewContentEvent' ), 40, 1 ); } /** * Injects a hidden field with a unique event ID into the AddToCart form. * * The event ID is used to identify the AddToCart event * for a given download. * * @return void */ public static function injectAddToCartEventId() { if ( FacebookPluginUtils::is_internal_user() ) { return; } $event_id = EventIdGenerator::guidv4(); printf( '', esc_attr( $event_id ) ); } /** * Triggers the AddToCart event for Easy Digital Downloads. * * The `edd-add-to-cart` nonce check is performed to ensure that the request * comes from a valid EDD form submission. The event * ID is verified to ensure that * it is a valid Event ID. * * @since 1.0.0 */ public static function injectAddToCartEventAjax() { if ( isset( $_POST['nonce'] ) && isset( $_POST['download_id'] ) && isset( $_POST['post_data'] ) ) { $download_id = absint( $_POST['download_id'] ); $nonce = sanitize_text_field( wp_unslash( $_POST['nonce'] ) ); if ( wp_verify_nonce( $nonce, 'edd-add-to-cart-' . $download_id ) === false ) { return; } parse_str( $_POST['post_data'], $post_data ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.MissingUnslash if ( isset( $post_data['facebook_event_id'] ) ) { $event_id = $post_data['facebook_event_id']; $server_event = ServerEventFactory::safe_create_event( 'AddToCart', array( __CLASS__, 'createAddToCartEvent' ), array( $download_id ), self::TRACKING_NAME ); $server_event->setEventId( $event_id ); FacebookServerSideEvent::get_instance()->track( $server_event ); } } parse_str( $_POST['post_data'], $post_data ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.MissingUnslash if ( isset( $post_data['facebook_event_id'] ) ) { $event_id = $post_data['facebook_event_id']; $server_event = ServerEventFactory::safe_create_event( 'AddToCart', array( __CLASS__, 'createAddToCartEvent' ), array( $download_id ), self::TRACKING_NAME ); $server_event->setEventId( $event_id ); FacebookServerSideEvent::get_instance()->track( $server_event ); } } /** * Injects a JavaScript listener for the AddToCart event * for Easy Digital Downloads. * * This method enqueues a JavaScript file that listens for * the `edd_add_to_cart` * event, and sends a server-side event to Facebook * for the AddToCart pixel event. * * @param int $download_id The ID of the download item. * * @since 1.0.0 */ public static function injectAddToCartListener( $download_id ) { if ( FacebookPluginUtils::is_internal_user() ) { return; } wp_register_script( 'facebook-pixel-add-to-cart', plugins_url( '../js/facebook_pixel_add_to_cart.js', __FILE__ ), array( 'jquery' ), '1.0.0', false ); wp_localize_script( 'facebook-pixel-add-to-cart', 'facebookPixelData', array( 'fbIntegrationKey' => FacebookPixel::FB_INTEGRATION_TRACKING_KEY, 'trackingName' => self::TRACKING_NAME, 'agentString' => FacebookWordpressOptions::get_agent_string(), 'pixelId' => FacebookWordpressOptions::get_pixel_id(), ) ); wp_enqueue_script( 'facebook-pixel-add-to-cart' ); } /** * Injects a Meta Pixel InitiateCheckout event. * * This method is a callback for the `edd_purchase_link_top` action hook. * It injects a Meta Pixel InitiateCheckout event into * the page whenever a purchase link is rendered. * * @since 1.0.0 */ public static function injectInitiateCheckoutEvent() { if ( FacebookPluginUtils::is_internal_user() || ! function_exists( 'EDD' ) ) { return; } $server_event = ServerEventFactory::safe_create_event( 'InitiateCheckout', array( __CLASS__, 'createInitiateCheckoutEvent' ), array(), self::TRACKING_NAME ); FacebookServerSideEvent::get_instance()->track( $server_event ); $code = PixelRenderer::render( array( $server_event ), self::TRACKING_NAME ); printf( ' %s ', $code // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ); } /** * Tracks a Meta Pixel Purchase event. * * This method is a callback for the `edd_complete_purchase` action hook. * It tracks a Meta Pixel Purchase event whenever a purchase is completed. * * @param object $payment The payment object. * @param array $edd_receipt_args The receipt arguments. * * @since 1.0.0 */ public static function trackPurchaseEvent( $payment, $edd_receipt_args ) { if ( FacebookPluginUtils::is_internal_user() || empty( $payment->ID ) ) { return; } $server_event = ServerEventFactory::safe_create_event( 'Purchase', array( __CLASS__, 'createPurchaseEvent' ), array( $payment ), self::TRACKING_NAME ); FacebookServerSideEvent::get_instance()->track( $server_event ); add_action( 'wp_footer', array( __CLASS__, 'injectPurchaseEvent' ), 20 ); } /** * Injects a Meta Pixel Purchase event. * * This method is a callback for the `wp_footer` action hook. * It injects a Meta Pixel Purchase event * into the page whenever a purchase is completed. * * @since 1.0.0 */ public static function injectPurchaseEvent() { $events = FacebookServerSideEvent::get_instance()->get_tracked_events(); $code = PixelRenderer::render( $events, self::TRACKING_NAME ); printf( ' %s ', $code // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ); } /** * Injects a Meta Pixel ViewContent event. * * This method is a callback for the * `edd_download_before_content` action hook. * It injects a Meta Pixel ViewContent event * into the page whenever a download * item is viewed. * * @param int $download_id The ID of the download item. * * @since 1.0.0 */ public static function injectViewContentEvent( $download_id ) { if ( FacebookPluginUtils::is_internal_user() || empty( $download_id ) ) { return; } $server_event = ServerEventFactory::safe_create_event( 'ViewContent', array( __CLASS__, 'createViewContentEvent' ), array( $download_id ), self::TRACKING_NAME ); FacebookServerSideEvent::get_instance()->track( $server_event ); $code = PixelRenderer::render( array( $server_event ), self::TRACKING_NAME ); printf( ' %s ', $code // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ); } /** * Creates a Meta Pixel InitiateCheckout event data. * * The InitiateCheckout event is fired when a customer initiates a checkout. * It is typically sent when a customer clicks a "checkout" button * or submits an order. * * @return array The event data. * * @since 1.0.0 */ public static function createInitiateCheckoutEvent() { $event_data = FacebookPluginUtils::get_logged_in_user_info(); $event_data['currency'] = EDDUtils::get_currency(); $event_data['value'] = EDDUtils::get_cart_total(); return $event_data; } /** * Creates a Meta Pixel Purchase event data. * * The Purchase event is fired when a customer completes a purchase. * It is typically sent when a customer submits an order. * * @param \EDD_Payment $payment The payment object. * * @return array The event data. * * @since 1.0.0 */ public static function createPurchaseEvent( $payment ) { $event_data = array(); $payment_meta = \edd_get_payment_meta( $payment->ID ); if ( empty( $payment_meta ) ) { return $event_data; } $event_data['email'] = $payment_meta['email']; $event_data['first_name'] = $payment_meta['user_info']['first_name']; $event_data['last_name'] = $payment_meta['user_info']['last_name']; $content_ids = array(); $value = 0; foreach ( $payment_meta['cart_details'] as $item ) { $content_ids[] = $item['id']; $value += $item['price']; } $event_data['currency'] = $payment_meta['currency']; $event_data['value'] = $value; $event_data['content_ids'] = $content_ids; $event_data['content_type'] = 'product'; return $event_data; } /** * Creates a Meta Pixel ViewContent event data. * * The ViewContent event is fired when a customer views a product. * It is typically sent when a customer views a product page. * * @param int $download_id The download ID. * * @return array The event data. * * @since 1.0.0 */ public static function createViewContentEvent( $download_id ) { $event_data = FacebookPluginUtils::get_logged_in_user_info(); $currency = EDDUtils::get_currency(); $download = edd_get_download( $download_id ); $title = $download ? $download->post_title : ''; if ( get_post_meta( $download_id, '_variable_pricing', true ) ) { $prices = get_post_meta( $download_id, 'edd_variable_prices', true ); $price = array_shift( $prices ); $value = $price['amount']; } else { $value = get_post_meta( $download_id, 'edd_price', true ); } if ( ! $value ) { $value = 0; } $event_data['content_ids'] = array( (string) $download_id ); $event_data['content_type'] = 'product'; $event_data['currency'] = $currency; $event_data['value'] = floatval( $value ); $event_data['content_name'] = $title; return $event_data; } /** * Creates a Meta Pixel AddToCart event data. * * The AddToCart event is fired when a customer adds a product to their * cart. It is typically sent when a customer adds a product to their * cart. * * @param int $download_id The download ID. * * @return array The event data. * * @since 1.0.0 */ public static function createAddToCartEvent( $download_id ) { $event_data = FacebookPluginUtils::get_logged_in_user_info(); $currency = EDDUtils::get_currency(); $download = edd_get_download( $download_id ); $title = $download ? $download->post_title : ''; if ( get_post_meta( $download_id, '_variable_pricing', true ) ) { $prices = get_post_meta( $download_id, 'edd_variable_prices', true ); $price = array_shift( $prices ); $value = $price['amount']; } else { $value = get_post_meta( $download_id, 'edd_price', true ); } if ( ! $value ) { $value = 0; } $event_data['content_ids'] = array( (string) $download_id ); $event_data['content_type'] = 'product'; $event_data['currency'] = $currency; $event_data['value'] = $value; $event_data['content_name'] = $title; return $event_data; } }