/**
     * Renders the markup for the `integrations` field.
     *
     * @param array $args The array with configuration of fields.
     * @since 0.4
     */
    public static function custom_render_integrations($args)
    {
        $name = $args['serialized_with_group'] . '[integrations][]';
        $compat_plugins = parent::get_registered_compat('instant_articles_compat_registry_analytics');
        if (empty($compat_plugins)) {
            ?>
			<em>
				<?php 
            echo esc_html('No supported analytics plugins are installed nor activated');
            ?>
			</em>
			<?php 
            return;
        }
        asort($compat_plugins);
        foreach ($compat_plugins as $plugin_id => $plugin_info) {
            ?>
			<label>
				<input
					type="checkbox"
					name="<?php 
            echo esc_attr($name);
            ?>
"
					value="<?php 
            echo esc_attr($plugin_id);
            ?>
"
					<?php 
            echo checked(in_array($plugin_id, self::$settings['integrations'], true));
            ?>
				>
				<?php 
            echo esc_html($plugin_info['name']);
            ?>
			</label>
			<br />
			<?php 
        }
        ?>
		<p class="description">Select which analytics services you'd like to use with Instant Articles.</p>
		<?php 
    }
 /**
  * Constructor.
  *
  * @since 0.4
  */
 public function __construct()
 {
     parent::__construct(self::OPTION_KEY, self::$sections, self::$fields);
 }
 /**
  * Add all analytic tracking code(s) an InstantArticle.
  *
  * @since 0.3
  */
 public function add_analytics_from_settings()
 {
     $settings_analytics = Instant_Articles_Option_Analytics::get_option_decoded();
     if (isset($settings_analytics['embed_code_enabled']) && !empty($settings_analytics['embed_code'])) {
         $document = new DOMDocument();
         $fragment = $document->createDocumentFragment();
         $valid_html = @$fragment->appendXML($settings_analytics['embed_code']);
         if ($valid_html) {
             $this->instant_article->addChild(Analytics::create()->withHTML($fragment));
         }
     }
     if (!empty($settings_analytics['integrations'])) {
         $settings_analytics_compats = $settings_analytics['integrations'];
         $registered_compat_analytics = Instant_Articles_Option::get_registered_compat('instant_articles_compat_registry_analytics');
         foreach ($registered_compat_analytics as $compat_id => $compat_info) {
             if (in_array($compat_id, $settings_analytics_compats, true)) {
                 $document = new DOMDocument();
                 $fragment = $document->createDocumentFragment();
                 $valid_html = @$fragment->appendXML($compat_info['payload']);
                 if ($valid_html) {
                     $this->instant_article->addChild(Analytics::create()->withHTML($fragment));
                 }
             }
         }
     }
 }
 /**
  * Constructor.
  *
  * @since 0.4
  */
 public function __construct()
 {
     parent::__construct(self::OPTION_KEY, self::$sections, self::$fields);
     wp_localize_script('instant-articles-option-publishing', 'INSTANT_ARTICLES_OPTION_PUBLISHING', array('option_field_id_custom_rules_enabled' => self::OPTION_KEY . '-custom_rules_enabled', 'option_field_id_custom_rules' => self::OPTION_KEY . '-custom_rules'));
 }
 /**
  * Sanitize and return all the field values.
  *
  * This method receives a payload containing all value for its fields and
  * should return the same payload after having been sanitized.
  *
  * Do not, encode the payload as this is performed by the
  * universal_sanitize_and_encode_handler() of the parent class.
  *
  * @param array $field_values The array map with field values.
  * @since 0.5
  */
 public function sanitize_option_fields($field_values)
 {
     foreach ($field_values as $field_id => $field_value) {
         $field = self::$fields[$field_id];
         switch ($field_id) {
             case 'ad_source':
                 $all_options = array();
                 $registered_compat_ads = Instant_Articles_Option::get_registered_compat('instant_articles_compat_registry_ads');
                 foreach ($field['select_options'] as $option_id => $option_info) {
                     $all_options[] = $option_id;
                 }
                 foreach ($registered_compat_ads as $compat_id => $compat_info) {
                     $all_options[] = $compat_id;
                 }
                 if (!in_array($field_value, $all_options, true)) {
                     $field_values[$field_id] = $field['default'];
                     add_settings_error($field_id, 'invalid_option', 'Invalid Ad Source');
                 }
                 break;
             case 'fan_placement_id':
                 if (isset($field_values['ad_source']) && 'fan' === $field_values['ad_source']) {
                     if (preg_match('/^[0-9_]+$/', $field_values[$field_id]) !== 1) {
                         add_settings_error($field_id, 'invalid_placement_id', 'Invalid Audience Network Placement ID provided');
                         $field_values[$field_id] = $field['default'];
                     }
                 }
                 break;
             case 'iframe_url':
                 if (isset($field_values['ad_source']) && 'iframe' === $field_values['ad_source']) {
                     $url = $field_values[$field_id];
                     if (substr($url, 0, 2) === '//') {
                         // Allow URLs without protocol prefix
                         $url = 'http:' . $url;
                     }
                     $url = filter_var($url, FILTER_VALIDATE_URL);
                     if (!$url) {
                         $field_values[$field_id] = $field['default'];
                         add_settings_error($field_id, 'invalid_url', 'Invalid URL provided for Ad iframe');
                     }
                 }
                 break;
             case 'embed_code':
                 if (isset($field_values['ad_source']) && 'embed' === $field_values['ad_source']) {
                     $document = new DOMDocument();
                     $fragment = $document->createDocumentFragment();
                     if (!@$fragment->appendXML($field_values[$field_id])) {
                         add_settings_error('embed_code', 'invalid_markup', 'Invalid HTML markup provided for ad custom embed code');
                     }
                 }
                 break;
             case 'dimensions':
                 if (isset($field_values['ad_source']) && 'none' !== $field_values['ad_source']) {
                     if (!array_key_exists($field_value, $field['select_options'])) {
                         $field_values[$field_id] = $field['default'];
                         add_settings_error('embed_code', 'invalid_dimensions', 'Invalid dimensions provided for Ad');
                     }
                 }
                 break;
         }
     }
     return $field_values;
 }