* @copyright Copyright (c) 2012 - 2017, Cherry Team
* @link http://www.cherryframework.com/
* @license http://www.gnu.org/licenses/gpl-3.0.html
*/
// If this file is called directly, abort.
if ( ! defined( 'WPINC' ) ) {
die;
}
if ( ! class_exists( 'Cherry_Term_Meta' ) ) {
/**
* Term meta management module
*/
class Cherry_Term_Meta {
/**
* Module slug
*
* @var string
*/
public $module_slug = 'cherry-term-meta';
/**
* Module arguments
*
* @var array
*/
public $args = array();
/**
* Existing field types
*
* @var array
*/
public $field_types = array();
/**
* UI builder instance
*
* @var object
*/
public $ui_builder = null;
/**
* Already registered field.
*
* @since 1.0.2
* @var array
*/
static public $register_fields = array();
/**
* Core instance
*
* @var object
*/
public $core = null;
/**
* Constructor for the module
*/
function __construct( $core, $args ) {
$this->core = $core;
$this->args = wp_parse_args( $args, array(
'tax' => 'category',
'priority' => 10,
'fields' => array(),
) );
if ( empty( $this->args['fields'] ) ) {
return;
}
add_action( 'admin_enqueue_scripts', array( $this, 'init_ui' ), 1 );
$priority = intval( $this->args['priority'] );
$tax = esc_attr( $this->args['tax'] );
add_action( "{$tax}_add_form_fields", array( $this, 'render_add_fields' ), $priority );
add_action( "{$tax}_edit_form_fields", array( $this, 'render_edit_fields' ), $priority, 2 );
add_action( "created_{$tax}", array( $this, 'save_meta' ) );
add_action( "edited_{$tax}", array( $this, 'save_meta' ) );
}
/**
* Init UI builder.
*
* @since 1.0.0
* @return bool
*/
public function init_ui() {
global $current_screen;
if ( empty( $current_screen ) || ! in_array( $current_screen->base, array( 'edit-tags', 'term' ) ) ) {
return false;
}
array_walk( $this->args['fields'], array( $this, 'set_field_types' ) );
if ( in_array( 'slider', $this->field_types ) ) {
$this->field_types[] = 'stepper';
}
$this->ui_builder = $this->core->init_module( 'cherry-ui-elements', $this->field_types );
return true;
}
/**
* Render add term form fields
*
* @since 1.0.0
* @param [type] $taxonomy taxonomy name.
* @return void
*/
public function render_add_fields( $taxonomy ) {
$format = '
%s
';
echo $this->get_fields( false, $taxonomy, $format );
}
/**
* Render edit term form fields
*
* @since 1.0.0
* @param object $term current term object.
* @param [type] $taxonomy taxonomy name.
* @return void
*/
public function render_edit_fields( $term, $taxonomy ) {
$format = '| | %s |
';
echo $this->get_fields( $term, $taxonomy, $format );
}
/**
* Get registered control fields
*
* @since 1.0.0
* @param mixed $term current term object.
* @param [type] $taxonomy current taxonomy name.
* @return string
*/
public function get_fields( $term, $taxonomy, $format = '%s' ) {
$result = '';
foreach ( $this->args['fields'] as $key => $field ) {
if ( in_array( $key, Cherry_Term_Meta::$register_fields ) ) {
continue;
} else {
Cherry_Term_Meta::$register_fields[] = $key;
}
if ( false !== $term ) {
$value = get_term_meta( $term->term_id, $key, true );
} else {
$value = '';
}
$value = ! empty( $value ) ? $value : Cherry_Toolkit::get_arg( $field, 'value', '' );
if ( isset( $field['options_callback'] ) ) {
$options = call_user_func( $field['options_callback'] );
} else {
$options = Cherry_Toolkit::get_arg( $field, 'options', array() );
}
$args = array(
'type' => Cherry_Toolkit::get_arg( $field, 'type', 'text' ),
'id' => $key,
'name' => $key,
'value' => $value,
'label' => Cherry_Toolkit::get_arg( $field, 'label', '' ),
'options' => $options,
'multiple' => Cherry_Toolkit::get_arg( $field, 'multiple', false ),
'filter' => Cherry_Toolkit::get_arg( $field, 'filter', false ),
'size' => Cherry_Toolkit::get_arg( $field, 'size', 1 ),
'null_option' => Cherry_Toolkit::get_arg( $field, 'null_option', 'None' ),
'multi_upload' => Cherry_Toolkit::get_arg( $field, 'multi_upload', true ),
'library_type' => Cherry_Toolkit::get_arg( $field, 'library_type', 'image' ),
'upload_button_text' => Cherry_Toolkit::get_arg( $field, 'upload_button_text', 'Choose' ),
'max_value' => Cherry_Toolkit::get_arg( $field, 'max_value', '100' ),
'min_value' => Cherry_Toolkit::get_arg( $field, 'min_value', '0' ),
'max' => Cherry_Toolkit::get_arg( $field, 'max', '100' ),
'min' => Cherry_Toolkit::get_arg( $field, 'min', '0' ),
'step_value' => Cherry_Toolkit::get_arg( $field, 'step_value', '1' ),
'style' => Cherry_Toolkit::get_arg( $field, 'style', 'normal' ),
'display_input' => Cherry_Toolkit::get_arg( $field, 'display_input', true ),
'controls' => Cherry_Toolkit::get_arg( $field, 'controls', array() ),
'fields' => Cherry_Toolkit::get_arg( $field, 'fields', array() ),
'auto_parse' => Cherry_Toolkit::get_arg( $field, 'auto_parse', false ),
'icon_data' => Cherry_Toolkit::get_arg( $field, 'icon_data', array() ),
'toggle' => Cherry_Toolkit::get_arg( $field, 'toggle', array(
'true_toggle' => 'On',
'false_toggle' => 'Off',
'true_slave' => '',
'false_slave' => '',
) ),
'class' => Cherry_Toolkit::get_arg( $field, 'class' ),
'required' => Cherry_Toolkit::get_arg( $field, 'required', false ),
'placeholder' => Cherry_Toolkit::get_arg( $field, 'placeholder' ),
'master' => Cherry_Toolkit::get_arg( $field, 'master' ),
'title_field' => Cherry_Toolkit::get_arg( $field, 'title_field' ),
'ui_kit' => Cherry_Toolkit::get_arg( $field, 'ui_kit', true ),
);
$current_element = $this->ui_builder->get_ui_element_instance( $args['type'], $args );
$result .= sprintf( $format, $current_element->render() );
}
return $result;
}
/**
* Store field types used in this widget into class property
*
* @since 1.0.0
* @param array $field field data.
* @param [type] $id field key.
* @return bool
*/
public function set_field_types( $field, $id ) {
if ( is_array( $field ) || ! isset( $field['type'] ) ) {
return false;
}
if ( ! in_array( $field['type'], $this->field_types ) ) {
$this->field_types[] = $field['type'];
}
return true;
}
/**
* Save additional taxonomy meta on edit or create tax
*
* @since 1.0.0
* @param int $term_id Term ID.
* @return bool
*/
public function save_meta( $term_id ) {
if ( ! current_user_can( 'edit_posts' ) ) {
return false;
}
foreach ( $this->args['fields'] as $key => $field ) {
if ( ! isset( $_POST[ $key ] ) ) {
continue;
}
if ( is_array( $_POST[ $key ] ) ) {
$new_val = array_filter( $_POST[ $key ] );
} else {
$new_val = esc_attr( $_POST[ $key ] );
}
update_term_meta( $term_id, $key, $new_val );
}
return true;
}
/**
* Returns the instance.
*
* @since 1.0.0
* @return object
*/
public static function get_instance( $core, $args ) {
return new self( $core, $args );
}
}
}