web/wp-content/plugins/acf-extended/includes/fields/field-taxonomy-terms.php (870 lines of code) (raw):
<?php
if(!defined('ABSPATH')){
exit;
}
if(!class_exists('acfe_field_taxonomy_terms')):
class acfe_field_taxonomy_terms extends acf_field{
// vars
var $save_post_terms = array();
/**
* initialize
*/
function initialize(){
$this->name = 'acfe_taxonomy_terms';
$this->label = __('Taxonomy Terms', 'acfe');
$this->category = 'relational';
$this->defaults = array(
'taxonomy' => array(),
'allow_terms' => array(),
'field_type' => 'checkbox',
'choices' => array(),
'default_value' => '',
'return_format' => 'id',
'ui' => 0,
'multiple' => 0,
'allow_null' => 0,
'ajax' => 0,
'placeholder' => '',
'search_placeholder' => '',
'layout' => '',
'toggle' => 0,
'load_terms' => 0,
'save_terms' => 0,
'allow_custom' => 0,
'other_choice' => 0,
);
// actions
$this->add_action('acf/save_post', array($this, 'save_post'), 15, 1);
// ajax
$this->add_action('wp_ajax_acfe/fields/taxonomy_terms/allow_query', array($this, 'ajax_query_allowed_terms'));
$this->add_action('wp_ajax_nopriv_acfe/fields/taxonomy_terms/allow_query', array($this, 'ajax_query_allowed_terms'));
$this->add_action('wp_ajax_acf/fields/acfe_taxonomy_terms/query', array($this, 'ajax_query'));
$this->add_action('wp_ajax_nopriv_acf/fields/acfe_taxonomy_terms/query', array($this, 'ajax_query'));
}
/**
* ajax_query_allowed_terms
*
* wp_ajax_acfe/fields/taxonomy_terms/allow_query
*/
function ajax_query_allowed_terms(){
// validate
if(!acf_verify_ajax()){
die();
}
// get choices
$response = $this->get_ajax_query_allowed_terms($_POST);
// return
acf_send_ajax_results($response);
}
/**
* get_ajax_query_allowed_terms
*
* @param $options
*
* @return array[]
*/
function get_ajax_query_allowed_terms($options = array()){
// defaults
$options = acf_parse_args($options, array(
'post_id' => 0,
's' => '',
'field_key' => '',
'paged' => 1,
'taxonomies' => array(),
'level' => false,
));
// Get grouped terms
$terms = acf_get_grouped_terms(array(
'taxonomy' => $options['taxonomies']
));
if($options['level'] >= 1){
// vars
$terms_final = array();
// loop over values
foreach($terms as $group => $_terms){
foreach($_terms as $term_id => $term){
if(acfe_get_term_level($term_id, $term->taxonomy) === $options['level']){
$terms_final[ $group ][ $term_id ] = $term;
}
}
}
$terms = $terms_final;
}
$groups = acf_get_choices_from_grouped_terms($terms, 'name');
// vars
$results = array();
// loop
foreach(array_keys($groups) as $group_title){
// vars
$terms = acf_extract_var($groups, $group_title);
// data
$data = array(
'text' => $group_title,
'children' => array()
);
$done = array();
// append to $data
$i=0; foreach($terms as $term_id => $name){ $i++;
$term = get_term($term_id);
if($i === 1){
$id = 'all_' . $term->taxonomy;
$text = 'All ';
$taxonomy = get_taxonomy($term->taxonomy);
if($options['level'] >= 1){
$id .= '|' . $options['level'];
$text .= acfe_number_suffix($options['level']) . ' Level ';
}
$text .= $taxonomy->label;
$data['children'][] = array(
'id' => $id,
'text' => '(' . $text . ')'
);
}
if($term->parent !== 0){
$_term = get_term($term->parent);
if(!in_array($_term->term_id . '_childs', $done)){
$_term_choice = acf_get_choice_from_term($_term, 'name');
$data['children'][] = array(
'id' => $_term->term_id . '_childs',
'text' => $_term_choice['text'] . ' (Direct childs)'
);
$done[] = $_term->term_id . '_childs';
}
if(!in_array($_term->term_id . '_all_childs', $done)){
$_term_choice = acf_get_choice_from_term($_term, 'name');
$data['children'][] = array(
'id' => $_term->term_id . '_all_childs',
'text' => $_term_choice['text'] . ' (All childs)'
);
$done[] = $_term->term_id . '_all_childs';
}
}
$data['children'][] = array(
'id' => $term_id,
'text' => $name
);
}
// append to $results
$results[] = $data;
}
// vars
$response = array(
'results' => $results
);
// return
return $response;
}
/**
* ajax_query
*
* wp_ajax_acf/fields/acfe_taxonomy_terms/query
*/
function ajax_query(){
$nonce = acf_request_arg('nonce', '');
$key = acf_request_arg('field_key', '');
// Back-compat for field settings.
if(!acf_is_field_key($key)){
$nonce = '';
$key = '';
}
// validate
if(!acf_verify_ajax($nonce, $key)){
die();
}
// get choices
$response = $this->get_ajax_query($_POST);
// return
acf_send_ajax_results($response);
}
/**
* get_ajax_query
*
* @param $options
*
* @return array|array[]|false
*/
function get_ajax_query($options = array()){
// defaults
$options = acf_parse_args($options, array(
'post_id' => 0,
's' => '',
'field_key' => '',
'paged' => 0
));
// load field
$field = acf_get_field($options['field_key']);
if(!$field){
return false;
}
// Args
$args = array();
// vars
$results = array();
// search
if($options['s'] !== '') {
// strip slashes (search may be integer)
$s = wp_unslash(strval($options['s']));
// update vars
$args['search'] = $s;
}
//vars
$name = $field['name'];
$key = $field['key'];
$post_id = $options['post_id'];
// filters
$args = apply_filters("acfe/fields/taxonomy_terms/query", $args, $field, $post_id);
$args = apply_filters("acfe/fields/taxonomy_terms/query/name={$name}", $args, $field, $post_id);
$args = apply_filters("acfe/fields/taxonomy_terms/query/key={$key}", $args, $field, $post_id);
$terms = $this->get_terms($field, $args);
if(!empty($terms)){
$keys = array_keys($terms);
$single_taxonomy = false;
if(count($keys) === 1){
$single_taxonomy = true;
}
foreach($terms as $taxonomy => $term){
$data = array(
'text' => $taxonomy,
'children' => array()
);
foreach($term as $term_id => $term_name){
$data['children'][] = array(
'id' => $term_id,
'text' => $term_name
);
}
$results[] = $data;
}
if($single_taxonomy){
$results = $results[0]['children'];
}
}
// vars
$response = array(
'results' => $results
);
// return
return $response;
}
/**
* render_field_settings
*
* @param $field
*/
function render_field_settings($field){
if(isset($field['default_value'])){
$field['default_value'] = acf_encode_choices($field['default_value'], false);
}
// Allow Taxonomy
acf_render_field_setting($field, array(
'label' => __('Allow Taxonomy','acf'),
'instructions' => '',
'type' => 'select',
'name' => 'taxonomy',
'choices' => acf_get_taxonomy_labels(),
'multiple' => 1,
'ui' => 1,
'allow_null' => 1,
'placeholder' => __("All taxonomies",'acf'),
));
// Allow Terms
$choices = array();
$field['taxonomy'] = acf_get_array($field['taxonomy']);
if(!empty($field['allow_terms'])){
foreach($field['allow_terms'] as $id){
// All terms
if(acfe_starts_with($id, 'all_')){
$taxonomy = substr($id, 4);
$level = false;
if(stripos($taxonomy, '|') !== false){
$level = explode('|', $taxonomy);
$taxonomy = $level[0];
$level = $level[1];
$level = acfe_number_suffix($level) . ' Level ';
}
if(!empty($field['taxonomy']) && !in_array($taxonomy, $field['taxonomy'])){
continue;
}
$taxonomy = get_taxonomy($taxonomy);
$value = '(All ' . $level . $taxonomy->label . ')';
}
// Terms all childs
elseif(acfe_ends_with($id, '_all_childs')){
$term_id = substr($id, 0, -11);
$term = get_term($term_id);
$taxonomy = $term->taxonomy;
if(!empty($field['taxonomy']) && !in_array($taxonomy, $field['taxonomy'])){
continue;
}
$value = $term->name . ' (All childs)';
}
// Terms childs
elseif(acfe_ends_with($id, '_childs')){
$term_id = substr($id, 0, -7);
$term = get_term($term_id);
$taxonomy = $term->taxonomy;
if(!empty($field['taxonomy']) && !in_array($taxonomy, $field['taxonomy'])){
continue;
}
$value = $term->name . ' (Direct childs)';
}
// Term
else{
$term = get_term($id);
$taxonomy = $term->taxonomy;
if(!empty($field['taxonomy']) && !in_array($taxonomy, $field['taxonomy'])){
continue;
}
$term_data = acf_get_choice_from_term($term, 'name');
$value = $term_data['text'];
}
// append to choices
$choices[ $id ] = $value;
}
}
acf_render_field_setting($field, array(
'label' => __('Allow Terms','acf'),
'instructions' => '',
'type' => 'select',
'name' => 'allow_terms',
'choices' => $choices,
'multiple' => 1,
'ui' => 1,
'allow_null' => 1,
'ajax' => 1,
'placeholder' => __("All terms",'acf'),
'ajax_action' => 'acfe/fields/taxonomy_terms/allow_query',
));
// Select: Terms level
acf_render_field_setting($field, array(
'label' => __('Terms_level','acf'),
'instructions' => '',
'name' => 'allow_level',
'type' => 'number',
'append' => 'levels',
'min' => 0,
'placeholder' => __('All','acf'),
'_append' => 'allow_terms',
'value' => false
));
// field_type
acf_render_field_setting($field, array(
'label' => __('Appearance','acf'),
'instructions' => __('Select the appearance of this field', 'acf'),
'type' => 'select',
'name' => 'field_type',
'optgroup' => true,
'choices' => array(
'checkbox' => __('Checkbox', 'acf'),
'radio' => __('Radio Buttons', 'acf'),
'select' => _x('Select', 'noun', 'acf')
)
));
// default_value
acf_render_field_setting($field, array(
'label' => __('Default Value','acf'),
'instructions' => __('Enter each default value on a new line','acf'),
'name' => 'default_value',
'type' => 'textarea',
));
// return_format
acf_render_field_setting($field, array(
'label' => __('Return Value', 'acf'),
'instructions' => '',
'type' => 'radio',
'name' => 'return_format',
'choices' => array(
'object' => __('Term object', 'acfe'),
'name' => __('Term name', 'acfe'),
'id' => __('Term ID', 'acfe'),
),
'layout' => 'horizontal',
));
// Select: ui
acf_render_field_setting($field, array(
'label' => __('Stylised UI','acf'),
'instructions' => '',
'name' => 'ui',
'type' => 'true_false',
'ui' => 1,
'conditions' => array(
array(
array(
'field' => 'field_type',
'operator' => '==',
'value' => 'select',
),
),
)
));
// Select: allow_null
acf_render_field_setting($field, array(
'label' => __('Allow Null?','acf'),
'instructions' => '',
'name' => 'allow_null',
'type' => 'true_false',
'ui' => 1,
'conditions' => array(
array(
array(
'field' => 'field_type',
'operator' => '==',
'value' => 'select',
),
),
array(
array(
'field' => 'field_type',
'operator' => '==',
'value' => 'radio',
),
),
)
));
// Select: Placeholder
acf_render_field_setting($field, array(
'label' => __('Placeholder','acf'),
'instructions' => __('Appears within the input','acf'),
'type' => 'text',
'name' => 'placeholder',
'placeholder' => _x('Select', 'verb', 'acf'),
'conditional_logic' => array(
array(
array(
'field' => 'field_type',
'operator' => '==',
'value' => 'select',
),
array(
'field' => 'ui',
'operator' => '==',
'value' => '0',
),
array(
'field' => 'allow_null',
'operator' => '==',
'value' => '1',
),
array(
'field' => 'multiple',
'operator' => '==',
'value' => '0',
),
),
array(
array(
'field' => 'field_type',
'operator' => '==',
'value' => 'select',
),
array(
'field' => 'ui',
'operator' => '==',
'value' => '1',
),
array(
'field' => 'allow_null',
'operator' => '==',
'value' => '1',
),
),
array(
array(
'field' => 'field_type',
'operator' => '==',
'value' => 'select',
),
array(
'field' => 'ui',
'operator' => '==',
'value' => '1',
),
array(
'field' => 'multiple',
'operator' => '==',
'value' => '1',
),
),
)
));
// Select: Search Placeholder
acf_render_field_setting($field, array(
'label' => __('Search Input Placeholder','acf'),
'instructions' => __('Appears within the search input','acf'),
'type' => 'text',
'name' => 'search_placeholder',
'placeholder' => '',
'conditional_logic' => array(
array(
array(
'field' => 'field_type',
'operator' => '==',
'value' => 'select',
),
array(
'field' => 'ui',
'operator' => '==',
'value' => '1',
),
array(
'field' => 'multiple',
'operator' => '==',
'value' => '0',
),
),
)
));
// Select: multiple
acf_render_field_setting($field, array(
'label' => __('Select multiple values?','acf'),
'instructions' => '',
'name' => 'multiple',
'type' => 'true_false',
'ui' => 1,
'conditions' => array(
array(
array(
'field' => 'field_type',
'operator' => '==',
'value' => 'select',
),
),
)
));
// Select: ajax
acf_render_field_setting($field, array(
'label' => __('Use AJAX to lazy load choices?','acf'),
'instructions' => '',
'name' => 'ajax',
'type' => 'true_false',
'ui' => 1,
'conditions' => array(
array(
array(
'field' => 'field_type',
'operator' => '==',
'value' => 'select',
),
array(
'field' => 'ui',
'operator' => '==',
'value' => 1,
),
),
)
));
// Checkbox: layout
acf_render_field_setting($field, array(
'label' => __('Layout','acf'),
'instructions' => '',
'type' => 'radio',
'name' => 'layout',
'layout' => 'horizontal',
'choices' => array(
'vertical' => __("Vertical",'acf'),
'horizontal' => __("Horizontal",'acf')
),
'conditions' => array(
array(
array(
'field' => 'field_type',
'operator' => '==',
'value' => 'checkbox',
),
),
array(
array(
'field' => 'field_type',
'operator' => '==',
'value' => 'radio',
),
),
)
));
// Checkbox: toggle
acf_render_field_setting($field, array(
'label' => __('Toggle','acf'),
'instructions' => __('Prepend an extra checkbox to toggle all choices','acf'),
'name' => 'toggle',
'type' => 'true_false',
'ui' => 1,
'conditions' => array(
array(
array(
'field' => 'field_type',
'operator' => '==',
'value' => 'checkbox',
),
),
)
));
// save_terms
acf_render_field_setting($field, array(
'label' => __('Save Terms','acf'),
'instructions' => __('Connect selected terms to the post','acf'),
'name' => 'save_terms',
'type' => 'true_false',
'ui' => 1,
));
// load_terms
acf_render_field_setting($field, array(
'label' => __('Load Terms','acf'),
'instructions' => __('Load value from posts terms','acf'),
'name' => 'load_terms',
'type' => 'true_false',
'ui' => 1,
));
}
/**
* update_field
*
* @param $field
*
* @return mixed
*/
function update_field($field){
$field['default_value'] = acf_decode_choices($field['default_value'], true);
if($field['field_type'] === 'radio'){
$field['default_value'] = acfe_unarray($field['default_value']);
}
return $field;
}
/**
* prepare_field
*
* @param $field
*
* @return mixed
*/
function prepare_field($field){
// value
$value = acf_maybe_get($field, 'value');
$value = acf_get_array($value);
// choices
$field['choices'] = array();
// field type
$field['type'] = $field['field_type'];
// normal choices
if($field['type'] !== 'select' || !$field['ui'] || !$field['ajax'] || isset($field['ajax_action'])){
//vars
$name = $field['_name'];
$key = $field['key'];
$post_id = acfe_get_post_id();
// filters
$args = array();
$args = apply_filters("acfe/fields/taxonomy_terms/query", $args, $field, $post_id);
$args = apply_filters("acfe/fields/taxonomy_terms/query/name={$name}", $args, $field, $post_id);
$args = apply_filters("acfe/fields/taxonomy_terms/query/key={$key}", $args, $field, $post_id);
$choices = $this->get_terms($field, $args);
$keys = array_keys($choices);
// Single Term
if(count($keys) === 1){
$choices = $choices[ $keys[0] ];
}
$field['choices'] = $choices;
// ajax choices
}else{
if(!isset($field['ajax_action'])){
$field['ajax_action'] = 'acf/fields/acfe_taxonomy_terms/query';
}
$all_terms = array();
$terms = array_unique($value);
foreach($terms as $term_id){
$term = get_term($term_id);
if(is_a($term, 'WP_Term')){
$all_terms[] = $term;
}
}
if(!empty($all_terms)){
$terms = $this->filter_terms($all_terms, $field);
foreach($terms as $taxonomy => $term){
foreach($term as $term_id => $term_name){
$field['choices'][ $term_id ] = $term_name;
}
}
}
}
// allow custom
if($field['allow_custom']){
foreach($value as $v){
$found = false;
foreach($field['choices'] as $taxonomy => $term){
if(isset($term[ $v ])){
$found = true;
break;
}
}
if(!$found){
$field['choices'][ $v ] = $v;
$field['custom_choices'][ $v ] = $v;
}
}
}
// unarray values if radio
if($field['type'] === 'radio'){
$values = acf_get_array($field['value']);
// check if value exists in choices and select it (in case of allowed terms)
foreach($values as $value){
if(isset($field['choices'][ $value ])){
$field['value'] = $value;
break;
}
}
// unarray
$field['value'] = acfe_unarray($field['value']);
}
return $field;
}
/**
* load_value
*
* @param $value
* @param $post_id
* @param $field
*
* @return false|mixed|WP_Error|WP_Term
*/
function load_value($value, $post_id, $field){
// bail early if there is no post id
if(!$post_id){
return $value;
}
// bail early when local meta
if(acfe_is_local_post_id($post_id)){
return $value;
}
// bail early front-end form
if(acfe_starts_with($post_id, 'acfe_form')){
return $value;
}
// load_terms
if($field['load_terms']){
// get valid terms
$value = acf_get_array($value);
$taxonomy = $field['taxonomy'];
if(empty($taxonomy)){
$taxonomy = acf_get_taxonomies();
}
// get terms
$info = acf_get_post_id_info($post_id);
$term_ids = wp_get_object_terms($info['id'], $taxonomy, array('fields' => 'ids', 'orderby' => 'none'));
// bail early if no terms
if(empty($term_ids) || is_wp_error($term_ids)){
return false;
}
// sort
if(!empty($value)){
$order = array();
foreach($term_ids as $i => $v){
$order[ $i ] = array_search($v, $value);
}
array_multisort($order, $term_ids);
}
// update value
$value = $term_ids;
}
// return
return $value;
}
/**
* update_value
*
* @param $value
* @param $post_id
* @param $field
*
* @return array|mixed
*/
function update_value($value, $post_id, $field){
// vars
if(is_array($value)){
$value = array_filter($value);
}
// bail early if there is no post id
if(!$post_id){
return $value;
}
// bail early when local meta
if(acfe_is_local_post_id($post_id)){
return $value;
}
// bail early front-end form
if(acfe_starts_with($post_id, 'acfe_form')){
return $value;
}
// save_terms
if($field['save_terms']){
// vars
$taxonomies = $field['taxonomy'];
if(empty($taxonomies)){
$taxonomies = acf_get_taxonomies();
}
// force value to array
$term_ids = acf_get_array($value);
// convert to int
$term_ids = array_map('intval', $term_ids);
foreach($taxonomies as $taxonomy){
$terms = array();
foreach($term_ids as $term_id){
$term = get_term($term_id);
if($term && !is_wp_error($term) && $term->taxonomy === $taxonomy){
$terms[] = $term_id;
}
}
// get existing term id's (from a previously saved field)
$old_term_ids = isset($this->save_post_terms[ $taxonomy ]) ? $this->save_post_terms[ $taxonomy ] : array();
// append
$this->save_post_terms[ $taxonomy ] = array_merge($old_term_ids, $terms);
}
// if called directly from frontend update_field()
if(!did_action('acf/save_post')){
$this->save_post($post_id);
return $value;
}
}
// return
return $value;
}
/**
* format_value
*
* @param $value
* @param $post_id
* @param $field
*
* @return array|false|mixed|string[]
*/
function format_value($value, $post_id, $field){
// Bail early
if(empty($value)){
return $value;
}
// Vars
$is_array = is_array($value);
$value = acf_get_array($value);
// Loop
foreach($value as &$v){
// Retrieve Object
$object = get_term($v);
if(!$object || is_wp_error($object)) continue;
// Return: Object
if($field['return_format'] === 'object'){
$v = $object;
// Return: Name
}elseif($field['return_format'] === 'name'){
$v = $object->name;
}
}
// Do not return array
if(!$is_array){
$value = acfe_unarray($value);
}
// Return
return $value;
}
/**
* save_post
*
* @param $post_id
*/
function save_post($post_id){
// bail ealry if no terms
if(empty($this->save_post_terms)){
return;
}
// bail early if not post
$data = acf_get_post_id_info($post_id);
// loop
foreach($this->save_post_terms as $taxonomy => $term_ids){
// save
wp_set_object_terms($data['id'], $term_ids, $taxonomy, false);
}
// reset array ( WP saves twice )
$this->save_post_terms = array();
}
/**
* get_terms
*
* @param $field
* @param $args
*
* @return array
*/
function get_terms($field, $args = array()){
// taxonomy
$field['taxonomy'] = acf_get_array($field['taxonomy']);
// choices
$choices = array();
// get allowed taxonomies
$taxonomies = $field['taxonomy'];
$taxonomies = array_filter($taxonomies, 'taxonomy_exists');
$taxonomies = array_values($taxonomies);
// append all taxonomies if empty
$taxonomies = acf_get_taxonomy_labels($taxonomies);
$taxonomies = array_keys($taxonomies);
// parse args
$args = wp_parse_args($args, array(
'taxonomy' => $taxonomies
));
// get terms
$all_terms = acf_get_terms($args);
if(empty($all_terms)){
return $choices;
}
// add to choices
$choices = $this->filter_terms($all_terms, $field);
return $choices;
}
/**
* filter_terms
*
* @param $all_terms
* @param $field
*
* @return array
*/
function filter_terms($all_terms, $field){
if(empty($field['taxonomy']) && empty($field['allow_terms'])){
$terms = wp_list_pluck($all_terms, 'term_id');
$terms = array_unique($terms);
$choices = $this->convert_terms_to_choices($terms, $field);
return $choices;
}
$terms = array();
// Filter taxonomy terms
if(!empty($field['taxonomy'])){
$allowed_tax_terms = array();
foreach($all_terms as $term){
if(in_array($term->taxonomy, $field['taxonomy'])){
$allowed_tax_terms[] = $term;
}
}
$all_terms = $allowed_tax_terms;
}
if(empty($field['allow_terms'])){
$terms = $all_terms;
// Filter allowed terms
}else{
// Add term level
foreach($all_terms as $term_id => &$_term){
$level = acfe_get_term_level($_term->term_id, $_term->taxonomy);
$_term->level = $level;
}
foreach($field['allow_terms'] as $id){
// All terms
if(acfe_starts_with($id, 'all_')){
$taxonomy = substr($id, 4);
$level = false;
if(stripos($taxonomy, '|') !== false){
$level = explode('|', $taxonomy);
$taxonomy = $level[0];
$level = $level[1];
}
if(!empty($field['taxonomy']) && !in_array($taxonomy, $field['taxonomy'])){
continue;
}
$keep = array();
if($level){
foreach($all_terms as $all_term){
if((int) $all_term->level === (int) $level && $all_term->taxonomy === $taxonomy){
$keep[] = $all_term;
}
}
}else{
foreach($all_terms as $all_term){
if($all_term->taxonomy === $taxonomy){
$keep[] = $all_term;
}
}
}
$terms = array_merge($terms, $keep);
}
// Terms all childs
elseif(acfe_ends_with($id, '_all_childs')){
$term_id = substr($id, 0, -11);
$term = get_term($term_id);
$taxonomy = $term->taxonomy;
if(!empty($field['taxonomy']) && !in_array($taxonomy, $field['taxonomy'])){
continue;
}
$keep = array();
foreach($all_terms as $all_term){
if($all_term->taxonomy === $taxonomy){
$term_childs = get_term_children($term_id, $taxonomy);
if(in_array($all_term->term_id, $term_childs)){
$keep[] = $all_term;
}
}
}
// sort into hierachial order
if(is_taxonomy_hierarchical($taxonomy)){
$keep = _get_term_children($id, $keep, $taxonomy);
$keep = acf_get_array($keep);
}
$terms = array_merge($terms, $keep);
}
// Terms direct childs
elseif(acfe_ends_with($id, '_childs')){
$term_id = substr($id, 0, -7);
$term = get_term($term_id);
$taxonomy = $term->taxonomy;
if(!empty($field['taxonomy']) && !in_array($taxonomy, $field['taxonomy'])){
continue;
}
$keep = array();
foreach($all_terms as $all_term){
if((int) $all_term->parent === (int) $term_id && $all_term->taxonomy === $taxonomy){
$keep[] = $all_term;
}
}
$terms = array_merge($terms, $keep);
}
// Term
else{
$term = get_term($id);
$taxonomy = $term->taxonomy;
if(!empty($field['taxonomy']) && !in_array($taxonomy, $field['taxonomy'])){
continue;
}
$keep = array();
$keep[] = $term;
$terms = array_merge($terms, $keep);
}
}
}
$terms = wp_list_pluck($terms, 'term_id');
$terms = array_unique($terms);
$choices = $this->convert_terms_to_choices($terms, $field);
return $choices;
}
/**
* convert_terms_to_choices
*
* @param $terms
* @param $field
*
* @return array
*/
function convert_terms_to_choices($terms, $field){
$choices = array();
if(empty($terms)){
return $choices;
}
// get terms grouped by taxonomy
//
// array(
// Category => array(
// 25 => WP_Term Object(...),
// 26 => WP_Term Object(...),
// )
// )
$terms = acf_get_grouped_terms(array(
'include' => $terms,
'orderby' => 'include'
));
// list terms grouped by taxonomy with names
//
// array(
// Category => array(
// 25 => Category 1,
// 26 => - Sub Category A,
// )
// )
$choices = acf_get_choices_from_grouped_terms($terms, 'name');
//vars
$name = $field['_name'];
$key = $field['key'];
$post_id = acfe_get_post_id();
foreach($choices as $taxonomy => &$terms){
foreach($terms as $term_id => &$text){
//vars
$term = get_term($term_id);
// filters
$text = apply_filters("acfe/fields/taxonomy_terms/result", $text, $term, $field, $post_id);
$text = apply_filters("acfe/fields/taxonomy_terms/result/name={$name}", $text, $term, $field, $post_id);
$text = apply_filters("acfe/fields/taxonomy_terms/result/key={$key}", $text, $term, $field, $post_id);
}
}
return $choices;
}
/**
* translate_field
*
* @param $field
*
* @return mixed
*/
function translate_field($field){
$field['placeholder'] = acf_translate($field['placeholder']);
$field['search_placeholder'] = acf_translate($field['search_placeholder']);
return $field;
}
/**
* get_rest_schema
*
* @param $field
*
* @return array
*/
function get_rest_schema(array $field){
$schema = array(
'type' => array('string', 'array', 'null'),
'required' => isset($field['required']) && $field['required'],
'items' => array(
'type' => 'string',
),
);
return $schema;
}
}
// initialize
acf_register_field_type('acfe_field_taxonomy_terms');
endif;