HEX
Server: LiteSpeed
System: Linux melbournecleaninggroup 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
User: www-data (33)
PHP: 7.3.33-1+focal
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,
Upload Files
File: /var/www/html/wp-content/plugins/acf-extended/includes/fields/field-advanced-link.php
<?php

if(!defined('ABSPATH'))
    exit;

if(!class_exists('acfe_field_advanced_link')):

class acfe_field_advanced_link extends acf_field{
    
    public $post_object = '';
    
    function __construct(){

        $this->name = 'acfe_advanced_link';
        $this->label = __('Advanced Link', 'acfe');
        $this->category = 'relational';
        $this->defaults = array(
            'post_type' => array(),
			'taxonomy'  => array(),
        );
        
        add_action('wp_ajax_acfe/fields/advanced_link/post_query',			array($this, 'ajax_query'));
		add_action('wp_ajax_nopriv_acfe/fields/advanced_link/post_query',	array($this, 'ajax_query'));
        
        $this->post_object = acf_get_field_type('post_object');
        remove_action('acf/render_field/type=post_object',                  array($this->post_object, 'render_field'), 9);
        
        add_action('acf/render_field/type=post_object',                     array($this, 'post_object_render_field'), 9);

        parent::__construct();

    }
    
    function post_object_render_field($field){
		
		// Change Field into a select
		$field['type'] = 'select';
		$field['ui'] = 1;
		$field['ajax'] = 1;
		$field['choices'] = array();
		
		// load posts
		$posts = $this->post_object->get_posts( $field['value'], $field );
		
		if($posts){
				
			foreach( array_keys($posts) as $i ) {
				
				// vars
				$post = acf_extract_var( $posts, $i );
				
				
				// append to choices
				$field['choices'][ $post->ID ] = $this->post_object->get_post_title( $post, $field );
				
			}
			
		}
		
		if(acf_maybe_get($field, '_name') === 'post' && !empty($field['value']) && !is_array($field['value']) && !is_numeric($field['value'])){
            
            $post_type = $field['value'];
            $post_type_label = acf_get_post_type_label($post_type);
            
            $field['choices'][$field['value']] = $post_type_label . ' Archive';
            
        }
		
		// render
		acf_render_field( $field );
		
	}
    
    function ajax_query(){
        
        // validate
		if(!acf_verify_ajax())
            die();
		
		// get choices
		$response = $this->post_object->get_ajax_query($_POST);
        
        $options = acf_parse_args($_POST, array(
			'post_id'		=> 0,
			's'				=> '',
			'field_key'		=> '',
			'paged'			=> 1
		));
        
        $field = acf_get_field($options['field_key']);
		if(!$field)
            return false;
        
        if($options['paged'] > 1)
            acf_send_ajax_results($response);
        
        // init archives
        $s = false;
        $is_search = false;
        
        if($options['s'] !== ''){
            
			$s = wp_unslash(strval($options['s']));
			$is_search = true;
			
		}
        
        if(!empty($field['post_type'])){
		
			$post_types = acf_get_array($field['post_type']);
			
		}else{
			
			$post_types = acf_get_post_types();
			
		}
        
        $post_types_archives = array();
        
        foreach($post_types as $post_type){
            
            $post_type_obj = get_post_type_object($post_type);
            
            $has_archive = false;
            
            if($post_type === 'post' || $post_type_obj->has_archive){
                
                $has_archive = true;
                
            }
            
            if(!$has_archive)
                continue;
            
            $post_type_label = acf_get_post_type_label($post_type);
            
            if($is_search && stripos($post_type_label, $s) === false)
                continue;
            
            $post_types_archives[] = array(
                'id' => $post_type,
                'text' => $post_type_label . ' Archive'
            );
            
        }
        
        if(!empty($post_types_archives)){
            
            if(!isset($response['results'])){
                
                $response['results'] = array();
                
            }
        
            array_unshift($response['results'], array(
                'text' => 'Archives',
                'children' => $post_types_archives
            ));
        
        }
		
		// return
		acf_send_ajax_results($response);
        
    }
    
    function render_field_settings($field){
        
        // Filter Post Type
		acf_render_field_setting($field, array(
			'label'			=> __('Filter by Post Type','acf'),
			'instructions'	=> '',
			'type'			=> 'select',
			'name'			=> 'post_type',
			'choices'		=> acf_get_pretty_post_types(),
			'multiple'		=> 1,
			'ui'			=> 1,
			'allow_null'	=> 1,
			'placeholder'	=> __("All post types",'acf'),
		));
        
		// Filter Taxonomy
		acf_render_field_setting($field, array(
			'label'			=> __('Filter by Taxonomy','acf'),
			'instructions'	=> '',
			'type'			=> 'select',
			'name'			=> 'taxonomy',
			'choices'		=> acf_get_taxonomy_terms(),
			'multiple'		=> 1,
			'ui'			=> 1,
			'allow_null'	=> 1,
			'placeholder'	=> __("All taxonomies",'acf'),
		));
        
        $field_name = 'field_name';
        if(acf_maybe_get($field, 'name'))
            $field_name = $field['name'];
        
        ob_start();
        ?>
        Add your own sub fields using the following hook:<br /><br />
<pre>
add_filter('acfe/fields/advanced_link/sub_fields/name=<?php echo $field_name; ?>', 'my_acf_advanced_link_sub_fields', 10, 3);
function my_acf_advanced_link_sub_fields($sub_fields, $field, $value){
    
    /**
     * @array $sub_fields   Sub fields array
     * @array $field        Advanced Link field
     * @array $value        Advanced Link values
     */
    
    $sub_fields[] = array(
        'name'      => 'my_field',
        'label'     => 'My field',
        'type'      => 'true_false',
        'ui'        => true
    );
    
    return $sub_fields;
    
}
</pre>
        <?php
        
        $message = ob_get_clean();
        
        // field_type
        acf_render_field_setting($field, array(
            'label'			=> __('Custom sub fields','acf'),
            'instructions'	=> '',
            'type'			=> 'message',
            'name'			=> 'instructions',
            'message'       => $message,
            'new_lines'     => false
        ));
        
    }
    
    function get_value($value = array()){
		
		// vars
        $value = wp_parse_args($value, array(
            'type'      => 'url',
            'post'      => '',
            'term'      => '',
			'title'     => '',
            'url'       => false,
            'url_title' => '',
			'target'    => false,
		));
        
        $value['url_title'] = $value['url'];
        
        // Post
        if($value['type'] === 'post' && !empty($value['post'])){
            
            if(is_numeric($value['post'])){
                
                $value['url'] = get_permalink($value['post']);
                $value['url_title'] = get_the_title($value['post']);
                
            }else{
                
                $post_type = $value['post'];
                
                $value['url'] = get_post_type_archive_link($post_type);
                $value['url_title'] = acf_get_post_type_label($post_type) . ' Archive';
                
            }
        
        // Term
        }elseif($value['type'] === 'term' && !empty($value['term'])){
            
            $term = get_term(intval($value['term']));
            
            $value['url'] = get_term_link($term);
            $value['url_title'] = $term->name;
            
        }
        
        // Target
        if(!empty($value['target'])){
            
            $value['target'] = '_blank';
            
        }
        
		// return
		return $value;
		
	}
    
    function render_field($field){
        
        // vars
		$div = array(
			'id'	=> $field['id'],
			'class'	=> $field['class'] . ' acf-link',
		);
		
		// get link
		$value = $this->get_value($field['value']);
		
		// classes
		if($value['url']){
            
            $div['class'] .= ' -value';
            
        }
		
		if($value['target'] === '_blank'){
            
            $div['class'] .= ' -external';
            
        }
        
        $sub_fields = array(
        
            array(
                'name'		=> 'type',
                'key'		=> 'type',
                'label'		=> __('Type', 'acf'),
                'type'		=> 'radio',
                'required'	=> false,
                'class'     => 'input-type',
                'choices'   => array(
                    'url'   => __('URL', 'acf'),
                    'post'  => __('Post', 'acf'),
                    'term'  => __('Term', 'acf'),
                ),
            ),
            
            array(
                'name'		=> 'url',
                'key'		=> 'url',
                'label'		=> __('URL', 'acf'),
                'type'		=> 'text',
                'required'	=> false,
                'class'     => 'input-url',
                'conditional_logic' => array(
                    array(
                        array(
                            'field'     => 'type',
                            'operator'  => '==',
                            'value'     => 'url',
                        )
                    )
                )
                
            ),
            
            array(
                'name'          => 'post',
                'key'           => 'post',
                'label'         => __('Post', 'acf'),
                'type'          => 'post_object',
                'required'      => false,
                'class'         => 'input-post',
                'allow_null'    => 0,
                'ajax_action'   => 'acfe/fields/advanced_link/post_query',
                'conditional_logic' => array(
                    array(
                        array(
                            'field'     => 'type',
                            'operator'  => '==',
                            'value'     => 'post',
                        )
                    )
                )
            ),
            
            array(
                'name'          => 'term',
                'key'           => 'term',
                'label'         => __('Term', 'acf'),
                'type'          => 'acfe_taxonomy_terms',
                'required'      => false,
                'class'         => 'input-term',
                'field_type'    => 'select',
                'return_format' => 'id',
                'ui'            => 1,
                'allow_null'    => 0,
                'conditional_logic' => array(
                    array(
                        array(
                            'field'     => 'type',
                            'operator'  => '==',
                            'value'     => 'term',
                        )
                    )
                )
            ),
            
            array(
                'name'		=> 'title',
                'key'		=> 'title',
                'label'		=> __('Link text', 'acf'),
                'type'		=> 'text',
                'required'	=> false,
                'class'     => 'input-title',
            ),
            
            array(
                'name'		=> 'target',
                'key'		=> 'target',
                'label'		=> __('Target', 'acf'),
                'type'		=> 'true_false',
                'message'   => __('Open in an new window', 'acf'),
                'required'	=> false,
                'class'     => 'input-target',
            ),
            
        );
        
        // Deprecated
        $sub_fields = apply_filters_deprecated('acfe/fields/advanced_link/fields',                         array($sub_fields, $field, $value), '0.8.1', 'acfe/fields/advanced_link/sub_fields');
        $sub_fields = apply_filters_deprecated('acfe/fields/advanced_link/fields/name=' . $field['_name'], array($sub_fields, $field, $value), '0.8.1', 'acfe/fields/advanced_link/sub_fields/name=' . $field['_name']);
        $sub_fields = apply_filters_deprecated('acfe/fields/advanced_link/fields/key=' . $field['key'],    array($sub_fields, $field, $value), '0.8.1', 'acfe/fields/advanced_link/sub_fields/key=' . $field['key']);
        
        // Sub Fields Fitlers
        $sub_fields = apply_filters('acfe/fields/advanced_link/sub_fields',                         $sub_fields, $field, $value);
        $sub_fields = apply_filters('acfe/fields/advanced_link/sub_fields/name=' . $field['_name'], $sub_fields, $field, $value);
        $sub_fields = apply_filters('acfe/fields/advanced_link/sub_fields/key=' . $field['key'],    $sub_fields, $field, $value);
        
        foreach($sub_fields as &$sub_field){
            
            $sub_field['prefix'] = $field['name'];
            
            $sub_field['value'] = isset($value[$sub_field['name']]) ? $value[$sub_field['name']] : '';
            
            $sub_field = acf_validate_field($sub_field);
            
            $sub_field = acf_prepare_field($sub_field);
            
        }
		
        ?>
        
        <div <?php acf_esc_attr_e($div); ?>>
        
            <div class="acfe-modal" data-modal-title="<?php echo $field['label']; ?>">
                <div class="acfe-modal-wrapper">
                    <div class="acfe-modal-content">
                    
                    <div class="acf-fields acf-form-fields -left">
                    
                        <?php acf_render_fields($sub_fields, false, 'div', 'label'); ?>
                        
                    </div>
                        
                    </div>
                </div>
            </div>
            
            <a href="#" class="button" data-name="add" target=""><?php _e('Select Link', 'acf'); ?></a>
            
            <div class="link-wrap">
                <span class="link-title"><?php echo esc_html($value['title']); ?></span>
                <a class="link-url" href="<?php echo esc_url($value['url']); ?>" target="_blank"><?php echo esc_html($value['url_title']); ?></a>
                <i class="acf-icon -link-ext acf-js-tooltip" title="<?php _e('Opens in a new window/tab', 'acf'); ?>"></i><?php
                ?><a class="acf-icon -pencil -clear acf-js-tooltip" data-name="edit" href="#" title="<?php _e('Edit', 'acf'); ?>"></a><?php
                ?><a class="acf-icon -cancel -clear acf-js-tooltip" data-name="remove" href="#" title="<?php _e('Remove', 'acf'); ?>"></a>
            </div>
            
        </div>
        <?php
        
    }
    
    function format_value($value, $post_id, $field){
		
		// get value
		$value = $this->get_value($value);
        
        // clean
        acfe_unset($value, 'type');
        acfe_unset($value, 'post');
        acfe_unset($value, 'term');
        acfe_unset($value, 'url_title');

		return $value;
		
	}
    
	function validate_value($valid, $value, $field, $input){
		
		// bail early if not required
		if(!$field['required'])
            return $valid;
        
        // URL is required
        if(empty($value))
            return false;
        
        if((acf_maybe_get($value, 'type') === 'url' && !acf_maybe_get($value, 'url')) || (acf_maybe_get($value, 'type') === 'post' && !acf_maybe_get($value, 'post')) || (acf_maybe_get($value, 'type') === 'term' && !acf_maybe_get($value, 'term')))
            return false;
        
		// return
		return $valid;
		
	}
    
}

// initialize
acf_register_field_type('acfe_field_advanced_link');

endif;