id = $id;
$this->taxonomy = $taxonomy;
$this->nonce = $this->id . '_nonce';
if ( is_array( $this->taxonomy ) ) {
foreach ( $this->taxonomy as $tax_slug ) {
// Print Taxonomy fields
add_action( $tax_slug . '_add_form_fields', array( $this, 'add_view' ) );
add_action( $tax_slug . '_edit_form_fields', array( $this, 'edit_view' ) );
// Delete term fields
add_action( 'delete_' . $tax_slug, array( $this, 'delete_fields' ) );
// Save term fields
add_action( 'create_' . $tax_slug, array( $this, 'save' ) );
add_action( 'edit_' . $tax_slug, array( $this, 'save' ) );
}
} else {
// Print Taxonomy fields
add_action( $this->taxonomy . '_add_form_fields', array( $this, 'add_view' ) );
add_action( $this->taxonomy . '_edit_form_fields', array( $this, 'edit_view' ) );
// Delete term fields
add_action( 'delete_' . $this->taxonomy, array( $this, 'delete_fields' ) );
// Save term fields
add_action( 'create_' . $this->taxonomy, array( $this, 'save' ) );
add_action( 'edit_' . $this->taxonomy, array( $this, 'save' ) );
}
// Load scripts.
add_action( 'admin_enqueue_scripts', array( $this, 'scripts' ) );
}
/**
* Load user meta scripts.
*
* @return void
*/
public function scripts() {
// jQuery
wp_enqueue_script( 'jquery' );
// Color Picker.
wp_enqueue_style( 'wp-color-picker' );
wp_enqueue_script( 'wp-color-picker' );
// Media Upload.
wp_enqueue_media();
// jQuery UI.
wp_enqueue_script( 'jquery-ui-sortable' );
// user_meta.
wp_enqueue_script( 'odin-admin', get_template_directory_uri() . '/core/assets/js/admin.js', array( 'jquery' ), null, true );
wp_enqueue_style( 'odin-admin', get_template_directory_uri() . '/core/assets/css/admin.css', array(), null, 'all' );
// Localize strings.
wp_localize_script(
'odin-admin',
'odinAdminParams',
array(
'galleryTitle' => __( 'Add images in gallery', 'avalon-b' ),
'galleryButton' => __( 'Add in gallery', 'avalon-b' ),
'galleryRemove' => __( 'Remove image', 'avalon-b' ),
'uploadTitle' => __( 'Choose a file', 'avalon-b' ),
'uploadButton' => __( 'Add file', 'avalon-b' ),
)
);
}
/**
* Set user meta fields.
*
* @param array $fields User meta fields.
*
* @return void
*/
public function set_fields( $fields = array() ) {
$this->fields = $fields;
}
/**
* User meta view for add term page (without a table)
*
* @return string User meta HTML fields.
*/
public function add_view() {
// Use nonce for verification.
wp_nonce_field( basename( __FILE__ ), $this->nonce );
foreach ( $this->fields as $field ) {
echo '
';
}
}
/**
* User meta view for edit page (inside a table).
*
* @return string User meta HTML fields.
*/
public function edit_view() {
// Use nonce for verification.
wp_nonce_field( basename( __FILE__ ), $this->nonce );
foreach ( $this->fields as $field ) {
echo '';
echo sprintf( '%s ', $field['id'], $field['label'] );
echo apply_filters( 'odin_term_meta_field_edit_screen_before_' . $this->id, '', $field );
$this->process_fields( $field );
if ( isset( $field['description'] ) ) {
echo sprintf( '%s
', $field['description'] );
}
echo apply_filters( 'odin_term_meta_field_edit_screen__after_' . $this->id, ' ', $field );
echo ' ';
}
echo '';
}
/**
* Delete fields
*
* @param int $term Term id
* @param int $tt_id Taxonomy term id
* @param mixed $deleted_term $deleted_term Copy of the already-deleted term, in the form specified
* by the parent function. WP_Error otherwise.
* @return void
*/
public function delete_fields( $term, $tt_id = null, $deleted_term = null ) {
global $wpdb;
$option = sprintf( 'odin_term_meta_%s', $term );
$option = '%' . $wpdb->esc_like( $option ) . '%';
$wpdb->get_results(
$wpdb->prepare(
"
DELETE
FROM $wpdb->options
WHERE option_name
LIKE %s
",
$option
)
);
}
/**
* Get field value
*
* @param string $field Field name
*
* @return string Field value
*/
protected function get_value( $id, $field ) {
$option = sprintf( 'odin_term_meta_%s_%s', $id, $field );
return get_option( $option );
}
/**
* Process the user meta fields.
*
* @param array $args Field arguments
* @param int $user_id ID of the current post type.
*
* @return string HTML of the field.
*/
protected function process_fields( $args ) {
$id = $args['id'];
$type = $args['type'];
$options = isset( $args['options'] ) ? $args['options'] : '';
$attrs = isset( $args['attributes'] ) ? $args['attributes'] : array();
// Gets current value or default.
if( isset( $_GET['tag_ID'] ) ) {
$current = $this->get_value( $_GET['tag_ID'], $id );
if ( ! $current ) {
$current = isset( $args['default'] ) ? $args['default'] : '';
}
}
else {
$current = isset( $args['default'] ) ? $args['default'] : '';
}
switch ( $type ) {
case 'text':
$this->field_input( $id, $current, array_merge( array( 'class' => 'regular-text' ), $attrs ) );
break;
case 'input':
$this->field_input( $id, $current, $attrs );
break;
case 'textarea':
$this->field_textarea( $id, $current, $attrs );
break;
case 'checkbox':
$this->field_checkbox( $id, $current, $attrs );
break;
case 'select':
$this->field_select( $id, $current, $options, $attrs );
break;
case 'radio':
$this->field_radio( $id, $current, $options, $attrs );
break;
case 'editor':
$this->field_editor( $id, $current, $options );
break;
case 'color':
$this->field_input( $id, $current, array_merge( array( 'class' => 'odin-color-field' ), $attrs ) );
break;
case 'upload':
$this->field_upload( $id, $current, $attrs );
break;
case 'image':
$this->field_image( $id, $current );
break;
case 'image_plupload':
$this->field_image_plupload( $id, $current );
break;
default:
do_action( 'odin_user_meta_field_' . $this->id, $type, $id, $current, $options, $attrs );
break;
}
}
/**
* Build field attributes.
*
* @param array $attrs Attributes as array.
*
* @return string Attributes as string.
*/
protected function build_field_attributes( $attrs ) {
$attributes = '';
if ( ! empty( $attrs ) ) {
foreach ( $attrs as $key => $attr ) {
$attributes .= ' ' . $key . '="' . $attr . '"';
}
}
return $attributes;
}
/**
* Input field.
*
* @param string $id Field id.
* @param string $current Field current value.
* @param array $attrs Array with field attributes.
*
* @return string HTML of the field.
*/
protected function field_input( $id, $current, $attrs ) {
if ( ! isset( $attrs['type'] ) ) {
$attrs['type'] = 'text';
}
echo sprintf( ' ', $id, esc_attr( $current ), $this->build_field_attributes( $attrs ) );
}
/**
* Textarea field.
*
* @param string $id Field id.
* @param string $current Field current value.
* @param array $attrs Array with field attributes.
*
* @return string HTML of the field.
*/
protected function field_textarea( $id, $current, $attrs ) {
if ( ! isset( $attrs['cols'] ) ) {
$attrs['cols'] = '60';
}
if ( ! isset( $attrs['rows'] ) ) {
$attrs['rows'] = '5';
}
echo sprintf( ' ', $id, esc_attr( $current ), $this->build_field_attributes( $attrs ) );
}
/**
* Checkbox field.
*
* @param string $id Field id.
* @param string $current Field current value.
* @param array $attrs Array with field attributes.
*
* @return string HTML of the field.
*/
protected function field_checkbox( $id, $current, $attrs ) {
echo sprintf( ' ', $id, checked( 1, $current, false ), $this->build_field_attributes( $attrs ) );
}
/**
* Select field.
*
* @param string $id Field id.
* @param string $current Field current value.
* @param array $options Array with select options.
* @param array $attrs Array with field attributes.
*
* @return string HTML of the field.
*/
protected function field_select( $id, $current, $options, $attrs ) {
// If multiple add a array in the option.
$multiple = ( in_array( 'multiple', $attrs ) ) ? '[]' : '';
$html = sprintf( '', $id, $multiple, $this->build_field_attributes( $attrs ) );
foreach ( $options as $key => $label ) {
$html .= sprintf( '%s ', $key, selected( $current, $key, false ), $label );
}
$html .= ' ';
echo $html;
}
/**
* Radio field.
*
* @param string $id Field id.
* @param string $current Field current value.
* @param array $options Array with input options.
* @param array $attrs Array with field attributes.
*
* @return string HTML of the field.
*/
protected function field_radio( $id, $current, $options, $attrs ) {
$html = '';
foreach ( $options as $key => $label ) {
$html .= sprintf( ' %4$s ', $id, $key, checked( $current, $key, false ), $label, $this->build_field_attributes( $attrs ) );
}
echo $html;
}
/**
* Editor field.
*
* @param string $id Field id.
* @param string $current Field current value.
* @param array $options Array with wp_editor options.
*
* @return string HTML of the field.
*/
protected function field_editor( $id, $current, $options ) {
// Set default options.
if ( empty( $options ) ) {
$options = array( 'textarea_rows' => 10 );
}
$options[ 'textarea_name' ] = $id;
echo '';
wp_editor( wpautop( $current ), $id, $options );
echo '
';
}
/**
* Upload field.
*
* @param string $id Field id.
* @param string $current Field current value.
* @param array $attrs Array with field attributes.
*
* @return string HTML of the field.
*/
protected function field_upload( $id, $current, $attrs ) {
echo sprintf( ' ', $id, esc_url( $current ), __( 'Select file', 'avalon-b' ), $this->build_field_attributes( $attrs ) );
}
/**
* Image field.
*
* @param string $id Field id.
* @param string $current Field current value.
*
* @return string HTML of the field.
*/
protected function field_image( $id, $current ) {
// Gets placeholder image.
$image = get_template_directory_uri() . '/core/assets/images/placeholder.png';
$html = '';
$html .= '
' . $image . ' ';
if ( $current ) {
$image = wp_get_attachment_image_src( $current, 'thumbnail' );
$image = $image[0];
}
$html .= sprintf( '
', $id, $current, $image, __( 'Select image', 'avalon-b' ), __( 'Remove image', 'avalon-b' ) );
$html .= '
';
$html .= '
';
echo $html;
}
/**
* Image plupload field.
*
* @param string $id Field id.
* @param string $current Field current value.
*
* @return string HTML of the field.
*/
protected function field_image_plupload( $id, $current ) {
$html = '';
$html .= '
';
if ( ! empty( $current ) ) {
// Gets the current images.
$attachments = array_filter( explode( ',', $current ) );
if ( $attachments ) {
foreach ( $attachments as $attachment_id ) {
$html .= sprintf( '%2$s ',
$attachment_id,
wp_get_attachment_image( $attachment_id, 'thumbnail' ),
__( 'Remove image', 'avalon-b' )
);
}
}
}
$html .= '
';
// Adds the hidden input.
$html .= sprintf( '
', $id, $current );
// Adds "adds images in gallery" url.
$html .= sprintf( '
%s
', __( 'Add images in gallery', 'avalon-b' ) );
$html .= '
';
echo $html;
}
/**
* Save term meta data.
*
* @param int $term_id Field id.
* @param int $tt_id Term taxonomy ID.
*
* @return void
*/
public function save( $term_id, $tt_id = null ) {
// Verify nonce.
if ( ! isset( $_POST[ $this->nonce ] ) || ! wp_verify_nonce( $_POST[ $this->nonce ], basename( __FILE__ ) ) ) {
return '';
}
foreach ( $this->fields as $field ) {
$name = $field['id'];
$old = $this->get_value( $term_id, $name );
$new = apply_filters( 'odin_save_term_meta_' . $this->id, $_POST[ $name ], $name );
$option = sprintf( 'odin_term_meta_%s_%s', $term_id, $name );
if ( $new && $new != $old ) {
update_option( $option, $new );
} elseif ( '' == $new && $old ) {
delete_option( $option );
}
}
}
}