File "class-acf-field-taxonomy.php"
Full path: /home/kosmetik/public_html/wp-content/plugins/advanced-custom-fields/includes/fields/class-acf-field-taxonomy.php
File
size: 14.86 B
MIME-type: text/x-php
Charset: utf-8
Download Open Edit Advanced Editor Back
<?php
if (!class_exists('acf_field_taxonomy')) {
class acf_field_taxonomy extends acf_field
{
var $save_post_terms = array();
function initialize()
{
$this->name = 'taxonomy';
$this->label = __('Taxonomy', 'acf');
$this->category = 'relational';
$this->defaults = array('taxonomy' => 'category', 'field_type' => 'checkbox', 'multiple' => 0, 'allow_null' => 0, 'return_format' => 'id', 'add_term' => 1, 'load_terms' => 0, 'save_terms' => 0);
acf_add_filter_variations('acf/fields/taxonomy/query', array('name', 'key'), 1);
acf_add_filter_variations('acf/fields/taxonomy/result', array('name', 'key'), 2);
add_action('wp_ajax_acf/fields/taxonomy/query', array($this, 'ajax_query'));
add_action('wp_ajax_nopriv_acf/fields/taxonomy/query', array($this, 'ajax_query'));
add_action('wp_ajax_acf/fields/taxonomy/add_term', array($this, 'ajax_add_term'));
add_action('acf/save_post', array($this, 'save_post'), 15, 1);
}
function ajax_query()
{
if (!acf_verify_ajax()) {
die;
}
$response = $this->get_ajax_query($_POST);
acf_send_ajax_results($response);
}
function get_ajax_query($options = array())
{
$options = acf_parse_args($options, array('post_id' => 0, 's' => '', 'field_key' => '', 'paged' => 0));
$field = acf_get_field($options['field_key']);
if (!$field) {
return false;
}
if (!taxonomy_exists($field['taxonomy'])) {
return false;
}
$results = array();
$is_hierarchical = is_taxonomy_hierarchical($field['taxonomy']);
$is_pagination = $options['paged'] > 0;
$is_search = false;
$limit = 20;
$offset = 20 * ($options['paged'] - 1);
$args = array('taxonomy' => $field['taxonomy'], 'hide_empty' => false);
if ($is_pagination && !$is_hierarchical) {
$args['number'] = $limit;
$args['offset'] = $offset;
}
if ($options['s'] !== '') {
$s = wp_unslash(strval($options['s']));
$args['search'] = $s;
$is_search = true;
}
$args = apply_filters('acf/fields/taxonomy/query', $args, $field, $options['post_id']);
$terms = acf_get_terms($args);
if ($is_hierarchical) {
$limit = acf_maybe_get($args, 'number', $limit);
$offset = acf_maybe_get($args, 'offset', $offset);
$parent = acf_maybe_get($args, 'parent', 0);
$parent = acf_maybe_get($args, 'child_of', $parent);
if (!$is_search) {
$ordered_terms = _get_term_children($parent, $terms, $field['taxonomy']);
if (!empty($ordered_terms)) {
$terms = $ordered_terms;
}
}
if ($is_pagination) {
$terms = array_slice($terms, $offset, $limit);
}
}
foreach ($terms as $term) {
$results[] = array('id' => $term->term_id, 'text' => $this->get_term_title($term, $field, $options['post_id']));
}
$response = array('results' => $results, 'limit' => $limit);
return $response;
}
function get_term_title($term, $field, $post_id = 0)
{
$title = acf_get_term_title($term);
$post_id = $post_id ? $post_id : acf_get_form_data('post_id');
return apply_filters('acf/fields/taxonomy/result', $title, $term, $field, $post_id);
}
function get_terms($value, $taxonomy = 'category')
{
if (count($value) > 1) {
$terms = acf_get_terms(array('taxonomy' => $taxonomy, 'include' => $value, 'hide_empty' => false));
}
foreach (array_keys($value) as $i) {
$value[$i] = get_term($value[$i], $taxonomy);
}
$value = array_filter($value);
return $value;
}
function load_value($value, $post_id, $field)
{
$value = acf_get_valid_terms($value, $field['taxonomy']);
if ($field['load_terms']) {
extract(acf_decode_post_id($post_id));
if ($type === 'block') {
}
$term_ids = wp_get_object_terms($id, $field['taxonomy'], array('fields' => 'ids', 'orderby' => 'none'));
if (empty($term_ids) || is_wp_error($term_ids)) {
return false;
}
if (!empty($value)) {
$order = array();
foreach ($term_ids as $i => $v) {
$order[$i] = array_search($v, $value);
}
array_multisort($order, $term_ids);
}
$value = $term_ids;
}
if ($field['field_type'] == 'select' || $field['field_type'] == 'radio') {
$value = array_shift($value);
}
return $value;
}
function update_value($value, $post_id, $field)
{
if (is_array($value)) {
$value = array_filter($value);
}
if ($field['save_terms']) {
$taxonomy = $field['taxonomy'];
$term_ids = acf_get_array($value);
$term_ids = array_map('intval', $term_ids);
$old_term_ids = isset($this->save_post_terms[$taxonomy]) ? $this->save_post_terms[$taxonomy] : array();
$this->save_post_terms[$taxonomy] = array_merge($old_term_ids, $term_ids);
if (!did_action('acf/save_post')) {
$this->save_post($post_id);
return $value;
}
}
return $value;
}
function save_post($post_id)
{
if (!empty($this->save_post_terms)) {
extract(acf_decode_post_id($post_id));
if ($type === 'block') {
}
foreach ($this->save_post_terms as $taxonomy => $term_ids) {
wp_set_object_terms($id, $term_ids, $taxonomy, false);
}
$this->save_post_terms = array();
}
}
function format_value($value, $post_id, $field)
{
if (empty($value)) {
return false;
}
$value = acf_get_array($value);
if ($field['return_format'] == 'object') {
$value = $this->get_terms($value, $field['taxonomy']);
}
if ($field['field_type'] == 'select' || $field['field_type'] == 'radio') {
$value = array_shift($value);
}
return $value;
}
function render_field($field)
{
$field['value'] = acf_get_array($field['value']);
$div = array('class' => 'acf-taxonomy-field', 'data-save' => $field['save_terms'], 'data-ftype' => $field['field_type'], 'data-taxonomy' => $field['taxonomy'], 'data-allow_null' => $field['allow_null']);
$taxonomy = get_taxonomy($field['taxonomy']);
if (!$taxonomy) {
return;
}
?>
<div <?php
acf_esc_attr_e($div);
?>>
<?php
if ($field['add_term'] && current_user_can($taxonomy->cap->manage_terms)) {
?>
<div class="acf-actions -hover">
<a href="#" class="acf-icon -plus acf-js-tooltip small" data-name="add" title="<?php
echo esc_attr($taxonomy->labels->add_new_item);
?>"></a>
</div>
<?php
}
if ($field['field_type'] == 'select') {
$field['multiple'] = 0;
$this->render_field_select($field);
} elseif ($field['field_type'] == 'multi_select') {
$field['multiple'] = 1;
$this->render_field_select($field);
} elseif ($field['field_type'] == 'radio') {
$this->render_field_checkbox($field);
} elseif ($field['field_type'] == 'checkbox') {
$this->render_field_checkbox($field);
}
?>
</div>
<?php
}
function render_field_select($field)
{
$field['type'] = 'select';
$field['ui'] = 1;
$field['ajax'] = 1;
$field['choices'] = array();
if (!empty($field['value'])) {
$terms = $this->get_terms($field['value'], $field['taxonomy']);
if (!empty($terms)) {
foreach (array_keys($terms) as $i) {
$term = acf_extract_var($terms, $i);
$field['choices'][$term->term_id] = $this->get_term_title($term, $field);
}
}
}
acf_render_field($field);
}
function render_field_checkbox($field)
{
acf_hidden_input(array('type' => 'hidden', 'name' => $field['name']));
if ($field['field_type'] == 'checkbox') {
$field['name'] .= '[]';
}
$taxonomy_obj = get_taxonomy($field['taxonomy']);
acf_include('includes/walkers/class-acf-walker-taxonomy-field.php');
$args = array('taxonomy' => $field['taxonomy'], 'show_option_none' => sprintf(_x('No %s', 'No terms', 'acf'), strtolower($taxonomy_obj->labels->name)), 'hide_empty' => false, 'style' => 'none', 'walker' => new ACF_Taxonomy_Field_Walker($field));
$args = apply_filters('acf/fields/taxonomy/wp_list_categories', $args, $field);
$args = apply_filters('acf/fields/taxonomy/wp_list_categories/name=' . $field['_name'], $args, $field);
$args = apply_filters('acf/fields/taxonomy/wp_list_categories/key=' . $field['key'], $args, $field);
?>
<div class="categorychecklist-holder">
<ul class="acf-checkbox-list acf-bl">
<?php
wp_list_categories($args);
?>
</ul>
</div>
<?php
}
function render_field_settings($field)
{
acf_render_field_setting($field, array('label' => __('Taxonomy', 'acf'), 'instructions' => __('Select the taxonomy to be displayed', 'acf'), 'type' => 'select', 'name' => 'taxonomy', 'choices' => acf_get_taxonomy_labels()));
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(__('Multiple Values', 'acf') => array('checkbox' => __('Checkbox', 'acf'), 'multi_select' => __('Multi Select', 'acf')), __('Single Value', 'acf') => array('radio' => __('Radio Buttons', 'acf'), 'select' => _x('Select', 'noun', 'acf')))));
acf_render_field_setting($field, array('label' => __('Allow Null?', 'acf'), 'instructions' => '', 'name' => 'allow_null', 'type' => 'true_false', 'ui' => 1, 'conditions' => array('field' => 'field_type', 'operator' => '!=', 'value' => 'checkbox')));
acf_render_field_setting($field, array('label' => __('Create Terms', 'acf'), 'instructions' => __('Allow new terms to be created whilst editing', 'acf'), 'name' => 'add_term', 'type' => 'true_false', 'ui' => 1));
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));
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));
acf_render_field_setting($field, array('label' => __('Return Value', 'acf'), 'instructions' => '', 'type' => 'radio', 'name' => 'return_format', 'choices' => array('object' => __('Term Object', 'acf'), 'id' => __('Term ID', 'acf')), 'layout' => 'horizontal'));
}
function ajax_add_term()
{
$args = wp_parse_args($_POST, array('nonce' => '', 'field_key' => '', 'term_name' => '', 'term_parent' => ''));
if (!acf_verify_ajax()) {
die;
}
$field = acf_get_field($args['field_key']);
if (!$field) {
die;
}
$taxonomy_obj = get_taxonomy($field['taxonomy']);
$taxonomy_label = $taxonomy_obj->labels->singular_name;
if (!current_user_can($taxonomy_obj->cap->manage_terms)) {
wp_send_json_error(array('error' => sprintf(__('User unable to add new %s', 'acf'), $taxonomy_label)));
}
if ($args['term_name']) {
if (term_exists($args['term_name'], $field['taxonomy'], $args['term_parent'])) {
wp_send_json_error(array('error' => sprintf(__('%s already exists', 'acf'), $taxonomy_label)));
}
$extra = array();
if ($args['term_parent']) {
$extra['parent'] = (int) $args['term_parent'];
}
$data = wp_insert_term($args['term_name'], $field['taxonomy'], $extra);
if (is_wp_error($data)) {
wp_send_json_error(array('error' => $data->get_error_message()));
}
$term = get_term($data['term_id']);
$prefix = '';
$ancestors = get_ancestors($term->term_id, $term->taxonomy);
if (!empty($ancestors)) {
$prefix = str_repeat('- ', count($ancestors));
}
wp_send_json_success(array('message' => sprintf(__('%s added', 'acf'), $taxonomy_label), 'term_id' => $term->term_id, 'term_name' => $term->name, 'term_label' => $prefix . $term->name, 'term_parent' => $term->parent));
}
?>
<form method="post">
<?php
acf_render_field_wrap(array('label' => __('Name', 'acf'), 'name' => 'term_name', 'type' => 'text'));
if (is_taxonomy_hierarchical($field['taxonomy'])) {
$choices = array();
$response = $this->get_ajax_query($args);
if ($response) {
foreach ($response['results'] as $v) {
$choices[$v['id']] = $v['text'];
}
}
acf_render_field_wrap(array('label' => __('Parent', 'acf'), 'name' => 'term_parent', 'type' => 'select', 'allow_null' => 1, 'ui' => 0, 'choices' => $choices));
}
?>
<p class="acf-submit">
<button class="acf-submit-button button button-primary" type="submit"><?php
_e('Add', 'acf');
?></button>
</p>
</form><?php
die;
}
}
acf_register_field_type('acf_field_taxonomy');
}