HEX
Server: Apache/2.4.68 (Debian)
System: Linux as-cs-widget-demo-us-central1 6.1.0-44-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.164-1 (2026-03-09) x86_64
User: root (0)
PHP: 8.2.32
Disabled: NONE
Upload Files
File: /var/www/kevin-demo/wp-content/plugins/adthrive-ads/components/no-ai/class-main.php
<?php
/**
 * No AI Main Class
 *
 * @package AdThrive Ads
 */

namespace AdThrive_Ads\Components\No_AI;

/**
 * Main class
 */
class Main {
	/**
	 * Add hooks
	 */
	public function setup() {
		add_filter( 'adthrive_ads_options', array( $this, 'add_options' ) );
		add_action( 'wp_head', array( $this, 'append_ai_metadata' ) );
		add_filter( 'robots_txt', array( $this, 'update_robot_file' ), 10, 1 );
	}

	/**
	 * Add fields to the options metabox
	 *
	 * @param CMB $cmb A CMB metabox instance
	 */
	public function add_options( $cmb ) {
		require_once ABSPATH . 'wp-admin/includes/file.php';

		$cmb->add_field(
			array(
				'name' => __( 'NoAI Meta Tags', 'adthrive_ads' ),
				'desc' => __(
					'Enable “noai” and “noimageai” meta tags to tell AI systems not to use your content without your consent to train their models.<br/>
				<a href="https://help.raptive.com/hc/en-us/articles/13764527993755" target="_blank" rel="noopener noreferrer">Read more</a> about this setting and language to add to your Terms of Service.',
					'adthrive_ads'
				),
				'id' => 'no_ai',
				'type' => 'checkbox',
			)
		);

		if ( \WP_Filesystem() ) {
			global $wp_filesystem;

			$filename = $wp_filesystem->abspath() . 'robots.txt';

			if ( $wp_filesystem->is_file( $filename ) ) {
				$cmb->add_field(
					array(
						'name' => 'Block AI crawlers',
						'desc' => 'We\'ve detected you have a physical robots.txt file, so we can\'t add entries automatically. To block common AI crawlers from your site, <a href="https://help.raptive.com/hc/en-us/articles/25756415800987-How-to-manually-block-common-AI-crawlers" target="_blank" rel="noopener noreferrer">follow these instructions</a> to add entries to your robots.txt file.',
						'type' => 'title',
						'id'   => 'need_del_robots_file',
						'before_row'    => '<hr>',
					)
				);
			} else {
				$this->append_ai_crawler_checkboxes( $cmb );
			}
		} else {
			// we can't do a file system check, so just show the buttons that appended to a virtual file
			$this->append_ai_crawler_checkboxes( $cmb );
		}

		return $cmb;
	}

	/**
	 * Adds AI crawler checkboxes to the page
	 */
	public function append_ai_crawler_checkboxes( $cmb ) {
		$cmb->add_field(
			array(
				'name' => 'Block AI crawlers',
				'desc' => 'Entries are added to your robots.txt file beginning June 3, 2024.',
				'type' => 'title',
				'id'   => 'block_ai_crawlers_title',
				'before_row'    => '<hr>',
			)
		);

		$cmb->add_field(
			array(
				'name' => 'anthropic-ai',
				'desc' => 'Disallow the anthropic-ai user agent in your robots.txt file. Recommended.',
				'id' => 'block_anthropic_ai',
				'type' => 'radio_inline',
				'options' => array(
					'on' => 'On',
					'off' => 'Off',
				),
				'default' => 'on',
			)
		);

		$cmb->add_field(
			array(
				'name' => 'CCbot',
				'desc' => 'Disallow the CCbot user agent in your robots.txt file. Recommended.',
				'id' => 'block_ccbot',
				'type' => 'radio_inline',
				'options' => array(
					'on' => 'On',
					'off' => 'Off',
				),
				'default' => 'on',
			)
		);

		$cmb->add_field(
			array(
				'name' => 'ChatGPT-User',
				'desc' => 'Disallow the ChatGPT-User user agent in your robots.txt file. Recommended.',
				'id' => 'block_chatgpt_user',
				'type' => 'radio_inline',
				'options' => array(
					'on' => 'On',
					'off' => 'Off',
				),
				'default' => 'on',
			)
		);

		$cmb->add_field(
			array(
				'name' => 'Claude-Web',
				'desc' => 'Disallow the Claude-Web user agent in your robots.txt file. Recommended.',
				'id' => 'block_claude_web',
				'type' => 'radio_inline',
				'options' => array(
					'on' => 'On',
					'off' => 'Off',
				),
				'default' => 'on',
			)
		);

		$cmb->add_field(
			array(
				'name' => 'FacebookBot',
				'desc' => 'Disallow the FacebookBot user agent in your robots.txt file. Recommended.',
				'id' => 'block_facebook_bot',
				'type' => 'radio_inline',
				'options' => array(
					'on' => 'On',
					'off' => 'Off',
				),
				'default' => 'on',
			)
		);

		$cmb->add_field(
			array(
				'name' => 'Google-Extended',
				'desc' => 'Disallow the Google-Extended user agent in your robots.txt file. Recommended.',
				'id' => 'block_google_extended',
				'type' => 'radio_inline',
				'options' => array(
					'on' => 'On',
					'off' => 'Off',
				),
				'default' => 'off',
			)
		);

		$cmb->add_field(
			array(
				'name' => 'GPTBot',
				'desc' => 'Disallow the GPTBot user agent in your robots.txt file. Recommended.',
				'id' => 'block_gptbot',
				'type' => 'radio_inline',
				'options' => array(
					'on' => 'On',
					'off' => 'Off',
				),
				'default' => 'on',
			)
		);

		$cmb->add_field(
			array(
				'name' => 'PiplBot',
				'desc' => 'Disallow the PiplBot user agent in your robots.txt file. Recommended.',
				'id' => 'block_pipl_bot',
				'type' => 'radio_inline',
				'options' => array(
					'on' => 'On',
					'off' => 'Off',
				),
				'default' => 'on',
				'after_row'    => '<hr>',
			)
		);

		return $cmb;
	}

	/**
	 * Adds AI metadata to page if option is selected
	 */
	public function append_ai_metadata() {
		if ( 'on' === \AdThrive_Ads\Options::get( 'no_ai' ) ) {
			echo '<meta name="robots" content="noai, noimageai">';
		}
	}

	/**
	 * Adds to robot.txt
	 */
	public function update_robot_file( $output ) {
		// If the 'today' query parameter is provided, use it
		// Otherwise, get the current date in 'Y-m-d' format
		$today = isset( $_GET['today'] ) ? sanitize_text_field( wp_unslash( $_GET['today'] ) ) : gmdate( 'Y-m-d' );

		$release_date = '2024-06-03';

		$output .= '
# ======Raptive Begin======
		';

		if ( $today < $release_date ) {
			$output .= '
# ======Raptive End======
			';
			return $output;
		}

		// Defaults are super weird in CMB, so i'm checking the double negative here in case CMB didn't save the default specificed above.
		if ( 'off' !== \AdThrive_Ads\Options::get( 'block_chatgpt_user' ) ) {
			$output .= '
User-agent: ChatGPT-User
Disallow: /
			';
		}
		if ( 'off' !== \AdThrive_Ads\Options::get( 'block_gptbot' ) ) {
			$output .= '
User-agent: GPTBot
Disallow: /
			';
		}
		if ( 'on' === \AdThrive_Ads\Options::get( 'block_google_extended' ) ) {
			$output .= '
User-agent: Google-Extended
Disallow: /
			';
		}
		if ( 'off' !== \AdThrive_Ads\Options::get( 'block_anthropic_ai' ) ) {
			$output .= '
User-agent: anthropic-ai
Disallow: /
			';
		}
		if ( 'off' !== \AdThrive_Ads\Options::get( 'block_claude_web' ) ) {
			$output .= '
User-agent: Claude-Web
Disallow: /		
			';
		}
		if ( 'off' !== \AdThrive_Ads\Options::get( 'block_pipl_bot' ) ) {
			$output .= '
User-agent: PiplBot
Disallow: /		
			';
		}
		if ( 'off' !== \AdThrive_Ads\Options::get( 'block_ccbot' ) ) {
			$output .= '
User-agent: CCbot
Disallow: /		
			';
		}
		if ( 'off' !== \AdThrive_Ads\Options::get( 'block_facebook_bot' ) ) {
			$output .= '
User-agent: FacebookBot
Disallow: /		
			';
		}
		$output .= '
# ======Raptive End======
		';
		return $output;
	}
}