336 lines
7.4 KiB
PHP
336 lines
7.4 KiB
PHP
<?php
|
|
/**
|
|
* Model for Call To Action
|
|
*
|
|
* @author Code Atlantic
|
|
* @package PopupMaker
|
|
* @copyright (c) 2024, Code Atlantic LLC.
|
|
*/
|
|
|
|
namespace PopupMaker\Models;
|
|
|
|
use WP_Post;
|
|
use PopupMaker\Base\Model\Post;
|
|
|
|
defined( 'ABSPATH' ) || exit;
|
|
|
|
/**
|
|
* Class CallToAction
|
|
*
|
|
* @since 1.21.0
|
|
*/
|
|
class CallToAction extends Post {
|
|
|
|
/**
|
|
* Current model version.
|
|
*
|
|
* @var int
|
|
*/
|
|
const MODEL_VERSION = 1;
|
|
|
|
/**
|
|
* Call To Action UUID.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $uuid;
|
|
|
|
/**
|
|
* Call To Action description.
|
|
*
|
|
* @var string|null
|
|
*/
|
|
protected $description;
|
|
|
|
/**
|
|
* Call To Action Settings.
|
|
*
|
|
* @var array<string,mixed>
|
|
*/
|
|
protected $settings;
|
|
|
|
/**
|
|
* Build a call to action.
|
|
*
|
|
* @param \WP_Post|array<string,mixed> $cta Call To Action data.
|
|
*/
|
|
public function __construct( $cta ) {
|
|
parent::__construct( $cta );
|
|
|
|
$custom_properties = [
|
|
'uuid' => null,
|
|
'description' => null,
|
|
'settings' => [],
|
|
];
|
|
|
|
foreach ( $custom_properties as $key => $value ) {
|
|
$this->$key = $value;
|
|
}
|
|
|
|
/**
|
|
* Call To Action settings.
|
|
*
|
|
* @var array<string,mixed>|false $settings
|
|
*/
|
|
$settings = get_post_meta( $this->ID, 'cta_settings', true );
|
|
|
|
if ( empty( $settings ) ) {
|
|
$settings = \PopupMaker\get_default_call_to_action_settings();
|
|
}
|
|
|
|
$this->settings = $settings;
|
|
|
|
$this->data_version = get_post_meta( $cta->ID, 'data_version', true );
|
|
|
|
if ( ! $this->data_version ) {
|
|
$this->data_version = self::MODEL_VERSION;
|
|
update_post_meta( $cta->ID, 'data_version', self::MODEL_VERSION );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get the call to action UUID.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function get_uuid() {
|
|
if ( isset( $this->uuid ) ) {
|
|
return $this->uuid;
|
|
}
|
|
|
|
// Get or generate UUID
|
|
$uuid = get_post_meta( $this->ID, 'cta_uuid', true );
|
|
|
|
if ( empty( $uuid ) ) {
|
|
$uuid = \PopupMaker\generate_unique_cta_uuid( $this->ID );
|
|
update_post_meta( $this->ID, 'cta_uuid', $uuid );
|
|
}
|
|
|
|
/**
|
|
* Filter the call to action UUID.
|
|
*
|
|
* @param string $uuid Call to action UUID.
|
|
* @param int $call_to_action_id Call to action ID.
|
|
*
|
|
* @return string
|
|
*/
|
|
$this->uuid = apply_filters( 'popup_maker/get_call_to_action_uuid', $uuid, $this->ID );
|
|
|
|
return $this->uuid;
|
|
}
|
|
|
|
/**
|
|
* Get the action type class for this call to action.
|
|
*
|
|
* @return \PopupMaker\Base\CallToAction|false
|
|
*/
|
|
public function get_action_type_handler() {
|
|
$cta_type = $this->get_setting( 'type', 'link' );
|
|
$cta_type_handler = \PopupMaker\plugin( 'cta_types' )->get( $cta_type );
|
|
|
|
if ( ! $cta_type_handler instanceof \PopupMaker\Base\CallToAction ) {
|
|
return false;
|
|
}
|
|
|
|
return $cta_type_handler;
|
|
}
|
|
|
|
/**
|
|
* Get the call to action settings array.
|
|
*
|
|
* @return array<string,mixed>
|
|
*/
|
|
public function get_settings() {
|
|
return $this->settings;
|
|
}
|
|
|
|
/**
|
|
* Get public call to action settings array.
|
|
*
|
|
* @return array<string,mixed>
|
|
*/
|
|
public function get_public_settings() {
|
|
return [];
|
|
}
|
|
|
|
/**
|
|
* Get a call to action setting.
|
|
*
|
|
* Settings are stored in JS based camelCase. But WP prefers snake_case.
|
|
*
|
|
* This method supports camelCase based dot.notation, as well as snake_case.
|
|
*
|
|
* @param string $key Setting key.
|
|
* @param mixed $default_value Default value.
|
|
*
|
|
* @return mixed|false
|
|
*/
|
|
public function get_setting( $key, $default_value = false ) {
|
|
if ( isset( $this->settings[ $key ] ) ) {
|
|
$value = $this->settings[ $key ];
|
|
} else {
|
|
// Support camelCase, snake_case, and dot.notation.
|
|
// Check for camelKeys & dot.notation.
|
|
$value = \PopupMaker\fetch_key_from_array( $key, $this->settings, 'camelCase' );
|
|
|
|
if ( null === $value ) {
|
|
if ( null === $value ) {
|
|
$value = $default_value;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Filter the option.
|
|
*
|
|
* @param mixed $value Option value.
|
|
* @param string $key Option key.
|
|
* @param mixed $default_value Default value.
|
|
* @param int $call to action_id Restriction ID.
|
|
*
|
|
* @return mixed
|
|
*/
|
|
return apply_filters( 'popup_maker/get_call_to_action_setting', $value, $key, $default_value, $this->ID );
|
|
}
|
|
|
|
/**
|
|
* Get the description for this call to action.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function get_description() {
|
|
if ( ! isset( $this->description ) ) {
|
|
$this->description = get_the_excerpt( $this->ID );
|
|
|
|
if ( empty( $this->description ) ) {
|
|
$this->description = __( 'This content is restricted.', 'popup-maker' );
|
|
}
|
|
}
|
|
|
|
return $this->description;
|
|
}
|
|
|
|
/**
|
|
* Generate a call to action URL.
|
|
*
|
|
* @param string $base_url Base URL.
|
|
* @param array<string,mixed> $extra_args Extra arguments.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function generate_url( $base_url = '', $extra_args = [] ) {
|
|
$args = wp_parse_args( $extra_args, [
|
|
'cta' => $this->get_uuid(),
|
|
] );
|
|
|
|
return \add_query_arg( $args, $base_url );
|
|
}
|
|
|
|
/**
|
|
* Convert this call to action to an array.
|
|
*
|
|
* @return array<string,mixed>
|
|
*/
|
|
public function to_array() {
|
|
$settings = $this->get_settings();
|
|
|
|
return array_merge( [
|
|
'id' => $this->ID,
|
|
'slug' => $this->slug,
|
|
'title' => $this->title,
|
|
'description' => $this->get_description(),
|
|
'status' => $this->status,
|
|
], $settings );
|
|
}
|
|
|
|
/**
|
|
* Get a CTA's event count.
|
|
*
|
|
* @param string $event Event name.
|
|
* @param string $which Which stats to get.
|
|
*
|
|
* @return int
|
|
*/
|
|
public function get_event_count( $event = 'conversion', $which = 'current' ) {
|
|
switch ( $which ) {
|
|
case 'current':
|
|
$current = $this->get_meta( "cta_{$event}_count" );
|
|
|
|
// Save future queries by inserting a valid count.
|
|
if ( false === $current || ! is_numeric( $current ) ) {
|
|
$current = 0;
|
|
$this->update_meta( "cta_{$event}_count", $current );
|
|
}
|
|
|
|
return absint( $current );
|
|
case 'total':
|
|
$total = $this->get_meta( "cta_{$event}_count_total" );
|
|
|
|
// Save future queries by inserting a valid count.
|
|
if ( false === $total || ! is_numeric( $total ) ) {
|
|
$total = 0;
|
|
$this->update_meta( "cta_{$event}_count_total", $total );
|
|
}
|
|
|
|
return absint( $total );
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Track a conversion for this CTA based on CTA event args.
|
|
*
|
|
* @param array<string,mixed> $extra_args Extra arguments.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function track_conversion( $extra_args = [] ) {
|
|
$extra_args = wp_parse_args( $extra_args, [
|
|
'notrack' => false,
|
|
] );
|
|
|
|
if ( $extra_args['notrack'] ) {
|
|
/**
|
|
* Fires when a CTA triggers core to track a conversion for a popup.
|
|
*
|
|
* @param \PopupMaker\Models\CallToAction $cta The CTA object.
|
|
* @param array<string,mixed> $extra_args {
|
|
* @type bool $notrack Whether to not track the conversion.
|
|
* }
|
|
*/
|
|
do_action( 'popup_maker/cta_conversion_notrack', $this, $extra_args );
|
|
return;
|
|
}
|
|
|
|
$this->increase_event_count( 'conversion' );
|
|
|
|
/**
|
|
* Fires when a CTA triggers core to track a conversion for a popup.
|
|
*
|
|
* @param \PopupMaker\Models\CallToAction $cta The CTA object.
|
|
* @param array<string,mixed> $extra_args {
|
|
* @type bool $notrack Whether to not track the conversion.
|
|
* }
|
|
*/
|
|
do_action( 'popup_maker/cta_conversion', $this, $extra_args );
|
|
}
|
|
|
|
/**
|
|
* Increase a CTA's event count.
|
|
*
|
|
* @param string $event Event name.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function increase_event_count( $event = 'conversion' ) {
|
|
$current = $this->get_event_count( $event, 'current' );
|
|
$total = $this->get_event_count( $event, 'total' );
|
|
|
|
$this->update_meta( "cta_{$event}_count", $current + 1 );
|
|
$this->update_meta( "cta_{$event}_count_total", $total + 1 );
|
|
|
|
return true;
|
|
}
|
|
}
|