Files
krolewskie-miody.pl/wp-content/plugins/official-facebook-pixel/integration/class-facebookwordpresscalderaform.php
2026-04-28 15:13:50 +02:00

226 lines
6.7 KiB
PHP

<?php
/**
* Facebook Pixel Plugin FacebookWordpressCalderaForm class.
*
* This file contains the main logic for FacebookWordpressCalderaForm.
*
* @package FacebookPixelPlugin
*/
/**
* Define FacebookWordpressCalderaForm class.
*
* @return void
*/
/*
* Copyright (C) 2017-present, Meta, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
namespace FacebookPixelPlugin\Integration;
defined( 'ABSPATH' ) || die( 'Direct access not allowed' );
use FacebookPixelPlugin\Core\FacebookPluginUtils;
use FacebookPixelPlugin\Core\FacebookServerSideEvent;
use FacebookPixelPlugin\Core\FacebookWordPressOptions;
use FacebookPixelPlugin\Core\ServerEventFactory;
use FacebookPixelPlugin\Core\PixelRenderer;
use FacebookPixelPlugin\FacebookAds\Object\ServerSide\Event;
use FacebookPixelPlugin\FacebookAds\Object\ServerSide\UserData;
/**
* FacebookWordpressCalderaForm class.
*/
class FacebookWordpressCalderaForm extends FacebookWordpressIntegrationBase {
const PLUGIN_FILE = 'caldera-forms/caldera-core.php';
const TRACKING_NAME = 'caldera-forms';
/**
* Hook into Caldera Forms to inject the Pixel code.
*
* Hooks into the `caldera_forms_ajax_return`
* action and calls the `injectLeadEvent` method.
*
* @since 0.9.0
*/
public static function inject_pixel_code() {
add_action(
'caldera_forms_ajax_return',
array( __CLASS__, 'injectLeadEvent' ),
10,
2
);
}
/**
* Injects the Pixel code into the Caldera Forms response.
*
* Hooks into the `caldera_forms_ajax_return` action and checks if the form
* is submitted successfully and if the user is not an internal user.
* If conditions are met, it creates a `Lead` event and tracks it using
* the `FacebookServerSideEvent` class.
* Then it renders the Pixel code using the `PixelRenderer` class and
* appends the code to the form response.
*
* @param array $out The Caldera Forms response.
* @param array $form The form data.
*
* @return array The modified Caldera Forms response.
*/
public static function injectLeadEvent( $out, $form ) {
if (
FacebookPluginUtils::is_internal_user() ||
'complete' !== $out['status']
) {
return $out;
}
$server_event = ServerEventFactory::safe_create_event(
'Lead',
array( __CLASS__, 'readFormData' ),
array( $form ),
self::TRACKING_NAME,
true
);
FacebookServerSideEvent::get_instance()->track( $server_event );
$code = PixelRenderer::render(
array( $server_event ),
self::TRACKING_NAME
);
$code = sprintf(
'
<!-- Meta Pixel Event Code -->
%s
<!-- End Meta Pixel Event Code -->
',
$code
);
$out['html'] .= $code;
return $out;
}
/**
* Reads the form data from the Caldera Forms submission.
*
* @param array $form The form data.
*
* @return array The form data in the format
* expected by the `FacebookServerSideEvent` class.
*/
public static function readFormData( $form ) {
if ( empty( $form ) ) {
return array();
}
return array(
'email' => self::getEmail( $form ),
'first_name' => self::getFirstName( $form ),
'last_name' => self::getLastName( $form ),
'phone' => self::getPhone( $form ),
'state' => self::getState( $form ),
);
}
/**
* Get the email address from the form data.
*
* @param array $form The form data.
*
* @return string The email address.
*/
private static function getEmail( $form ) {
return self::getFieldValue( $form, 'type', 'email' );
}
/**
* Get the first name from the form data.
*
* @param array $form The form data.
*
* @return string The first name.
*/
private static function getFirstName( $form ) {
return self::getFieldValue( $form, 'slug', 'first_name' );
}
/**
* Get the last name from the form data.
*
* @param array $form The form data.
*
* @return string The last name.
*/
private static function getLastName( $form ) {
return self::getFieldValue( $form, 'slug', 'last_name' );
}
/**
* Get the state from the form data.
*
* @param array $form The form data.
*
* @return string|null The state, or null if not found.
*/
private static function getState( $form ) {
return self::getFieldValue( $form, 'type', 'states' );
}
/**
* Get the phone number from the form data.
*
* Attempts to extract the phone number using the 'phone_better' type first.
* If not found, falls back to using the 'phone' type.
*
* @param array $form The form data.
*
* @return string|null The phone number, or null if not found.
*/
private static function getPhone( $form ) {
$phone = self::getFieldValue( $form, 'type', 'phone_better' );
return empty( $phone ) ?
self::getFieldValue( $form, 'type', 'phone' ) : $phone;
}
/**
* Retrieves the value of a field from the form data.
*
* Searches through the form's fields to find a field with the specified
* attribute and attribute value. If a match is found, returns the value
* from the $_POST array using the field's ID.
*
* @param array $form The form data containing fields.
* @param string $attr The attribute to match against in the field.
* @param string $attr_value The value of the attribute to look for.
*
* @return mixed|null The value of the field from $_POST, or null
* if not found.
*/
private static function getFieldValue( $form, $attr, $attr_value ) {
if ( empty( $form['fields'] ) ) {
return null;
}
foreach ( $form['fields'] as $field ) {
if ( isset( $field[ $attr ] ) && $field[ $attr ] === $attr_value ) {
return sanitize_text_field(
wp_unslash(
$_POST[ $field['ID'] ] ?? '' // phpcs:ignore WordPress.Security.NonceVerification.Missing
)
);
}
}
return null;
}
}