false ); if ( ! isset( $field['options']['args'] ) ) $field['options']['args'] = $default_args; else $field['options']['args'] = wp_parse_args( $field['options']['args'], $default_args ); // Show field as checkbox list by default if ( ! isset( $field['options']['type'] ) ) $field['options']['type'] = 'checkbox_list'; // If field is shown as checkbox list, add multiple value if ( in_array( $field['options']['type'], array( 'checkbox_list', 'checkbox_tree', 'select_tree' ) ) ) { $field['multiple'] = true; $field['field_name'] = "{$field['id']}[]"; } if ( in_array( $field['options']['type'], array( 'checkbox_tree', 'select_tree' ) ) ) { if ( isset( $field['options']['args']['parent'] ) ) { $field['options']['parent'] = $field['options']['args']['parent']; unset( $field['options']['args']['parent'] ); } else { $field['options']['parent'] = 0; } } return $field; } /** * Get field HTML * * @param $html * @param $field * @param $meta * * @return string */ static function html( $html, $meta, $field ) { $options = $field['options']; $terms = get_terms( $options['taxonomy'], $options['args'] ); $html = ''; // Checkbox LIST if ( 'checkbox_list' === $options['type'] ) { $html = array(); foreach ( $terms as $term ) { $checked = checked( in_array( $term->slug, $meta ), true, false ); $html[] = ""; } $html = implode( '
', $html ); } // Checkbox TREE elseif ( 'checkbox_tree' === $options['type'] ) { $elements = self::process_terms( $terms ); $html .= self::walk_checkbox_tree( $meta, $field, $elements, $field['options']['parent'], true ); } // Select Tree elseif ( 'select_tree' == $options['type'] ) { $elements = self::process_terms( $terms ); $html .= self::walk_select_tree( $meta, $field, $elements, $field['options']['parent'], '', true ); } // Select else { $multiple = $field['multiple'] ? " multiple='multiple' style='height: auto;'" : "'"; $html .= ""; } return $html; } /** * Walker for displaying checkboxes in treeformat * * @param $meta * @param $field * @param $elements * @param int $parent * @param bool $active * * @return string */ static function walk_checkbox_tree( $meta, $field, $elements, $parent = 0, $active = false ) { if(!isset($elements[$parent])) return; $terms = $elements[$parent]; $hidden = ( !$active ? 'hidden' : '' ); $html = ""; return $html; } /** * Walker for displaying select in treeformat * * @param $meta * @param $field * @param $elements * @param int $parent * @param string $parent_slug * @param bool $active * * @return string */ static function walk_select_tree( $meta, $field, $elements, $parent = 0, $parent_slug='', $active = false ) { if ( ! isset( $elements[$parent] ) ) return; $terms = $elements[$parent]; $hidden = ( ! $active ? 'disabled' : 'active' ); $disabled = disabled( $active, false, false ); $multiple = $field['multiple'] ? " multiple='multiple' style='height: auto;'" : "'"; $id = ''; if ( ! empty( $parent_slug ) ) { $id = "id='rwmb-taxonomy-{$parent_slug}'"; } $html = "
"; $html .= ""; foreach ( $terms as $term ) { $html .= self::walk_select_tree( $meta, $field, $elements, $term->term_id, $term->slug, ( in_array( $term->slug, $meta ) ) && $active ) . ""; } $html .= "
"; return $html; } /** * Processes terms into indexed array for walker functions * * @param $terms * * @internal param $field * @return array */ static function process_terms( $terms ) { $elements = array(); foreach ( $terms as $term ) { $elements[$term->parent][] = $term; } return $elements; } /** * Save post taxonomy * * @param $post_id * @param $field * @param $old * * @param $new */ static function save( $new, $old, $post_id, $field ) { wp_set_object_terms( $post_id, $new, $field['options']['taxonomy'] ); } /** * Standard meta retrieval * * @param mixed $meta * @param int $post_id * @param array $field * @param bool $saved * * @return mixed */ static function meta( $meta, $post_id, $saved, $field ) { $options = $field['options']; $meta = wp_get_post_terms( $post_id, $options['taxonomy'] ); $meta = is_array( $meta ) ? $meta : (array) $meta; $meta = wp_list_pluck( $meta, 'slug' ); return $meta; } } // END Class RWMB_Taxonomy_Field } // endif; /** * Register meta boxes * * @return void */ function PREFIX_register_meta_boxes() { if ( ! class_exists( 'RW_Meta_Box' ) ) return; $prefix = 'YOUR_PREFIX_'; $tax_box = array( 'id' => 'taxonomy-test', 'title' => 'Taxonomy Test', 'fields' => array( // Taxonomy array( 'name' => 'Categories', 'id' => "{$prefix}cats", 'type' => 'taxonomy', 'options' => array( // Taxonomy name 'taxonomy' => 'category', // How to show taxonomy: 'checkbox_list' (default) or 'checkbox_tree', 'select_tree' or 'select'. Optional 'type' => 'checkbox_tree', // Additional arguments for get_terms() function 'args' => array() ), 'desc' => 'Choose One Category' ) ) ); new RW_Meta_Box( $tax_box ); } add_action( 'admin_init', 'PREFIX_register_meta_boxes' );