HEX
Server: Apache/2.4.65 (Debian)
System: Linux 88f31f35b0b8 6.1.0-38-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.147-1 (2025-08-02) x86_64
User: www-data (33)
PHP: 8.2.29
Disabled: NONE
Upload Files
File: /var/www/html/wp-content/plugins/advanced-ads-tracking/includes/admin/class-metaboxes.php
<?php
/**
 * Admin Metaboxes.
 *
 * @package AdvancedAds\Tracking
 * @author  Advanced Ads <info@wpadvancedads.com>
 * @since   2.6.0
 */

namespace AdvancedAds\Tracking\Admin;

use AdvancedAds\Constants;
use AdvancedAds\Abstracts\Ad;
use AdvancedAds\Tracking\Helpers;
use AdvancedAds\Tracking\Database;
use AdvancedAds\Tracking\Public_Ad;
use AdvancedAds\Utilities\Sanitize;
use AdvancedAds\Tracking\Ad_Limiter;
use AdvancedAds\Framework\Interfaces\Integration_Interface;

defined( 'ABSPATH' ) || exit;

/**
 * Admin Metaboxes.
 */
class Metaboxes implements Integration_Interface {

	/**
	 * Hook into WordPress.
	 *
	 * @return void
	 */
	public function hooks(): void {
		add_action( 'add_meta_boxes_' . Constants::POST_TYPE_AD, [ $this, 'add_meta_box' ] );
		add_action( 'advanced-ads-ad-params-after', [ $this, 'add_ad_params' ] );
		add_action( 'advanced-ads-ad-pre-save', [ $this, 'save_ad_options' ], 10, 2 );
	}

	/**
	 * Add meta box for stats
	 *
	 * @since 1.2.6
	 *
	 * @return void
	 */
	public function add_meta_box(): void {
		add_meta_box(
			'tracking-ads-box',
			esc_attr__( 'Statistics', 'advanced-ads-tracking' ),
			[ $this, 'display' ],
			Constants::POST_TYPE_AD,
			'normal',
			'low'
		);

		add_filter( 'advanced-ads-unhide-meta-boxes', [ $this, 'unhide_metabox' ] );
	}

	/**
	 * Add tracking meta box to list of meta boxes to unhide.
	 *
	 * @param array $meta_boxes array of meta box ids to not be hidden.
	 *
	 * @return array
	 */
	public function unhide_metabox( $meta_boxes ): array {
		$meta_boxes[] = 'tracking-ads-box';

		return $meta_boxes;
	}

	/**
	 * Render options for tracking meta box
	 *
	 * @since 1.2.6
	 *
	 * @return void
	 */
	public function display(): void {
		global $post, $woocommerce;

		$ad = wp_advads_get_ad( $post->ID );
		$this->display_warnings( $ad );

		// Early bail!!
		if ( Helpers::is_tracking_method( 'ga' ) ) {
			return;
		}

		// limiter options.
		$impression_limit = absint( $ad->get_prop( 'tracking.impression_limit' ) ?? 0 );
		$click_limit      = absint( $ad->get_prop( 'tracking.click_limit' ) ?? 0 );
		$use_clicks       = Helpers::is_clickable_type( $ad->get_type() );
		$sums             = Database::get_sums_for_ad( $ad->get_id(), $use_clicks );
		$limiter          = new Ad_Limiter( $ad->get_id() );

		// public stats.
		$public      = new Public_Ad( $ad->get_id() );
		$public_id   = $public->get_id();
		$public_link = $public->get_url();
		$public_name = $public->get_name();

		$billing_email    = false;
		$report_recip     = $ad->get_prop( 'tracking.report-recip' ) ?? '';
		$report_period    = Helpers::sanitize_report_period( $ad->get_prop( 'tracking.report-period' ) );
		$report_frequency = Helpers::sanitize_report_frequency( $ad->get_prop( 'tracking.report-frequency' ) );

		// If ad was sold via WooCommerce.
		$order_id = get_post_meta( $ad->get_id(), 'advanced_ads_selling_order', true );
		if ( $order_id && function_exists( 'wc_get_order' ) ) {
			$order         = \wc_get_order( $order_id );
			$newer_wc      = isset( $woocommerce->version ) && version_compare( $woocommerce->version, '3.0', '>=' );
			$billing_email = $newer_wc ? $order->get_billing_email() : $order->billing_email;
		}

		require_once AA_TRACKING_ABSPATH . 'views/admin/metaboxes/metabox-ad.php';
	}

	/**
	 * Add tracking options to ad edit page
	 *
	 * @param Ad $ad Ad object.
	 *
	 * @return void
	 */
	public function add_ad_params( Ad $ad ): void {
		if ( empty( $ad->get_id() ) ) {
			return;
		}

		$enabled              = $ad->get_prop( 'tracking.enabled' ) ?? 'default';
		$target               = $ad->get_prop( 'tracking.target' ) ?? 'default';
		$nofollow             = $ad->get_prop( 'tracking.nofollow' ) ?? 'default';
		$sponsored            = $ad->get_prop( 'tracking.sponsored' ) ?? 'default';
		$cloaking_enabled     = boolval( $ad->get_prop( 'tracking.cloaking' ) ?? false );
		$link                 = Helpers::get_ad_link( $ad );
		$cloaking_cb_disabled = has_filter( 'advanced-ads-ad-get-tracking.cloaking', '__return_true' )
			|| has_filter( 'advanced-ads-ad-get-tracking.cloaking', '__return_false' )
			|| has_filter( 'advanced-ads-ad-option-tracking.cloaking', '__return_true' )
			|| has_filter( 'advanced-ads-ad-option-tracking.cloaking', '__return_false' );

		$tracking_choices = [
			'default'  => __( 'default', 'advanced-ads-tracking' ),
			'disabled' => __( 'disabled', 'advanced-ads-tracking' ),
		];

		if ( Helpers::is_clickable_type( $ad->get_type() ) ) {
			$tracking_choices['clicks']      = __( 'clicks only', 'advanced-ads-tracking' );
			$tracking_choices['impressions'] = __( 'impressions only', 'advanced-ads-tracking' );
			$tracking_choices['enabled']     = __( 'impressions & clicks', 'advanced-ads-tracking' );
		} else {
			$tracking_choices['enabled'] = __( 'enabled', 'advanced-ads-tracking' );
		}

		include_once AA_TRACKING_ABSPATH . 'views/admin/ads/ad-tracking-params.php';
	}

	/**
	 * Save ad tracking options.
	 *
	 * @param Ad    $ad        Ad instance.
	 * @param array $post_data Post data array.
	 *
	 * @return void
	 */
	public function save_ad_options( Ad $ad, $post_data ): void {
		$raw_data = $post_data['tracking'] ?? [];
		$options  = $ad->get_prop( 'tracking', 'edit' );

		if ( empty( $raw_data ) ) {
			return;
		}

		$options['enabled']          = $raw_data['enabled'] ?? 'default';
		$options['cloaking']         = $raw_data['cloaking'] ?? false;
		$options['impression_limit'] = absint( $raw_data['impression_limit'] ?? 0 );
		$options['click_limit']      = absint( $raw_data['click_limit'] ?? 0 );
		$options['public-id']        = stripslashes( $raw_data['public-id'] ?? '' );
		$options['public-name']      = stripslashes( $raw_data['public-name'] ?? '' );

		$target_values     = [ 'default', 'same', 'new' ];
		$options['target'] = isset( $raw_data['target'] ) && in_array( $raw_data['target'], $target_values, true )
			? $raw_data['target'] : 'default';

		foreach ( [ 'nofollow', 'sponsored' ] as $relationship ) {
			$options[ $relationship ] = isset( $raw_data[ $relationship ] ) && in_array( $raw_data[ $relationship ], [ 'default', '1', '0' ], true )
				? $raw_data[ $relationship ] : 'default';
		}

		// Email reports.
		$options['report-recip']     = Sanitize::email_addresses( $raw_data['report-recip'] ?? '' );
		$options['report-period']    = Helpers::sanitize_report_period( $raw_data['report-period'] ?? false );
		$options['report-frequency'] = Helpers::sanitize_report_frequency( $raw_data['report-frequency'] ?? false );

		$ad->set_prop( 'tracking', $options );
	}

	/**
	 * Display warnings for the ad.
	 *
	 * @param Ad $ad Ad object.
	 *
	 * @return void
	 */
	private function display_warnings( $ad ): void {
		$warnings = [];

		// add warning if we are tracking with Analytics.
		if ( Helpers::is_tracking_method( 'ga' ) ) {
			$warnings[] = [
				'text'  => __( '<a href="https://wpadvancedads.com/share-custom-reports-google-analytics/?utm_source=advanced-ads&utm_medium=link&utm_campaign=edit-ad-reports-google-analytics" target="_blank">How to share Google Analytics ad reports with your customers.</a>', 'advanced-ads-tracking' ),
				'class' => 'advads-notice-inline advads-idea',
			];
		} elseif ( $ad->is_type( 'adsense' ) ) {
			$warnings[] = [
				'text'  => sprintf(
					'%s <a href="%s" target="_blank">%s</a>',
					__( 'The number of impressions and clicks can vary from those in your AdSense account.', 'advanced-ads-tracking' ),
					'https://wpadvancedads.com/manual/tracking-issues?utm_source=advanced-ads&utm_medium=link&utm_campaign=ad-edit-adsense#Different_numbers_compared_to_AdSense_and_other_ad_networks',
					__( 'Manual', 'advanced-ads-tracking' )
				),
				'class' => 'advads-notice-inline advads-idea',
			];
		}

		if ( ! empty( $warnings ) ) {
			require_once AA_TRACKING_ABSPATH . 'views/admin/metaboxes/metabox-ad-warnings.php';
		}
	}
}